МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Інститут прикладної математики та фундаментальних наук
Кафедра прикладної математики
Звіт
про виконання лабораторної роботи №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, тим точніший результат буде розв’язку.