Смекни!
smekni.com

Системи нелінійних рівнянь (стр. 4 из 5)

Перевірка:

Модифіковані методи Ньютона

Приклад 2.5.1

Вектор-матриця заданої системи:

Матриця Λ

Розв’язок:

Приклад 2.5.2

Вводимо вектор-функцію системи рівнянь:

Функція iter(x,y) обчислює наближення до кореня за формулою Ньютона:

Функція norma(x,y,x1,y1) обчислює норму між поточним і наступним: наближенням:

Функція Newton(x,y,eps) знаходить розв’язок системи рівнянь з точність до ерs:

Початкове наближення х=0, у=-1, eps=0.001

Розв’язок системи:

2.2 Розв’язання систем нелінійних рівнянь у пакеті

Excel

Також систему нелінійних рівнянь можна розв’язати у пакеті Excel. Саме засіб Пошук рішення дозволяє знаходити рішення систем нелінійних рівнянь. Продемонструю, як це робиться на прикладі рішення наступної системи рівнянь:


Нагадаємо, що пари (х, у) є рішенням системи (*) тоді і тільки тоді, коли вона є рішенням наступного рівняння з двома невідомими:

(**)

За допомогою засобу Пошук рішення замість системи (*) треба розв‘язувати рівносильне їй рівняння (**). Помітимо, що геометрично розв‘язок система рівнянь (*) описують точки перетину прямої з колом, радіус якого дорівнює (≈2,236). Отже, рівняння (**) має не більш двох різних розв‘язків.

Знайдений засобом Пошук рішення розв‘язок нелінійної задачі залежить від початкового наближення. Тому істотним є вдалий його підбір. У даному випадку локалізувати корені можна, наприклад, протабулювавши ліву частину рівняння (**) по змінних х і у на інтервалі [-2,25; 2,25] із кроком 0.5. Вибір проміжків табуляції визначаються величиною радіуса кола, що дорівнює (≈2,236), а корені рівняння лежать усередині цього кола.

Виконаєте наступні кроки:

1. В чарунки діапазонів А2:А11 і B1:К1 уведіть значення змінних х та у, відповідно, використовуючи команду Правка│Заповнити│Прогресія.

2. В чарунку В2 введіть формулу

=($А2^2+У$1^2-5)^2+(5*$А2-4*B$1-1)^2, яка дає результат обчислення значення правої частини рівняння (**) при значеннях х и у з чарунок А2 і B1, відповідно.

3. Виберіть чарунку В2, розташуєте покажчик миші на маркері заповнення і заповните діапазон В2:К11.

Рис. 3.1 - Результат табуляції лівої частини рівняння (**) і діалогове вікно Пошук рішення

Отже, права частина рівняння протабульована. З рис. 5.15 видно, що за початкове наближення до коренів можна взяти ті значення, що виділені кольором.

Тепер можна зробити підготовчу роботу перш, ніж знайти корені за допомогою засобу Пошук рішення.

1. Відведіть чарунки А16:В16 під невідомі х и у для знаходження першого кореня, а А17:В17 — для знаходження другого кореня.

2. Уведіть відповідні значення змінних і розрахункові формули в чарунки А16:С16 і А17:С17

3. Виберіть команду Сервіс | Пошук рішення і заповните діалогове вікно Пошук рішення, як показано на рис. 3.1.

2. Натисніть кнопку Виконати. Засіб Пошук рішення знайде шукані максимально наближені корені рівняння.

3. Аналогічно знайдіть другий корінь. Результати розрахунку приведені на рис. 3.2.

Рис. 3.2 – Корені рівняння

Приклад 3.1:

A B C D E F G H I J K
1 -2,25 -1,75 -1,25 -0,75 -0,25 0,25 0,75 1,25 1,75 2,25
2 -2,25 36,83 37,33 55,20 85,95 126,58 175,58 232,95 300,20 380,33 477,83
3 -1,75 10,33 8,83 22,70 47,45 80,08 119,08 164,45 217,70 281,83 361,33
4 -1,25 5,70 0,20 8,58 26,33 50,45 79,45 113,33 153,58 203,20 266,70
5 -0,75 18,45 6,95 8,33 18,08 33,20 52,20 75,08 103,33 139,95 189,45
6 -0,25 45,58 26,08 18,95 19,70 25,33 34,33 46,70 63,95 89,08 126,58
7 0,25 85,58 56,08 38,95 29,70 25,33 24,33 26,70 33,95 49,08 76,58
8 0,75 138,45 96,95 68,33 48,08 33,20 22,20 15,08 13,33 19,95 39,45
9 1,25 205,70 150,20 108,58 76,33 50,45 29,45 13,33 3,58 3,20 16,70
10 1,75 290,33 218,83 162,70 117,45 80,08 49,08 24,45 7,70 1,83 11,33
11 2,25 396,83 307,33 235,20 175,95 126,58 85,58 52,95 30,20 20,33 27,83
12
13
14 x Y Рівняння
15 -1,27 -1,84 0,00
16 1,52 1,64 0,00

2.3 Розв’язання систем нелінійних рівнянь на мові С++

Метод простих ітерацій з поліпшенням Зейделя

Текст програми на мові С++:

#include <vcl.h>

#include <math.h>

#include <vcl.h>

#pragma hdrstop

#include "Unit1.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

float x1(float x[2]){

return sqrt(1-0.7*x[1]*x[1]);}

float x2(float x[2]){

return (x[1]+tan(x[0]*x[1]+1)-x[1]*x[1]);}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

float x[2],y[2],E,q; int n=2,kmax,k;

x[0]=StrToFloat(Edit1->Text);

x[1]=StrToFloat(Edit2->Text);

E=StrToFloat(Edit3->Text);

kmax=StrToInt(Edit4->Text);

k=0;

do{

k=k+1;

for (int i=0;i<2;i++) y[i]=x[i];

if(x[1]<=-1) {

x[0]=x[0]+2.0/3*(x[0]*x[0]+0.7*x[1]*x[1]-1);

x[1]=-sqrt(tan(x[0]*x[1]+1)); }

if(x[1]>-1 && x[1]<=0) {

x[0]=sqrt(1-0.7*x[1]*x[1]);

x[1]=-sqrt(tan(x[0]*x[1]+1)); }

if(x[1]>=0 && x[1]<1) {

x[0]=x[0]+1.0/3*(x[0]*x[0]+0.7*x[1]*x[1]-1);

x[1]=sqrt(tan(x[0]*x[1]+1)); }

if(x[1]>=1) {

x[0]=x[0]-1.0/3*(x[0]*x[0]+0.7*x[1]*x[1]-1);

x[1]=sqrt(tan(x[0]*x[1]+1)); }

q=1.0/n*(fabs(x[0]-y[0])+fabs(x[1]-y[1])); }

while(q>E && k<kmax);

AnsiString f;

Memo1->Lines->Add("x1 = "+f.sprintf(" %5.10f", x[0]));

Memo1->Lines->Add("x2 = "+f.sprintf(" %5.10f", x[1]));

Memo1->Lines->Add("Достигнутая точность = "+f.sprintf(" %5.10f", q));

Memo1->Lines->Add("Количество итераций: "+IntToStr(k));

}

//---------------------------------------------------------------------------

Вікно виконання програми:

Метод Ньютона

Текст програми на мові С++:

#include <vcl.h>

#include <iostream.h>

#include <stdlib.h>

#include <conio.h>

#include <string.h>

#include <stdio.h>

#include <iomanip.h>

#include <math.h>

#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused

double Nuton(double*p,int n,double*x,double X)

{

double s=p[n-1];

for(int i=n-2;i>=0;i--) s=p[i]+(X-x[i])*s;

return s;

}

void Nuton1(double*x,double*y,int n,double*p)

{

for(int j=0;j<n-1;j++) {

p[j]=(y[j+1]-y[j])/(x[j+1]-x[j]);

// cout<<p[j]<<"&bsol;t";

}

// cout<<"&bsol;n";

int m=n-1;

int l=2;

int k;

int j;