Page 1 of 19 Konvergens af Newton's metode og relationerne til Fraktaler og Juliamængder. Dette foredrag har to delmål: 1. At vise hvordan man kan bruge et CAS-program som Maple i sin undervisning. 2. At vise lidt (sjov) matematik som en gymnasieelev (nok) kan forstå. Lad os starte med "Newtons metode" som mange gymnasieelever stifter bekendskab med: Newton's metode Mål: Find et nulpunkt for en given funktion (reel eller kompleks, skalær eller vektor). Lad os bare sige skalær. Vælg et "startgæt" Iterer med formlen for Hvordan kan Maple hjælpe med forståelsen? > restart; > with(student[calculus1]); (1)
Page 2 of 19 > NewtonsMethodTutor(exp(x)-3/2-arctan(x),4); Sæt antallet af iterationer til 10. Bemærk at der først begynder at "ske noget" efter lidt begyndelses "fnidder". Iteration 5: 1 korrekt ciffer Iteration 6: 3 korrekte cifre Iteration 7: 5 korrekte cifre Iteration 8: 10 korrekte cifre. Bemærk den fordobling af antallet af korrekte cifre i hvert trin som karakteriserer en kvadratisk konvergent iteration. Lad os finde det andet nulpunkt:
Page 3 of 19 > NewtonsMethodTutor(exp(x)-3/2-arctan(x),-4); Forklaring af trin i proceduren: Start med et punkt Følg grafens tangent i punktet til skæring med x-aksen. Skæringspunktet er så (forudsat at ). Stopkriteriet: eller eller. Problemet med flade grafer: En afledet med en værdi tæt på 0 kan sende iterationen på afveje: > g:=x->sin(piecewise(x<-1,-pi/2-1/x,1<x,pi/2+1/x,(1+pi/2)*x));
Page 4 of 19 (2) > plot(g(x),x=-5..5,y=-2..2); Things may be very sensitive to the initial guess: Here: while divergence): gives convergence gives divergence (take first N=2 iterations and then increase to 3 to see the > NewtonsMethodTutor(g(x),-0.5);
Page 5 of 19 > NewtonsMethodTutor(g(x),-0.55); Error analysis for Newton's method:
Page 6 of 19 Afrundingsfejl (ser vi ikke på her): Computeren laver fejl pga endelig præcision. Diskretiseringsfejl (ser vi på her): Vi laver fejl fordi ikke er identisk med sin tangent. Kald et nulpunkt for for ( er ukendt), så Benævn fejlen før 'te trin med Antag at (simpelt nulpunkt i ) Lad Bemærk at tælleren er de første to led i en Taylorudvikling og derfor for et eller andet fordi Så (dvs. Kvadratisk konvergens) Bemærk, at kvadratisk konvergens ikke automatisk giver konvergens. Det er nødvendigt, at startgættet er tilstrækkeligt godt eller at C er tilstrækkelig lille. Hvor godt startgættet skal være afhænger af. Standard konvergenssætning for Newton's metode: Hvis så findes der en konstant og en omegn om så hvis newton's metode startes i den omegn så vil og tilfredsstille Så Newton konvergerer hvis startgættet er tilstrækkeligt godt. Nej!
Page 7 of 19 Newton konvergerer hvis startgættet er tilstrækkeligt godt eller hvis C er tilstrækkelig lille. Jamen hvornår sker det da så? Lad os lege lidt: Definition: Tiltrækningsområdet for en rod er de punkter i den komplekse plan hvorfra Newton's metode konvergerer mod roden. Eksperiment (med Maple): Find tiltrækningsområderne for alle rødder for. Vælg forskellige farver for hver rod: Alle punkter som giver konvergens mod en given rod er farvet i rodens farve. Hvis der ikke er konvergens bruges sort. Procedure: Tag en masse punkter i C. Brug Newtons metode på hvert punkt og se hvis den konvergerer og i givet fald til hvilken rod den "tiltrækkes". De farvede mængder er så tiltrækningsområderne. Den sorte mængde kaldes Julia mængden for > restart; Definer og : > p:=z->z^5+1; p1:=z->5*z^4;
Page 8 of 19 (3) Definer Newton-opdateringen: > update:=proc(z) evalf(z-p(z)/p1(z)) end proc: Kør 20 Newton-opdateringer fra et givent startpunkt og put startpunktet på en af farvelisterne: > Newt:=proc(z0) local y,i; global Blue,Red,Green,Yellow,Orange,Black; y:=z0; for i from 1 to 20 do y:=update(y); end do; if abs(y-proots[1])<0.25 then Blue:=Blue,[Re(z0),Im(z0)] elif abs(y-proots[2])<0.25 then Red:=Red,[Re(z0),Im(z0)] elif abs(y-proots[3])<0.25 then Green:=Green,[Re(z0),Im(z0)] elif abs(y-proots[4])<0.25 then Yellow:=Yellow,[Re(z0),Im(z0)] elif abs(y-proots[5])<0.25 then Orange:=Orange,[Re(z0),Im(z0)] else Black:=Black,[Re(z0),Im(z0)] end if; end proc: Find 's 5 komplekse rødder: > proots:=[solve(p(z)=0)]; (4) De kan også angives på trigonometrisk form: > qroots:=[seq(-cos(2*pi*k/5)-i*sin(2*pi*k/5),k=0..4)]; (5)
Page 9 of 19 > evalf(proots); (6) > evalf(qroots); (7) > for i from 1 to 5 do simplify(p(proots[i])); simplify(p(qroots [i])) end do; (8) Vi kan ikke regne symbolsk det tager for lang tid, så evaluer rødderne: > proots:=evalf(proots); (9) Put en rod på hver af farvelisterne, og initialiser den sorte liste med (0,0):
Page 10 of 19 > Blue:=[Re(proots[1]),Im(proots[1])]; Red:=[Re(proots[2]),Im(proots[2])]; Green:=[Re(proots[3]),Im(proots[3])]; Yellow:=[Re(proots[4]),Im(proots[4])]; Orange:=[Re(proots[5]),Im(proots[5])]; Black:=[0,0]; (10) Lad os lige se placeringen af de 5 rødder grafisk: > plotcolor:=proc(blue,red,green,yellow,orange,black) global pb0,pr0,pg0,py0,po0,px0; pb0:=plots[pointplot] ([Blue],color=blue,symbol=solidbox,symbolsize=20); pr0:=plots[pointplot] ([Red],color=red,symbol=solidbox,symbolsize=20); pg0:=plots[pointplot] ([Green],color=green,symbol=solidbox,symbolsize=20); py0:=plots[pointplot] ([Yellow],color=yellow,symbol=solidbox,symbolsize=20); po0:=plots[pointplot] ([Orange],color=orange,symbol=solidbox,symbolsize=20); px0:=plots[pointplot] ([Black],color=black,symbol=solidbox,symbolsize=20); plots[display]([pb0,pr0,pg0,py0,po0,px0]); end proc; (11)
Page 11 of 19 > plotcolor(blue,red,green,yellow,orange,black); > for k in 0.22,0.17,0.11,0.099,0.077,0.055 do #for k in 0.22,0.17,0.11,0.099,0.077,0.055,0,044,0.033,0.022,0.011 do for i from -1 to 1 by k do for j from -1 to 1 by k do Newt(i+j*I) end do; end do; pb:=plots[pointplot]([blue],view=[-1..1,- 1..1],symbol=solidbox,color=blue): pr:=plots[pointplot]([red],view=[-1..1,- 1..1],symbol=solidbox,color=red): pg:=plots[pointplot]([green],view=[-1..1,- 1..1],symbol=solidbox,color=green): py:=plots[pointplot]([yellow],view=[-1..1,- 1..1],symbol=solidbox,color=yellow): po:=plots[pointplot]([orange],view=[-1..1,- 1..1],symbol=solidbox,color=orange): px:=plots[pointplot]([black],view=[-1..1,- 1..1],symbol=solidbox,color=black): plots[display]([pb,pr,pg,py,po,px,pb0,pr0,pg0,py0,po0,px0]); end do; >
Page 12 of 19
Page 13 of 19
Page 14 of 19
Page 15 of 19
Page 16 of 19 > for k in 0.044,0.033,0.022,0.011 do #for k in 0.22,0.17,0.11,0.099,0.077,0.055,0.044,0.033,0.022,0.011 do for i from -1 to 1 by k do for j from -1 to 1 by k do Newt(i+j*I) end do; end do; pb:=plots[pointplot]([blue],view=[-1..1,- 1..1],symbol=solidbox,color=blue): pr:=plots[pointplot]([red],view=[-1..1,- 1..1],symbol=solidbox,color=red): pg:=plots[pointplot]([green],view=[-1..1,- 1..1],symbol=solidbox,color=green): py:=plots[pointplot]([yellow],view=[-1..1,- 1..1],symbol=solidbox,color=yellow): po:=plots[pointplot]([orange],view=[-1..1,- 1..1],symbol=solidbox,color=orange): px:=plots[pointplot]([black],view=[-1..1,- 1..1],symbol=solidbox,color=black): plots[display]([pb,pr,pg,py,po,px]); end do;
Page 17 of 19
Page 18 of 19
Page 19 of 19 Det ser jo helt fraktalagtigt ud! >