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),
x
Rm, 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:

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:






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