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

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]<<"\t";

}

// cout<<"\n";

int m=n-1;

int l=2;

int k;

int j;

int i;

for(int i=n-2;i>=1;i--)

{

k=0;

for(j=1;j<=i;j++)

{

p[m]=(p[m-i]-p[m-i-1])/(x[k+l]-x[k]);

// cout<<p[m]<<"\t";

m++;

k++;

}

// cout<<"\n";

l++;

}

j=0;

for(i=1;i<n;i++)

{

y[i]=p[j];

j=j+(n-i);

}

 

}

void main()

{

int const n=5,N=(n-1)*n/2;

double x[]={1,2,3,4,5};

double y[n];

for(int i=0; i<n; i++) y[i]=1+2*x[i]+3*pow(x[i],2)+4*pow(x[i],3)+5*pow(x[i],4);

double *p=new double[N];

Nuton1(x,y,n,p);

//for (i=0;i<n;i++) cout<<y[i]<<'\t';

double z=1.5;

cout<<Nuton(y,n,x,z)<<'\t'<<1+2*z+3*pow(z,2)+4*pow(z,3)+5*pow(z,4)<<'\n';

getch();

}

 

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



Висновок

У даній курсовій роботі я описала методи розв’язання систем нелінійних рівнянь, а також навела приклади їх реалізації. В пакеті Mathcad для розв’язання систем нелінійних рівнянь я використала оператор solve, обчислювальний блок given – find, метод простих ітерацій, метод Ньютона та два модифіковані методи Ньютона, в яких на відміну від метода Ньютона матриця Якобі знаходилась не на кожному кроці, а тільки на початковому.

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




Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: