МІНІСТЕРСТВО ОСВІТИ УКРАЇНИ
Національний університет “Львівська політехніка”
/
Звіт до лабораторної роботи №4
СИСТЕМИ НЕЛІНІЙНИХ РІВНЯНЬ.
МЕТОД НЬЮТОНА ТА -АЛГОРИТМ
З курсу
«Комп’ютерні методи дослідження систем керування»
Варіант №6
Виконав:
Ст. гр. СІ-22
Перевірив:
Львів-2009
Мета роботи:
ознайомитися з найпоширенішим ітераційним методом розв’язування систем нелінійних рівнянь – методом Ньютона та екстраполяційним методом – -алгоритмом.
Завдання:
№
п/п
Завдання
(метод та початкові наближення коренів)
відносна похибка у відсотках %,
для -алгоритму: ,
Група 1
Група 2
Група 3
6
Стандартний метод Ньютона
(оберт.матриці методом Гауса з вибор. гол. ел-тів по рядку )
Метод січних
(оберт.матриці методом Гауса з вибор. гол. ел-тів по стовпцю )
-алгоритм
№6
поч. наближення
Короткі теоретичні відомості:
/
Опис алгоритму
На початку алгоритму задаємо початкове наближення , для , та відносну похибку у відсотках.
Встановлюємо значення для одиничної матриці .
Обчислюємо значення елементів вектора функцій та елементів матриці Якобі .
Здійснюємо обертання матриці Якобі методом Гауса (з вибором головного елемента по рядку, стовпцю чи по всій матриці). Алгоритм обертання матриці методом Гауса наведено в інструкції до лабораторної роботи № 2. Єдиною модифікацією є (замість базової матриці беремо ).
Згідно ітераційної формули обчислюємо наступне наближення , для .
Здійснюємо перевірку умови збіжності. Якщо вона не виконується, то процес уточнення повторюємо (п.3).
Для перевірки вірності роботи алгоритму підставляємо наші знайдені значення в систему рівнянь . Значення функцій , для , мають бути близькими нулю, в залежності від вибраного значення .
Список ідентифікаторів, констант, змінних, функцій, методів, використаних у програмі та їх пояснення:
#include "math.h"- включення математичної бібліотеки;
x[2] – матриця-стовпець розв`язку системи рівнянь,
J[2][2] – матриця Якобі,
ee=0.0001 – константа, значення відносної похибки,
n=2– кількість рівнянь в системі,
V[2][2], C[2][2] – матриці, що використовуються при обертанні матриці Якобі,
Е – одинична матриця,
f [i] – вектор функцій,
pow – функція піднесення до степеня,
fabs – обчислення модуля
TForm1 *Form1 – глобальний показчик на форму;
exp – обчислення значення експоненти;
Текст програми:
//---------------------------------------------------------------------------
#include <vcl.h>
#include <math.h>
#pragma hdrstop
#include "Lab4_6.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
double x[2]={1,1}, x_old[2]={1,1}, J[2][2],f[2], ee=0.0001;
bool cond_N;
int n=2;
double INVERS[2][2], E[2][2],EE[2][2];
double V[2][2], C[2][2], P[2], X[2], Y[2];
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;
f[0]=x[0]/(pow(x[0],2)+pow(x[1],2))+0.4-x[0];
f[1]=-x[1]/(pow(x[0],2)+pow(x[1],2))+1.4-x[1];
J[0][0]=(pow(x[1],2)-pow(x[0],2))/pow((pow(x[1],2)+pow(x[0],2)),2)-1;
J[0][1]=-x[0]*2*x[1]/pow((pow(x[1],2)+pow(x[0],2)),2);
J[1][0]=x[1]*2*x[0]/pow((pow(x[1],2)+pow(x[0],2)),2);
J[1][1]=-(pow(x[0],2)-pow(x[1],2))/pow((pow(x[1],2)+pow(x[0],2)),2)-1;
for (int b=0; b<n; b++)
{
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]+=-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][k]*C[k][j];
}
}
}
X[n-1]=Y[n-1];
for (int i=n-2; i>=0; i--)
{
X[i]=0;
for (int j=i+1; j<n; j++)
X[i]+=C[i][j]*X[j];
X[i]=Y[i]-X[i];
}
for (int i=0; i<n;i++)
INVERS[i][b]=X[i];
}
for (int i=0; i<n; i++)
for (int j=0; j<n; j++)
{
EE[i][j]=0;
for (int k=0; k<n; k++)
EE[i][j]+=J[i][k]*INVERS[k][j];
}
for (int i=0; i<n; i++)
{
x[i]=0;
for (int j=0; j<n; j++)
x[i]+=INVERS[i][j]*f[j];
x[i]=x_old[i]-x[i];
}
for (int i=0; i<n; i++)
Memo1->Lines->Add(x[i]);
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("rozviazok sustemu");
for (int i=0; i<n; i++)
Memo1->Lines->Add(x[i]);
Memo1->Lines->Add("perevirka");
f[0]=x[0]/(pow(x[0],2)+pow(x[1],2))+0.4-x[0];
f[1]=-x[1]/(pow(x[0],2)+pow(x[1],2))+1.4-x[1];
Memo1->Lines->Add(f[0]);
Memo1->Lines->Add(f[1]);
}
//---------------------------------------------------------------------------
Результати роботи програми:
/