МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
ІКТА
кафедра „КОМП’ЮТЕРИЗОВАНІ СИСТЕМИ, АВТОМАТИКА І УПРАВЛІННЯ”
ЗВІТ
до лабораторної роботи № 4
З КУРСУ “Комп’ютерні методи дослідження систем керування”
на тему: „ СИСТЕМИ НЕЛІНІЙНИХ РІВНЯНЬ.
МЕТОД НЬЮТОНА ТА -АЛГОРИТМ ”
Варіант № 3
Мета роботи: ознайомитися з найпоширенішим ітераційним методом розв’язування систем нелінійних рівнянь – методом Ньютона та екстраполяційним методом – -алгоритмом.
Таблиця 1. Завдання до лабораторної роботи
№
п/п
Завдання
(метод та початкові наближення коренів)
відносна похибка у відсотках %,
для -алгоритму: ,
3
Метод Ньютона з кінцево-різницевою матрицею Якобі
(оберт. матриці методом Гауса з вибор. гол. ел-тів по всій матриці)
Таблиця 2. Системи нелінійних рівнянь
№3
поч. наближення
Блок-схема розробленої програми:
Список змінних, які використовуються в коді програми, та їх пояснення:
A[n][n] – матриця розмірністю 2*2;
x[n] = {1, 1}, x_old[n] = {1, 1}, J[n][n], ee,x_[2],f_[2],h=1e-6,INVERS[n][n], E[n][n], V[n][n], C[n][n], P[n], X[n], Y[n], f[n],inx[n], Scx, Sinvf; – змінні типу double;
i, j – змінні типу int;
Остаточна версія програми:
#include <vcl.h>
#pragma hdrstop
#include<math.h>
#define n 2
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void Func(double*x,double*f)
{
f[0]=pow(x[0],2)-pow(x[1],2)-0.1-x[0];
f[1]=2.0*x[1]*x[0]+0.1-x[1];
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
bool cond_N;
double x[n] = {1, 1}, x_old[n] = {1, 1}, J[n][n], ee,x_[2],f_[2],h=1e-6;
double INVERS[n][n], E[n][n], V[n][n], C[n][n], P[n], X[n], Y[n], f[n], inx[n];
ee=0.00001;
for (int i=0;i<n;i++)
for (int j=0;j<n;j++) //Ініціалізація одиничної матриці:
{
if(i==j)
E[i][j]=1;
else
E[i][j]=0;
}
do
{
cond_N=false;
Func(x,f);
for (int i=0;i<n;i++)
for (int j=0;j<n;j++)
{
for (int k=0;k<n;k++)
x_[k]=x[k];
x_[j]=x[j]+h;
Func(x_,f_);
J[i][j]=(f_[i]-f[i])/h;
}
double A[n][n], B[n];
for (int b=0;b<n;b++)
{
for (int i=0;i<n;i++)
inx[i]=i;
for (int i=0;i<n;i++) // Метод Гауса Прямий хід:
for (int j=0;j<n;j++)
{
V[i][j]=J[i][j];
P[i]=E[i][b];
}
for (int k=0;k<n;k++) //матричне сортування
{
Y[k]=P[k]/V[k][k];
for (int i=k+1;i<n;i++)
{
P[i]=P[i]-V[i][k]*Y[k];
for (int j=k+1;j<n;j++)
{
C[k][j]=V[k][j]/V[k][k];
V[i][j]=V[i][j]-V[i][k]*C[k][j];
}
}
}
X[n-1]=Y[n-1];
for (int i=n-2;i>=0;i--)
{ // обернений хід
double Scx=0;
for (int j=i+1;j<n;j++)
{
Scx=Scx+C[i][j]*X[j];
}
X[i]=Y[i]-Scx;
}
for (int i=0;i<n;i++)
INVERS[i][b]=X[i];
}
double Sinvf;
for (int i=0;i<n;i++)
{
Sinvf=0;
for (int j=0;j<n;j++)
Sinvf=Sinvf+INVERS[i][j]*f[j];
x[i]=x_old[i]-Sinvf;
}
for (int i=0;i<n;i++)
{
cond_N = cond_N || fabs((x[i]-x_old[i])/x[i])*100>ee;
x_old[i]=x[i];
}
}
while(cond_N);
Memo1->Lines->Add("Pозвязок системи рівнянь");
for(int i=0; i<n; i++)
Memo1->Lines->Add(x[i]);
Memo1->Lines->Add("Перевірка");
f[0]=pow(x[0],2)-pow(x[1],2)-0.1-x[0];
f[1]=2.0*x[1]*x[0]+0.1-x[1];
Memo1->Lines->Add(f[0]);
Memo1->Lines->Add(f[1]);
}
//------------------------------------------------------------------
Результат роботи програми:
Висновок: при виконанні лабораторної роботи я ознайомився з найпоширенішими ітераційними методами розв’язування систем нелінійних рівнянь – методом Ньютона та екстраполяційним методом, -алгоритмом.