patstāvīgais darbs Nr.1 Skaitlikās metodēs


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;
{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