1. Метод ділення навпіл (метод дихотомії або бісекції

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Інститут прикладної математики та фундаментальних наук
Факультет:
РТ
Кафедра:
Кафедра прикладної математики

Інформація про роботу

Рік:
2016
Тип роботи:
Звіт про виконання лабораторної роботи
Предмет:
Чисельні методи
Група:
ПМ-32

Частина тексту файла (без зображень, графіків і формул):

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА” Інститут прикладної математики та фундаментальних наук Кафедра прикладної математики Звіт про виконання лабораторної роботи №2(а) з предмету «Чисельні методи ч.1. ЧИСЕЛЬНЕ РОЗВ’ЯЗУВАННЯ НЕЛІНІЙНИХ РІВНЯНЬ» Тема:” 1. Метод ділення навпіл (метод дихотомії або бісекції)” Варіант - 6 Львів-2016 Тема: Розв’язування СЛАР методом Якобі Мета: Навчитися розв’язувати СЛАР методом Якобі. Вираховувати нев’язку для розв’язків СЛАР. Вміти оцінювати точність розв’язку в залежності від заданої точності. Розв’язання: Написати програму, яка розв’язує СЛАР методом Якобі Для виконання цього завдання я вибрав мову програмування Java. Для eps = 10-3 // Нев’язка: X1 = 4.459330031452694 X2 = 5.243152453283801 X3 = -6.850516537254446 X4 = 3.3423337946593787 X5 = 1.9195762987189142 Для eps = 10-5 / Нев’язка: X1 = 4.459446586863894 X2 = 5.243240584117053 X3 = -6.850374831893525 X4 = 3.342310064905739 X5 = 1.919584468261105 Теоретичний матеріал: Ітераційні методи або ж методи ітерацій розв'язування СЛАР — наближені методи розв'язку проблеми знаходження власних значень та власних векторів (що еквівалентно розв'язку СЛАР), які базуються на покроковому наближені (знаходження по наближеному значенню величини наступного наближення) до їх точних значень, минуючи вичислення характеристичного многочлена. Ітераційні методи дозволяють отримати значення коренів системи із заданою точністю у вигляді границі послідовності деяких векторів (ітераційний процес). Характер збіжності і сам факт збіжності методу залежить від вибору початкового (нульового) наближення. Ці методи є чисельними, вони суттєво відрізняються для матриць середнього і великого розміру, бо методи для невеликих матриць зазвичай є такими, що руйнують розрідженість матриць (її заповненість в основному нулями), відтак такі матриці більше не можуть бути збережені в пам'яті обчислювальної машини компактно. Програмна реалізація: //Main_Window.java package gui; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.FlowLayout; import java.awt.Font; import java.awt.GridLayout; import java.util.ArrayList; import java.util.Arrays; import javax.swing.ImageIcon; import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.SwingConstants; import javax.swing.border.Border; import javax.swing.JMenu; import javax.swing.SpringLayout; import net.miginfocom.swing.MigLayout; import java.awt.Panel; import javax.swing.JButton; import java.awt.event.*; public class Main_Window { private JFrame frmIterationslar; private JPanel panel_main; private JPanel p_r; private Results res; private ArrayList<JTextField> A; private ArrayList<JTextField> F; int N=2; private double[][] A_double; private double epsilon=0.01; private int count_iter=0; private double nev[]; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { Main_Window window = new Main_Window(); window.frmIterationslar.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the application. */ public Main_Window() { initialize(); } /** * Initialize the contents of the frame. */ private void initialize() { frmIterationslar = new JFrame(); frmIterationslar.setTitle("Iteration(SLAR)"); frmIterationslar.setBounds(100, 100, 464, 214); frmIterationslar.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frmIterationslar.setIconImage(new ImageIcon(getClass().getResource("/images/main.png")).getImage()); panel_main=new JPanel(new BorderLayout()); JLabel zag=new JLabel("Solve SLAR by iteration method",JLabel.CENTER); zag.setFont(new Font("Serif",Font.BOLD,26)); panel_main.add(zag,BorderLayout.NORTH); dynamic_matrix(); JComboBox<Integer> list=new JComboBox<>(); for(int i=0;i<7;i++) {list.addItem(i+2); list.setActionCommand(String.valueOf(i+2)); } list.addActionListener(n-> { this.N=(Integer)list.getSelectedItem(); this.panel_main.remove(p_r); dynamic_matrix(); }); JPanel pp=new JPanel(new GridLayout(2,1)); JPanel p_west_1=new JPanel(); p_west_1.setLayout(new MigLayout("", "[92px][28px]", "[20px][]")); JLabel lab=new JLabel("Choose rozmirnist: "); p_west_1.add(lab, "cell 0 0,alignx left,aligny center");p_west_1.add(list, "cell 1 0,alignx left,aligny top"); pp.add(p_west_1); JLabel eps=new JLabel("Please enter epsilon: "); p_west_1.add(eps, "cell 0 1"); JTextField eps_field=new JTextField("0.01",5); p_west_1.add(eps_field, "cell 1 1"); panel_main.add(pp,BorderLayout.WEST); Panel panel = new Panel(); pp.add(panel); JButton Calculate = new JButton("Calculate"); panel.add(Calculate); A.stream().forEach(n-> n.addFocusListener(new FocusAdapter() { public void focusGained(FocusEvent e) { n.setBackground(Color.white); } })); F.stream().forEach(n-> n.addFocusListener(new FocusAdapter() { public void focusGained(FocusEvent e) { n.setBackground(Color.white); } })); eps_field.addFocusListener(new FocusAdapter() { public void focusGained(FocusEvent e) { eps_field.setBackground(Color.white); } }); Calculate.addActionListener(n_-> { A_double=new double[N][N+1]; System.out.println(N); for(int i=0;i<this.N;i++) for(int j=0;j<this.N;j++) { try{ A_double[i][j]=Double.valueOf(A.get(i*N+j).getText()); }catch(Exception e) { JOptionPane.showMessageDialog(frmIterationslar, "Something wrong with input","Error",JOptionPane.ERROR_MESSAGE); A.get(i*N+j).setBackground(Color.red); return; } } System.out.println("F:"); for(int i=0;i<N;i++){ try{ A_double[i][N]=Double.valueOf(F.get(i).getText()); } catch(Exception e) { JOptionPane.showMessageDialog(frmIterationslar, "Something wrong with input","Error",JOptionPane.ERROR_MESSAGE); F.get(i).setBackground(Color.red); return; } } try{ epsilon=Double.valueOf(eps_field.getText()); } catch(Exception e) { JOptionPane.showMessageDialog(frmIterationslar, "Something wrong with input","Error",JOptionPane.ERROR_MESSAGE); eps_field.setBackground(Color.red); return; } double [] res= iteration(); this.res=new Results(count_iter,res); this.res.frame.setVisible(true); }); frmIterationslar.getContentPane().add(panel_main); JMenuBar menuBar = new JMenuBar(); frmIterationslar.setJMenuBar(menuBar); JMenu mnView = new JMenu("View"); menuBar.add(mnView); JMenuItem mntmTable = new JMenuItem("Table"); mnView.add(mntmTable); JMenu mnControl = new JMenu("Control"); menuBar.add(mnControl); JMenu mnHelp = new JMenu("Help"); menuBar.add(mnHelp); JMenuItem mntmAbout = new JMenuItem("About"); mntmAbout.setIcon(new ImageIcon(Main_Window.class.getResource("/images/about.png"))); mnHelp.add(mntmAbout); } private void dynamic_matrix(){ GridLayout q=new GridLayout(N,1); q.setVgap(0); p_r=new JPanel(q); p_r.setAutoscrolls(false); q.setVgap(1); A=new ArrayList<>(N*N+1); System.out.println(A.size()); F=new ArrayList<>(N); for(int i=0;i<N;i++) { JPanel p=new JPanel(new FlowLayout()); p.setSize(new Dimension(40,50)); for(int j=0;j<N;j++) { JTextField m_a=new JTextField(5); A.add(m_a); p.add(A.get(A.size()-1)); if(j==N-1) p.add(new JLabel("x"+String.valueOf(j+1).toLowerCase())); else p.add(new JLabel("x"+String.valueOf(j+1).toLowerCase()+"+")); } p.add(new JLabel("=")); A.stream().forEach(n-> n.addFocusListener(new FocusAdapter() { public void focusGained(FocusEvent e) { n.setBackground(Color.white); } })); F.stream().forEach(n-> n.addFocusListener(new FocusAdapter() { public void focusGained(FocusEvent e) { n.setBackground(Color.white); } })); JTextField m_f=new JTextField(5); F.add(m_f); p.add(F.get(i)); p_r.add(p); } A.stream().forEach(n-> { n.setEditable(true); n.setText("0.0"); n.setHorizontalAlignment(JTextField.RIGHT); } ); F.stream().forEach(n-> { n.setEditable(true); n.setText("0.0"); n.setHorizontalAlignment(JTextField.RIGHT); } ); panel_main.add(p_r,BorderLayout.CENTER); p_r.revalidate(); } private double[] iteration() { double[] previousVariableValues = new double[N]; for (int i = 0; i < N; i++) previousVariableValues[i] = 0.0; while (true) { double[] currentVariableValues = new double[N]; for (int i = 0; i < N; i++) { currentVariableValues[i] = -A_double[i][N]/A_double[i][i]; for (int j = 0; j < i-1; j++) { currentVariableValues[i] += A_double[i][j] * previousVariableValues[j]/A_double[i][i]; } for (int j = i+1; j < N; j++) { currentVariableValues[i] += A_double[i][j] * previousVariableValues[j]/A_double[i][i]; } } double error = 0.0; for (int i = 0; i < N; i++) { error += Math.abs(currentVariableValues[i] - previousVariableValues[i]); } error/=N; count_iter++; if (error < epsilon) { nev=new double[N]; for(int i=0;i<N;i++) nev[i]=0.0; for(int i=0;i<N;i++) nev[i]+=A_double[i][N]; for(int i=0;i<N;i++) for(int j=0;j<N;j++) nev[i]-=A_double[i][j]*currentVariableValues[j]; System.out.println(); for(int i=0;i<N;i++) System.out.println("x"+String.valueOf(i)+" = "+nev[i]); break; } previousVariableValues = currentVariableValues; } return previousVariableValues; } } //results.java package gui; import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.FlowLayout; import java.awt.Font; import java.awt.GridLayout; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.SwingConstants; import net.miginfocom.swing.MigLayout; public class Results { public JFrame frame; private double[]res; private int count; public Results(int count,double[] res) { this.res=new double[res.length]; this.count=count; this.res=res; initialize(); } /** * Initialize the contents of the frame. */ private void initialize() { frame = new JFrame(); frame.setBounds(100, 100, 355, 195); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); JLabel l=new JLabel("Results"); for(double x: res) System.out.println(x+" "); l.setFont(new Font("TimesNewRoman",Font.BOLD,25)); l.setHorizontalAlignment(SwingConstants.CENTER); frame.add(l,BorderLayout.NORTH); JPanel center=new JPanel(new GridLayout(res.length,1)); for(int i=0;i<res.length;i++) { JPanel q=new JPanel(new FlowLayout()); JLabel lz=new JLabel("x"+(i+1)+"= "+String.valueOf(res[i])); q.add(lz); center.add(q); } frame.add(center,BorderLayout.CENTER); JLabel count_it=new JLabel("Count iteration "+String.valueOf(count)); frame.add(count_it,BorderLayout.EAST); } } Висновки: Зробивши програмну реалізацію методу Якобі для розв’язання СЛАР, можна зробити висновок, що метод Якобі є швидшим в плані кількості ітерацій за метод послідовних наближень. Він також дає точніший результат розв’язку СЛАР. Так само як і в методі ітераційних наближень чим менше задане epsilon, тим точніший результат буде розв’язку.
Антиботан аватар за замовчуванням

26.04.2016 19:04-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!