Kaspars Cikmačs
(DatZB95014 2.grupa)
patstāvīgais darbs Nr.1
Skaitlikās metodēs
3.semsetrī (1996.g)
{
|
Tuvināti atrisināt vienādojumu
sistēmu:
cos(y-1)+x=0.8
y-cos(x)=2
(ar vismaz pieciem cipariem aiz komata un ar vismaz divām
metodēm)
Aplūkojot uzzīmēto
grafiku ir redzams, ka dotajai vienādojumu
sistēmai ir viens atrisinājums.
![]() |
Parastā iterāciju metode.
Vienādojumu
sistēmu ar n nezināmajiem (x1, x2, x3, … , xn);
fi(x1,
x2, …, xn)=0, i=1,2,…, n sauc par nelineāru, ja kaut viena
no funkcijām fi ir nelineāra.
{
|
Pieņemsim, ka
vienādojumu sistēmai fi(x1, x2, …, xn)=0,
(i=1,2,…, n) saknes ir atdalītas. Lai
precizētu šo sakņu vērtības, izmanto iterāciju metodi. Tādēļ sistēmu pārraksta
ekvivalentā formā :
x1 = j1(x1, x2, …, xn)
x2 = j2(x1, x2, …, xn)
… … … … …
xn = jn(x1, x2, …, xn).
{
|
Parastajā iterāciju metodē tuvinājumus meklē pēc šāda
algoritma:
x1(k+1) = j1(x1(k),
x2(k), …, xn(k))
x2(k+1) = j2(x1(k),
x2(k), …, xn(k))
… … … … …
xn(k+1) = jn(x1(k),
x2(k), …, xn(k)),
kur xn(0) = jn(x1(0), x2(0),
…, xn(0)) - patvaļīgs sākuma tuvinājums. Ja funkcijas ji(x) ir nepārtrauktas un vektoru virkne {x(k)} (k = 0,1,…) konverģē
uz vektoru x, tad x ir vienādojumu sistēmas
atrisinājums.
Teorēma: Ja kāda no
atvasinājumu {( ¶ji(x) ) / ( ¶ xj )} matricas normām, kas
saskaņota ar vektora x normu, mazāka par vienu, tad iterāciju process konverģē.
Praksē
vienkāršāk apskatīt matricu ar elementiem
|
Mij =
|
max
|
¶ji(x)
|
|
|
|
i,j
|
¶ xj
|
.
|
Tādā gadījumā, atkarībā no matricas normas izvēles
teorēmas nosacījums ir:
n
|
|
|
n
|
|
|
n
|
|
S
|
Mij < 1
|
vai
|
S
|
Mij < 1
|
vai
|
S
|
Mij2 < 1
|
j=1
|
" i=1,2,..n
|
|
i=1
|
" j=1,2,..n
|
|
i,j=1
|
|
k - tā tuvinājuma novērtēšanai var izmantot nevienādību:
|| x - x || £ M / (1 - M) || x(k)
- x(k-1) ||,
kur M ir matricas
|
Mij =
|
max
|
¶ji(x)
|
( i,j = 1,2,…,n) norma.
|
|
|
i,j
|
¶ xj
|
|
Risinājums
ar parasto iterāciju metodi.
Pārveidosim doto sistēmu ekvivalentā formā:
{
|
x = 0.8 - cos ( y - 1) º j1(x,y)
y = 2 + cos ( x ) º j2(x,y)
Grafiski
atdalam saknes. (skat.grafiks) No grafika redzams, ka vienādojumu sistēmai ir
viens atrisinājums taisnstūrī : 0.7 <
x <1 ; 2.5 < y < 2.8.
Pārbaudīsim konverģences pietiekamos nosacījumus
M11 = maxx ( ¶j1 ) / ( ¶ x ) | = 0
M12 = maxy ( ¶j2 ) / ( ¶ y ) | = maxyÎ[2.5;2.8] | sin( y - 1 ) | = 0.9975
M21 = maxx ( ¶j2 ) / ( ¶ x ) | = maxxÎ[0.7;1] | - sin( x ) | = -0.644
M22 = maxy ( ¶j2) / ( ¶ y ) | = 0
|
2
|
|
|
2
|
|
|
Tā kā
|
S
|
Mij < 1
|
un
|
S
|
Mij < 1
|
|
|
i=1
|
(i=1,2)
|
|
j=1
|
(i=1,2)
|
|
tad pietiekamie
konverģences nosacījumi izpildās. Matricas norma M £ 0.9975.
Tādad sistēma konverģe,
bet ļoti lēni.
Tuvinājumu virknes
meklēsim pēc formulām:
{
|
x(k+1) = 0.8
- cos ( y(k) - 1)
y(k+1) = 2 + cos ( x(k) )
No grafikā atrastā
taisnstūra izvēlēsimies sākuma tuvinājumu
x(0) = 0.8722;
xÎ[0.7;1]
y(0) = 2.6431;
yÎ[2.5;2.8]
Aprēķinus izdaru ar programmu (skat programmu aprekini.pas)., kuru sarakstīta TURBO PASCALā un tiek
izpildīta uz datora (procesors - Pentium -100Mhz). Dati tika aprēķināti un
izvadīti laikā, kas bija mazāks par vienu sekundi.
K
|
X
|
Y
|
0
|
0.8722
|
2.6431
|
1
|
8.72240691E-01
|
2.64314346E+00
|
2
|
8.72284042E-01
|
2.64311230E+00
|
3
|
8.72252964E-01
|
2.64307911E+00
|
4
|
8.72219853E-01
|
2.64310291E+00
|
5
|
8.72243590E-01
|
2.64312826E+00
|
6
|
8.72268879E-01
|
2.64311008E+00
|
7
|
8.72250750E-01
|
2.64309072E+00
|
8
|
8.72231434E-01
|
2.64310460E+00
|
9
|
8.72245282E-01
|
2.64311939E+00
|
10
|
8.72260034E-01
|
2.64310879E+00
|
11
|
8.72249458E-01
|
2.64309749E+00
|
12
|
8.72238190E-01
|
2.64310559E+00
|
13
|
8.72246268E-01
|
2.64311422E+00
|
Tā kā |x(13) - x(12)|
= 8.077*10-6< 0.00001 un |y(13) - y(12)| =
8.6283*10-6< 0.00001, tad acīmredzot, atrisinājums ir atrasts ar
precizitāti:
E = 0.9975 / 1 - 0.9975 * 0.00001
= 0.00399
Ja par x(0) ņem 0.8 un par y(0)
ņem 2.6, tad lai iegūtu, lai |x(i) - x(i-1)| <
0.00001, k>130. To varēja arī gaidīt, jo matricas norma ir £ 0.9975, kas ir ļoti tuvu 1.
Kā redzams no precizitātes aprēķiniem tad
arī lielā kļūda aprēķinos ir tāpēc, ka matricas norma ir tik tuvu 1.
Tāpēc lai iegūtu precizāku atbildi ir
iterācija jāturpina.
Turpinot x ir 0.872247649 un y ir 2.6431069764, kas kā redzams ir ļoti
līdzīgs rezultāts tam ko ieguvu pie k=13.
Ņutona iterācijas metode.
Pārrakstam vienādojumu sistēmu vektoriālā
formā F(x) = 0.
{
|
f1(x,y) º cos ( y - 1) + x - 0.8 = 0
f2(x,y) º y - cos ( x ) - 2 = 0
Meklējam Jakobi matricu:
¶ f1(x,y) ¶ f1(x,y)
-------------
= 0 -------------- = sin
(y-1)
¶ x ¶ y
¶ f2(x,y) ¶ f2(x,y)
-------------
= - sin (x) -------------- = 0
¶ x ¶ y
Tātad Jakobi matrica J(x) ir
|
0
|
sin (y-1)
|
|
- sin (x)
|
0
|
Izvēlamies sākuma tuvinājumu x(0)
= 0.8; xÎ[0.7;1]
un y(0) = 2.6; yÎ[2.5;2.8].
Katra tuvinājuma atrašanai nepieciešams
atrisināt šādu lineāru vienādojumu sistēmu:
{
|
f1(x(k), y(k)) + ( ¶ f1(x(k),y(k)) ) / ( ¶ x ) Dx(k) + ( ¶ f1(x(k),y(k)) ) / ( ¶ y ) Dy(k) = 0
f2(x(k), y(k)) + ( ¶ f2(x(k),y(k)) ) / ( ¶ x ) Dx(k) + ( ¶ f2(x(k),y(k)) ) / ( ¶ y ) Dy(k) = 0
To var risināt ar
Krāmera formulām:
|
- f1(x(k), y(k))
|
( ¶ f1(x(k),y(k)) ) / ( ¶ y )
|
|
Dx(k) =
|
- f2(x(k), y(k))
|
( ¶ f2(x(k),y(k)) ) / ( ¶ y )
|
|
|
det J(x(k),y(k))
|
|
|
|
( ¶ f1(x(k),y(k)) ) / ( ¶ x )
|
- f1(x(k), y(k))
|
|
Dy(k) =
|
( ¶ f2(x(k),y(k)) ) / ( ¶ x )
|
- f2(x(k), y(k))
|
|
|
det J(x(k),y(k))
|
|
|
Mūsu piemērā:
det J(x(k), y(k)) = sin(x(k)) × sin(y(k) -1)
Dx(k) = (- sin(y(k)-1) × (-y(k) + cos(x(k))+2)) / (sin(x(k)) × sin(y(k) -1)) un
Dy(k) = (sin(x(k)) × (-cos(y(k)-1) - x(k) + 0.8)) / (sin(x(k)) × sin(y(k) -1))
Tad x(k+1) = x(k) + Dx(k)
un y(k+1) = y(k) + Dy(k)
Izdarām aprēķinus ar programmu (skat. aprekininutona.pas). Aprēķinu rezultāti ir
aplūkojami šajā tabulā:
k
|
x(k)
|
y(k)
|
Dx(k)
|
Dy(k)
|
1
|
6.6519009098E-01
|
2.6292119782E+00
|
-1.3480990902E-01
|
2.9211978201E-02
|
2
|
4.0986722620E-01
|
2.8227344145E+00
|
-2.5532286478E-01
|
1.9352243625E-01
|
3
|
1.7287281068E-01
|
3.4829921206E+00
|
-2.3699441552E-01
|
6.6025770618E-01
|
4
|
3.0674058826E+00
|
5.7999070393E+00
|
2.8945330719E+00
|
2.3169149186E+00
|
5
|
6.7789991334E+01
|
8.1637664087E+00
|
6.4722585452E+01
|
2.3638593695E+00
|
6
|
6.1686119138E+01
|
-7.9536798161E+01
|
-6.1038721965E+00
|
-8.7700564570E+01
|
7
|
1.5164002244E+02
|
-1.4685827149E+02
|
8.9953903306E+01
|
-6.7321473328E+01
|
8
|
-4.8518139878E+01
|
-8.8868083407E+02
|
-2.0015816232E+02
|
-7.4182256258E+02
|
Aplūkojot Dx(k) un Dy(k) redzam, ka D visu laiku
palielinās. Tas nozīmē ka diezgan strauji diverģē. Līdz ar to varam izdarīt
secinājumu, ka doto vienādojumu sistēmu nav iespējams atrisināt ar Ņūtona
iterācijas metodi.
Programmas tekstus pārbaudei var ielādēt no Interneta
(http://www.lanet.lv/~sd50014/study.html/)
Patstāvīgais darbs ir uzrakstīts izmantojot Microsoft
Word 7.0 for Windows 95 un TURBO PASCAL 6.0
Paldies par iespēju izdrukāt uz HP DeskJet 600 firmas
optikas salona “ITLATS” (Merķeļa iela 21) vadībai.
program zimgrafik;
{ Praktiskais darbs
Skaitliskās Metodēs 1 21.09.96 kc}
{ Programma viendojuma
sistēmas grafiskai attēlošanai}
{ vdj.sistēma 1.vdj. cos(y-1)+x=0.8
{ 2.vdj.
y-cos(x)=2}
uses graph,crt;
var x1,x2,y1,y2,color,i:integer; key:char;
a:string; sak,beig:longint; x,solis,px,py:real;cx,cy,res:integer;
grDriver: Integer; grMode: Integer; ErrCode:
Integer;
begin
grDriver := Detect;
InitGraph(grDriver, grMode,'');
ErrCode := GraphResult;
if ErrCode = grOk then
begin
sak:=-7;beig:=7;solis:=0.015;
res:=trunc(1/solis);
cx:=250;cy:=340;{katras ass centrs}
x:=sak;
for i:=1 to 7 do begin
setcolor(6);
{yi}Line(0, cy-i*res, getmaxx,
cy-i*res);{xi}line(cx+i*res, 0, cx+i*res,getmaxy);
{y-i}Line(0, cy+i*res, getmaxx,
cy+i*res);{x-i}line(cx-i*res, 0, cx-i*res,getmaxy);
setcolor(10);
str(i,a);OutTextXY(cx+i*res+5,cy+5,a); OutTextXY(cx+5,cy-i*res+5,a);
str(i*-1,a);OutTextXY(cx-i*res+5,cy+5,a);
OutTextXY(cx+5,cy+i*res+5,a);
end;
{asis} setcolor(2); Line(0, cy, getmaxx,
cy); line(cx, 0, cx,getmaxy);
setcolor(10); OutTextXY(cx+5,cy+5,'0');
OutTextXY(cx-15,5,'Y');
OutTextXY(getmaxx-10,cy-15,'X');
repeat
x:=x+solis; {y=2-cos(x)}
PutPixel(trunc(x*res+cx), trunc(cy-(2+cos(x))*res),
4);
{cos(y-1)+x=0.8 x=0.8-cos(y-1)}
PutPixel(trunc((0.8-cos(x-1))*res+cx),
trunc(cy-(x)*res), 5);
until trunc(x)=beig;
readln;
CloseGraph; end
else Writeln('Graphics error:',
GraphErrorMsg(ErrCode));
end.
program aprekini;
program aprekini;
{Parastās iterācijas
metode ; Programma, kas izvada datus tabulaa}
uses crt;
var
y1,y2,x1,x2,qx,qy:real; k:longint;
begin
x2:=0.8722; y2:=2.6431; {sākuma vērtības}
k:=0;
repeat
k:=k+1;
x1:=0.8-cos(y2-1);
y1:=2+cos(x2);
qx:=sqrt(sqr(x1-x2));
qy:=sqrt(sqr(y1-y2));
x2:=x1;
y2:=y1;
writeln(k,x2,y2); {izvada datus tabulā}
until (qx<0.00001) and (qy<0.00001);
readln;
end.
program aprekininutona;
{Nutona metode
;Programma, kas izvada datus tabulaa}
uses crt;
var x,y,xd,yd:real;
k:longint;
begin
x:=0.8;
y:=2.6;
k:=0;
repeat
k:=k+1;
xd:=(-sin(y-1)*(-y+cos(x)+2))/(sin(x)*sin(y-1));
yd:=((-cos(y-1)-x+0.8)*sin(x))/(sin(x)*sin(y-1));
x:=x+xd;
y:=y+yd;
writeln(k,x,y,xd,yd); {izvada datus tabula}
until k=10;
readln;
end.
Nav komentāru:
Ierakstīt komentāru