laboratorijas darbs Nr. 1 Skaitliskās metodēs


Mārcis Lauznis

laboratorijas darbs Nr. 1
Skaitliskās metodēs

 (DatZB97032 2.kurss 2.grupa)

 

1      Uzdevuma formulējums:


Atrisināt vienādojumu sistēmu   x>0, y>0
ar precizitāti 10-5 . Jāizmanto vismaz divas metodes.


2      Teorētiskais risinājuma pamatojums:


Dota vienādojumu sistēma  ar m mainīgajiem.
Apzīmējam x = (x1,x2,...,xm), xRm, tad katru funkciju fi(x1,x2,...,xm) var apzīmēt ar fi(x), un ievedot vēl vektoru  - funkciju f(x)=(f1(x),f2(x),...,fm(x)), tad sākotnējo sistēmu var uzrakstīt formā f(x)=0.

2.1      Dihotomijas metode

Metode atrod nepārtrauktas funkcijas sakni dotajā intervālā, ja ir iepriekš zināms, ka tajā intervālā ir tieši viena sakne. Ja ir dots intervāls [a,b] un funkcija f(x), tad n-tais tuvinājums ir:


T.i. ka nākošo tuvinājumu ņem tekošā intervāla viduspunktu un gadījumā ja tas neder kā atrisinājums (intervāla [a,b] garums lielāks par e), tad par nākamā tuvinājuma intervālu ņem intervālu, kurā viens no galapunktiem ir tekošais tuvinājums, bet par otro galapunktu izvēlas vienu no iepriekšēja intervāla galapunktiem tā, lai jauns (divreiz mazāks) intervāls saturētu funkcijas sakni.

2.2      Vienādojumu sistēmu risināšana ar Ņūtona metodi:


Dota vienādojumu sistēma f(x)=0.
Dots kaut kāds nulltais tuvinājums x0 = (x01,...,x0m) sistēmas atrisinājumam a=(a1,a2,...,am).
Kļūdas vektors ir e = a - x0 = (a1 - x01,...,am - x0m) = (e1,...,em). Vienādībā f(a) = 0 aizvietojam a = x0 + e :              f(x0 + e) = 0.
Paņemsim no vienādojumu sistēmas galveno lineāro daļu, lai to izdarītu katru funkciju fi(x0 + e) = 0 izvirzīsim pēc Teilora formulas, saglabājot tikai lineāro daļu, bet pārējo atmetot. Tā mēs iegūsim lineāru vienādojumi sistēmu, kas tuvināti aizstāj doto vienādojumu sistēmu: , kur i = 1,2,...,m.
Izrēķinot to mēs iegūsim tuvinātus kļūdu rezultātus e0i. Sākotnējo tuvinājumu mēs varam uzlabot aizstājot to ar x0i + e0i. Tātad x11 = x01 + e01; ... x1m = x0m + e0m. Tādā veidā aprēķinus var turpināt. Rezultātā mēs katrai vērtībai ai iegūsim tuvinājumu rindu, kurā katru nākamo atrisinājumu var iegūt no lineāras vienādojumu sistēmas pēc iepriekšējā tuvinājuma:
, kur i = 1,2,...,m un n = 1,2,...
To var pārveidot par f '(x)(xn+1 - xn) = -f(xn), kur f '(x) ir funkciju sistēmas fi (i = 1,2,..,m) Jakobi matrica:
Pareizinot vienādojums f '(x)(xn+1 - xn) = -f(xn) abas puses no labās puses ar
[f '(x)]-1 iegūsim:  xn+1 = xn - [f '(x)]-1 f(xn)    (n = 0,1,...,N), kur  ( - precizitāte ar kādu vēlas iegūt vienādojumu sistēmas atrisinājumu.
Tuvinājumu rindas konverģences nosacījums ir:, ja det [f '(x)] nav nulle atrisinājuma a apkārtnē.
Tagad izrakstīsim Ņūtona metodes formulas gadījumā m = 2:
, det f '(x) ¹ 0.
, kur , ,  un .
Tātad n+1 tuvinājumu aprēķina pēc formulām:
,
.
Tagad apskatīsim doto vienādojumu sistēmu:
Pārveidojam to par:
Izrēķinām Jakobi matricu:
         
       
Tātad n+1 tuvinājumu dotajai vien. sistēmai var izrēķināt pēc formulām:

3      Praktiskā daļa


Lai noteiktu vienādojumu sistēmas atrisinājumu skaitu, izmantosim grafisko metodi. Sakarā ar to,  ka dotajā sistēmā ir pārāk sarežģīti vienādojumi, no sākuma pārveidosim to.

Zīmēju šīs funkcijas grafiku un atrodu krustpunktu skaitu ar asi OY (atrisinājumu skaitu). No grafika redzams ka vienādojumu sistēmai ir divas reālas saknes, bet viena no tām ir negatīva (nosacījumā x>0, y>0).




3.1      Dihotomijas metode:


Saknes  meklēšana intervālā [0,1]. Dota precizitāte tika sasniegta pēc 26 soļa.
Atrisinājums: x=0.38951, y=0.45692


3.2      Ņūtona metode:

Izpildot  programmu, tiek iegūti šādi tuvinājumi:

Tuvinājums
x
y
0
0.0001000
0.0001000
1
0.5000250
0.7497501
2
0.4402180
0.4488538
3
0.4547207
0.3925311
4
0.4569119
0.3895197
5
0.4569214
0.3895071
6
0.4569214
0.3895071

      Otro sakni nemeklē, jo tā neatrodas (x>0, y>0)
Tātad sistēmas atrisinājums ar precizitāti 10-5 ir

(x ,y)=( 0.45692, 0.38951)



4      Programmas:

Visas programmas uzrakstītas Borland Pascal 7.0 vidē

4.1      Dihitomijas metode

program dihotomijas_metode
uses crt;
const epsilon=0.00000002;
var x,y,s,a,b,d:real;
    sk:integer;
function f(y:real):real;
 begin
f:=exp(y*sqrt(1-(y+0.5)*(y+0.5)))-y*y+sqrt(1-(y+0.5)*(y+0.5))-1.5;
 end;

begin
{clrscr;}
a:=0.1;
b:=0.9;
sk:=0;
   repeat
    s:=(a+b)/2;
    d:=(f(s));
    if(f(a)*d)>0 then a:=s
    else b:=s;
    sk:=sk+1
   until abs(b-a)<=epsilon;
  x:=sqrt(1-(s+0.5)*(s+0.5));
  writeln(sk,' Solis y=',s:3:5,' x=',x:3:5);
  readkey
end.

4.2      Ņjutona metode sistēmām

program nutona_metode_sistemam;
 uses crt;
{ e   - kl'u'da,
  x0  - x nulltais tuvina'jums, y0 - y nulltais tuvina'jums,
  f1  - siste'mas pirmais viena'dojums,
  f2  - siste'mas otrais viena'dojums,
  f1x - pirma' vien. atvasina'jums pe'c x,
  f1y - pirma' vien. atvasina'jums pe'c y,
  f2x - otra' vien. atvasina'jums pe'c x,
  f2y - otra' vien. atvasina'jums pe'c y.}

const e=0.00001;
      x0=0.0001;
      y0=0.0001;
var x,y,a,b,x1,y1: real;

function f1(x,y:real):real;
 begin
   f1:=sqr(y)-x+1.5-exp(x*y)
 end;

function f2(x,y:real):real;
 begin
   f2:=sqr(y+0.5)+sqr(x)-1
 end;

function f1y(x,y:real): real;
 begin
   f1y:=2*y-x*exp(x*y);
 end;

function f1x(x,y:real): real;
 begin
   f1x:=-1-y*exp(x*y)
 end;

function f2y(x,y:real): real;
 begin
   f2y:=2*y+1
 end;

function f2x(x,y:real): real;
 begin
   f2x:=2*x
 end;

function nutoX(x,y:real):real;
 begin
  nutoX:=x-f2y(x,y)/(f1x(x,y)*f2y(x,y)-f1y(x,y)*f2x(x,y))*f1(x,y)-
    (-f1y(x,y))/(f1x(x,y)*f2y(x,y)-f1y(x,y)*f2x(x,y))*f2(x,y)
 end;
function nutoY(x,y:real):real;
 begin
  nutoY:=y-(-f2x(x,y))/(f1x(x,y)*f2y(x,y)-f1y(x,y)*f2x(x,y))*f1(x,y)-
    f1x(x,y)/(f1x(x,y)*f2y(x,y)-f1y(x,y)*f2x(x,y))*f2(x,y)
 end;
begin
 x:=x0;
 y:=y0;
 x1:=nutoX(x,y);
 y1:=nutoY(x,y);
 writeln;
 writeln(x:11:7,y:11:7);
 writeln(x1:11:7,y1:11:7);
 while (abs(x-x1)>e) or (abs(y-y1)>e) do
  begin
   x:=x1;
   y:=y1;
   a:=nutoX(x1,y1);
   b:=nutoY(x1,y1);
   x1:=a;
   y1:=b;
   writeln(x1:11:7,y1:11:7);
  end;
 writeln('Vien. sist. atrisinajums ar kludu',e:8:5,' pec Nutona metodes ir:');
 writeln('x=',x1:7:5,' y=',y1:7:5);
readkey;
end.

Nav komentāru:

Ierakstīt komentāru