Numsym Harj. 4

18.3.04 ratkaisuja

1.

>    restart:

Warning, the name changecoords has been redefined

>    read("/p/edu/mat-1.192/ns04.mpl");

>    #read("/home/apiola/opetus/numsym/04/maple/ns04.mpl");

>    #read("c:\\usr\\heikki\\numsym04\\maple\\ns04.mpl");

>    op(ode23step);

proc (f, t, y, h) local s1, s2, s3, s4, tuusi, yuusi, euusi; s1 := f(t,y); s2 := f(t+1/2*h,y+1/2*h*s1); s3 := f(t+3/4*h,y+3/4*h*s2); tuusi := t+h; yuusi := y+1/9*h*(2*s1+3*s2+4*s3); s4 := f(tuusi,yuusi...
proc (f, t, y, h) local s1, s2, s3, s4, tuusi, yuusi, euusi; s1 := f(t,y); s2 := f(t+1/2*h,y+1/2*h*s1); s3 := f(t+3/4*h,y+3/4*h*s2); tuusi := t+h; yuusi := y+1/9*h*(2*s1+3*s2+4*s3); s4 := f(tuusi,yuusi...
proc (f, t, y, h) local s1, s2, s3, s4, tuusi, yuusi, euusi; s1 := f(t,y); s2 := f(t+1/2*h,y+1/2*h*s1); s3 := f(t+3/4*h,y+3/4*h*s2); tuusi := t+h; yuusi := y+1/9*h*(2*s1+3*s2+4*s3); s4 := f(tuusi,yuusi...
proc (f, t, y, h) local s1, s2, s3, s4, tuusi, yuusi, euusi; s1 := f(t,y); s2 := f(t+1/2*h,y+1/2*h*s1); s3 := f(t+3/4*h,y+3/4*h*s2); tuusi := t+h; yuusi := y+1/9*h*(2*s1+3*s2+4*s3); s4 := f(tuusi,yuusi...
proc (f, t, y, h) local s1, s2, s3, s4, tuusi, yuusi, euusi; s1 := f(t,y); s2 := f(t+1/2*h,y+1/2*h*s1); s3 := f(t+3/4*h,y+3/4*h*s2); tuusi := t+h; yuusi := y+1/9*h*(2*s1+3*s2+4*s3); s4 := f(tuusi,yuusi...
proc (f, t, y, h) local s1, s2, s3, s4, tuusi, yuusi, euusi; s1 := f(t,y); s2 := f(t+1/2*h,y+1/2*h*s1); s3 := f(t+3/4*h,y+3/4*h*s2); tuusi := t+h; yuusi := y+1/9*h*(2*s1+3*s2+4*s3); s4 := f(tuusi,yuusi...
proc (f, t, y, h) local s1, s2, s3, s4, tuusi, yuusi, euusi; s1 := f(t,y); s2 := f(t+1/2*h,y+1/2*h*s1); s3 := f(t+3/4*h,y+3/4*h*s2); tuusi := t+h; yuusi := y+1/9*h*(2*s1+3*s2+4*s3); s4 := f(tuusi,yuusi...
proc (f, t, y, h) local s1, s2, s3, s4, tuusi, yuusi, euusi; s1 := f(t,y); s2 := f(t+1/2*h,y+1/2*h*s1); s3 := f(t+3/4*h,y+3/4*h*s2); tuusi := t+h; yuusi := y+1/9*h*(2*s1+3*s2+4*s3); s4 := f(tuusi,yuusi...
proc (f, t, y, h) local s1, s2, s3, s4, tuusi, yuusi, euusi; s1 := f(t,y); s2 := f(t+1/2*h,y+1/2*h*s1); s3 := f(t+3/4*h,y+3/4*h*s2); tuusi := t+h; yuusi := y+1/9*h*(2*s1+3*s2+4*s3); s4 := f(tuusi,yuusi...
proc (f, t, y, h) local s1, s2, s3, s4, tuusi, yuusi, euusi; s1 := f(t,y); s2 := f(t+1/2*h,y+1/2*h*s1); s3 := f(t+3/4*h,y+3/4*h*s2); tuusi := t+h; yuusi := y+1/9*h*(2*s1+3*s2+4*s3); s4 := f(tuusi,yuusi...
proc (f, t, y, h) local s1, s2, s3, s4, tuusi, yuusi, euusi; s1 := f(t,y); s2 := f(t+1/2*h,y+1/2*h*s1); s3 := f(t+3/4*h,y+3/4*h*s2); tuusi := t+h; yuusi := y+1/9*h*(2*s1+3*s2+4*s3); s4 := f(tuusi,yuusi...

>   

y'=1

>    f:=(t,y)->1;

f := 1

>    dsolve({diff(y(t),t)=f(t,y(t)),y(0)=0});

y(t) = t

>    ytarkka:=unapply(subs(%,y(t)),t);

ytarkka := proc (t) options operator, arrow; t end proc

>    ode23step(f,t[n],ytarkka(t[n]),h);

[t[n]+h, t[n]+h, 0]

>    Y[n+1]:=%[2];

Y[n+1] := t[n]+h

>    ytarkka(t[n]+h);

t[n]+h

Samat ovat, joten lokaali virhe = 0

y'=t

>    restart:

Warning, the name changecoords has been redefined

>    #read("/home/apiola/opetus/numsym/04/maple/ns04.mpl");
#read("c:\\usr\\heikki\\numsym04\\maple\\ns04.mpl");
read("/p/edu/mat-1.192/ns04.mpl");

>    f:=(t,y)->t;

f := proc (t, y) options operator, arrow; t end proc

>    dsolve({diff(y(t),t)=f(t,y(t)),y(0)=0});

y(t) = 1/2*t^2

>    ytarkka:=unapply(subs(%,y(t)),t);

ytarkka := proc (t) options operator, arrow; 1/2*t^2 end proc

>    ode23step(f,t[n],ytarkka(t[n]),h);

[t[n]+h, 1/2*t[n]^2+1/9*h*(9*t[n]+9/2*h), 0]

>    Y[n+1]:=%[2];

Y[n+1] := 1/2*t[n]^2+1/9*h*(9*t[n]+9/2*h)

>    subs(h=t[n+1]-t[n],%);

1/2*t[n]^2+1/9*(t[n+1]-t[n])*(9/2*t[n]+9/2*t[n+1])

>    simplify(%); #factor(%);

1/2*t[n+1]^2

>    ytarkka(tn+h);

1/2*(tn+h)^2

Yhtyvät, joten lokaali virhe on taas = 0.

y'=t^2

>    f:=(t,y)->t^2;

f := proc (t, y) options operator, arrow; t^2 end proc

>    dsolve({diff(y(t),t)=f(t,y(t)),y(0)=0});

y(t) = 1/3*t^3

>    ytarkka:=unapply(subs(%,y(t)),t);

ytarkka := proc (t) options operator, arrow; 1/3*t^3 end proc

>    ode23step(f,t[n],ytarkka(t[n]),h);

[t[n]+h, 1/3*t[n]^3+1/9*h*(2*t[n]^2+3*(t[n]+1/2*h)^2+4*(t[n]+3/4*h)^2), 1/72*h*(-5*t[n]^2+6*(t[n]+1/2*h)^2+8*(t[n]+3/4*h)^2-9*(t[n]+h)^2)]

>    Y[n+1]:=%[2];

Y[n+1] := 1/3*t[n]^3+1/9*h*(2*t[n]^2+3*(t[n]+1/2*h)^2+4*(t[n]+3/4*h)^2)

>    subs(h=t[n+1]-t[n],%);

1/3*t[n]^3+1/9*(t[n+1]-t[n])*(2*t[n]^2+3*(1/2*t[n]+1/2*t[n+1])^2+4*(1/4*t[n]+3/4*t[n+1])^2)

>    simplify(%);

1/3*t[n+1]^3

>    ytarkka(tn+h);

1/3*(tn+h)^3

Uskomatonta, mutta totta!

>    f:=(t,y)->t^3;

f := proc (t, y) options operator, arrow; t^3 end proc

>    dsolve({diff(y(t),t)=f(t,y(t)),y(0)=0});

y(t) = 1/4*t^4

>    ytarkka:=unapply(subs(%,y(t)),t);

ytarkka := proc (t) options operator, arrow; 1/4*t^4 end proc

>    ode23step(f,t[n],ytarkka(t[n]),h);

[t[n]+h, 1/4*t[n]^4+1/9*h*(2*t[n]^3+3*(t[n]+1/2*h)^3+4*(t[n]+3/4*h)^3), 1/72*h*(-5*t[n]^3+6*(t[n]+1/2*h)^3+8*(t[n]+3/4*h)^3-9*(t[n]+h)^3)]

>    Y[n+1]:=%[2];

Y[n+1] := 1/4*t[n]^4+1/9*h*(2*t[n]^3+3*(t[n]+1/2*h)^3+4*(t[n]+3/4*h)^3)

>    virhearvio:=%%[3];

virhearvio := 1/72*h*(-5*t[n]^3+6*(t[n]+1/2*h)^3+8*(t[n]+3/4*h)^3-9*(t[n]+h)^3)

>   

>    ytarkka(t[n]+h);

1/4*(t[n]+h)^4

>    expand(%);

1/4*t[n]^4+h*t[n]^3+3/2*t[n]^2*h^2+t[n]*h^3+1/4*h^4

>    LKV[n+1]:=%-Y[n+1];

LKV[n+1] := h*t[n]^3+3/2*t[n]^2*h^2+t[n]*h^3+1/4*h^4-1/9*h*(2*t[n]^3+3*(t[n]+1/2*h)^3+4*(t[n]+3/4*h)^3)

>    LKV[n+1]:=simplify(%);

LKV[n+1] := 1/48*h^4

>    simplify(virhearvio);

-1/192*h^3*(24*t[n]+13*h)

>    expand(%);

-1/8*t[n]*h^3-13/192*h^4

Hiukan oudolta näyttää, että virhearvio antaa O(h^3).

Selitys on siinä, että Virhe-estimaattorina on 3:nnen ja toisen kertaluvun menetelmien tulosten erotus.

Se on siten tarkka  funktiolle f(t,y)=t^2, mutta ei funktiolle t^3. Virhe-estimaattori arvioi alemman kertaluvun menetelmän virhettä,

mutta menetelmä laskee ylemmällä (3;lla). Menetelmä on siten tarkka funktiolle f(t,y)=t^3, mutta se ei "tiedä" olevansa niin hyvä.

2.

>    dy:=diff(y(x),x)=2/sqrt(Pi)*exp(-x^2);

dy := diff(y(x),x) = 2/Pi^(1/2)*exp(-x^2)

>    dsolve({dy,y(0)=0},y(x));

y(x) = erf(x)

>    numratk:=dsolve({dy,y(0)=0},y(x),numeric);

numratk := proc (x_rkf45) local res, solnproc, outpoint, ndsol, i; option `Copyright (c) 2000 by Waterloo Maple Inc. All rights reserved.`; _EnvDSNumericSaveDigits := Digits; Digits := 15; if _EnvInFso...

>    [seq([op(numratk(k*0.2)),"erf(x)=",erf(k*0.2)],k=0..10)];

[[x = 0., y(x) = 0.,
[[x = 0., y(x) = 0.,
[[x = 0., y(x) = 0.,
[[x = 0., y(x) = 0.,
[[x = 0., y(x) = 0.,
[[x = 0., y(x) = 0.,

>   

>    numy:=u->subs(numratk(u),y(x));

numy := proc (u) options operator, arrow; subs(numratk(u),y(x)) end proc

Numeerisen ratkaisun jälkikäsittely, kts. HAM s. 175  (myös ...maple/ns04.mpl)

>    numy(1)-erf(1.);

-.22627e-5

>    plot([numy,erf+0.01],0..3);

[Maple Plot]

>    xk:=k*h: h:=0.2:

>    array([seq([xk,numy(xk),evalf(erf(xk))],k=0..20)]);

matrix([[0., 0., 0.], [.2, .222702806851365176, .2227025892], [.4, .428392530623065315, .4283923550], [.6, .603856241704604391, .6038560908], [.8, .742101083482852975, .7421009647], [1.0, .842698530175...

>   

>   

3.

>   

4.

>    restart:

Warning, the name changecoords has been redefined

Taylorin menetelmä yhtälölle y'=f(t,y) tarkoittaa, että muodostetaan ratkaisufunktion y(t) derivaattoja pisteessä t ja käytetään niiden avulla laskettavaa, pisteessä t kehitettyä  n:nnen asteen Taylorin polynomia ratkaisufunkton approksimoimiseen pisteessä t+h. Jos n=1, on kyseessä Eulerin menetelmä.

Koska y'(t)=f(t,y(t)), saadaan derivaatat muodostetuksi ketjusäännön avulla. Jos Maplelle annetaan määrittelemättömiä funktio(lausekke)ita

y(t) ym. sisältävä lauseke ja pyydetään derivoimaan, se soveltaa normaaleja derovoimissääntöjä (kuten ketjusääntöä).

Suoritetaan ensi ideointia.

>    y1:=f(t,y(t));

y1 := f(t,y(t))

>    y2:=diff(y1,t);

y2 := D[1](f)(t,y(t))+D[2](f)(t,y(t))*diff(y(t),t)

>    y2:=subs(diff(y(t),t)=y1,%);

y2 := D[1](f)(t,y(t))+D[2](f)(t,y(t))*f(t,y(t))

>    y3:=diff(y2,t);

y3 := D[1,1](f)(t,y(t))+D[1,2](f)(t,y(t))*diff(y(t),t)+(D[1,2](f)(t,y(t))+D[2,2](f)(t,y(t))*diff(y(t),t))*f(t,y(t))+D[2](f)(t,y(t))*(D[1](f)(t,y(t))+D[2](f)(t,y(t))*diff(y(t),t))
y3 := D[1,1](f)(t,y(t))+D[1,2](f)(t,y(t))*diff(y(t),t)+(D[1,2](f)(t,y(t))+D[2,2](f)(t,y(t))*diff(y(t),t))*f(t,y(t))+D[2](f)(t,y(t))*(D[1](f)(t,y(t))+D[2](f)(t,y(t))*diff(y(t),t))

>    y3:=subs(diff(y(t),t)=y1,%);

y3 := D[1,1](f)(t,y(t))+D[1,2](f)(t,y(t))*f(t,y(t))+(D[1,2](f)(t,y(t))+D[2,2](f)(t,y(t))*f(t,y(t)))*f(t,y(t))+D[2](f)(t,y(t))*(D[1](f)(t,y(t))+D[2](f)(t,y(t))*f(t,y(t)))
y3 := D[1,1](f)(t,y(t))+D[1,2](f)(t,y(t))*f(t,y(t))+(D[1,2](f)(t,y(t))+D[2,2](f)(t,y(t))*f(t,y(t)))*f(t,y(t))+D[2](f)(t,y(t))*(D[1](f)(t,y(t))+D[2](f)(t,y(t))*f(t,y(t)))

Näin voidaan jatkaa. Yleisiä kaavoja ei kannata rakentaa pitkälle, vaan otetaan konkreettinen funktio.

>    f:=(t,y)->1/y^2-y*t;

f := proc (t, y) options operator, arrow; 1/(y^2)-y*t end proc

>    y1;

1/(y(t)^2)-y(t)*t

>    y2;

-y(t)+(-2/y(t)^3-t)*(1/(y(t)^2)-y(t)*t)

>    y3;

-1/(y(t)^2)+y(t)*t+(-1+6/y(t)^4*(1/(y(t)^2)-y(t)*t))*(1/(y(t)^2)-y(t)*t)+(-2/y(t)^3-t)*(-y(t)+(-2/y(t)^3-t)*(1/(y(t)^2)-y(t)*t))

Näiden kokeilujen pohjalta johdutaan tehtäväpaperissa olevaan koodiin:

>    #read("c:\\usr\\heikki\\numsym04\\maple\\ns04.mpl");

>    #read("/home/apiola/opetus/numsym/04/maple/ns04.mpl");

>    read("/p/edu/mat-1.192/ns04.mpl");

>    op(taystep2);

proc (f, t0, y0, h) local y1, y2, t, y, tay2; y1 := f(t,y(t)); y2 := diff(y1,t); y2 := subs(diff(y(t),t) = y1,y2); tay2 := y0+h*y1+1/2*h^2*y2; subs([t = t0, y(t) = y0],tay2) end proc
proc (f, t0, y0, h) local y1, y2, t, y, tay2; y1 := f(t,y(t)); y2 := diff(y1,t); y2 := subs(diff(y(t),t) = y1,y2); tay2 := y0+h*y1+1/2*h^2*y2; subs([t = t0, y(t) = y0],tay2) end proc
proc (f, t0, y0, h) local y1, y2, t, y, tay2; y1 := f(t,y(t)); y2 := diff(y1,t); y2 := subs(diff(y(t),t) = y1,y2); tay2 := y0+h*y1+1/2*h^2*y2; subs([t = t0, y(t) = y0],tay2) end proc
proc (f, t0, y0, h) local y1, y2, t, y, tay2; y1 := f(t,y(t)); y2 := diff(y1,t); y2 := subs(diff(y(t),t) = y1,y2); tay2 := y0+h*y1+1/2*h^2*y2; subs([t = t0, y(t) = y0],tay2) end proc

Testataan, kuten tehtäväpaperissa:

>    f:=(t,y)->y*t;

f := proc (t, y) options operator, arrow; y*t end proc

>     dsolve({diff(y(t),t)=t*y(t),y(0)=1},y(t));

y(t) = exp(1/2*t^2)

>     ytarkka:=subs(%,y(t));

ytarkka := exp(1/2*t^2)

>     Y[0]:=1: h:=0.1: T:=seq(k*h,k=0..10);
 for k to 11 do
 Y[k]:=taystep2(f,T[k],Y[k-1],h):
 end do:

T := 0., .1, .2, .3, .4, .5, .6, .7, .8, .9, 1.0

>    pisteet:=seq([T[k],Y[k-1]],k=1..11);

pisteet := [0., 1], [.1, 1.005000000], [.2, 1.020125250], [.3, 1.045832406], [.4, 1.082907165], [.5, 1.132504314], [.6, 1.196207682], [.7, 1.276114355], [.8, 1.374949412], [.9, 1.496219950], [1.0, 1.64...
pisteet := [0., 1], [.1, 1.005000000], [.2, 1.020125250], [.3, 1.045832406], [.4, 1.082907165], [.5, 1.132504314], [.6, 1.196207682], [.7, 1.276114355], [.8, 1.374949412], [.9, 1.496219950], [1.0, 1.64...

>    plot([[pisteet],ytarkka+0.01],t=0..1);
# Nostetaan tarkkaa hiukan, jotta erottuvat

[Maple Plot]

Nyt on helppoa jatkaa Taylorin 4:nnen asteen menetelmään:

>    restart:

Warning, the name changecoords has been redefined

>    #read("c:\\usr\\heikki\\numsym04\\maple\\ns04.mpl");

>    #read("/home/apiola/opetus/numsym/04/maple/ns04.mpl");
read("/p/edu/mat-1.192/ns04.mpl");

>    op(tay4step);

proc (f, t0, y0, H) local Y1, Y2, Y3, Y4, t, y, tay4, h; Y1 := f(t,y(t)); Y2 := diff(Y1,t); Y2 := subs(diff(y(t),t) = Y1,Y2); Y3 := diff(Y2,t); Y3 := subs(diff(y(t),t) = Y1,Y3); Y4 := diff(Y3,t); Y4 :=...
proc (f, t0, y0, H) local Y1, Y2, Y3, Y4, t, y, tay4, h; Y1 := f(t,y(t)); Y2 := diff(Y1,t); Y2 := subs(diff(y(t),t) = Y1,Y2); Y3 := diff(Y2,t); Y3 := subs(diff(y(t),t) = Y1,Y3); Y4 := diff(Y3,t); Y4 :=...
proc (f, t0, y0, H) local Y1, Y2, Y3, Y4, t, y, tay4, h; Y1 := f(t,y(t)); Y2 := diff(Y1,t); Y2 := subs(diff(y(t),t) = Y1,Y2); Y3 := diff(Y2,t); Y3 := subs(diff(y(t),t) = Y1,Y3); Y4 := diff(Y3,t); Y4 :=...
proc (f, t0, y0, H) local Y1, Y2, Y3, Y4, t, y, tay4, h; Y1 := f(t,y(t)); Y2 := diff(Y1,t); Y2 := subs(diff(y(t),t) = Y1,Y2); Y3 := diff(Y2,t); Y3 := subs(diff(y(t),t) = Y1,Y3); Y4 := diff(Y3,t); Y4 :=...
proc (f, t0, y0, H) local Y1, Y2, Y3, Y4, t, y, tay4, h; Y1 := f(t,y(t)); Y2 := diff(Y1,t); Y2 := subs(diff(y(t),t) = Y1,Y2); Y3 := diff(Y2,t); Y3 := subs(diff(y(t),t) = Y1,Y3); Y4 := diff(Y3,t); Y4 :=...
proc (f, t0, y0, H) local Y1, Y2, Y3, Y4, t, y, tay4, h; Y1 := f(t,y(t)); Y2 := diff(Y1,t); Y2 := subs(diff(y(t),t) = Y1,Y2); Y3 := diff(Y2,t); Y3 := subs(diff(y(t),t) = Y1,Y3); Y4 := diff(Y3,t); Y4 :=...
proc (f, t0, y0, H) local Y1, Y2, Y3, Y4, t, y, tay4, h; Y1 := f(t,y(t)); Y2 := diff(Y1,t); Y2 := subs(diff(y(t),t) = Y1,Y2); Y3 := diff(Y2,t); Y3 := subs(diff(y(t),t) = Y1,Y3); Y4 := diff(Y3,t); Y4 :=...
proc (f, t0, y0, H) local Y1, Y2, Y3, Y4, t, y, tay4, h; Y1 := f(t,y(t)); Y2 := diff(Y1,t); Y2 := subs(diff(y(t),t) = Y1,Y2); Y3 := diff(Y2,t); Y3 := subs(diff(y(t),t) = Y1,Y3); Y4 := diff(Y3,t); Y4 :=...
proc (f, t0, y0, H) local Y1, Y2, Y3, Y4, t, y, tay4, h; Y1 := f(t,y(t)); Y2 := diff(Y1,t); Y2 := subs(diff(y(t),t) = Y1,Y2); Y3 := diff(Y2,t); Y3 := subs(diff(y(t),t) = Y1,Y3); Y4 := diff(Y3,t); Y4 :=...
proc (f, t0, y0, H) local Y1, Y2, Y3, Y4, t, y, tay4, h; Y1 := f(t,y(t)); Y2 := diff(Y1,t); Y2 := subs(diff(y(t),t) = Y1,Y2); Y3 := diff(Y2,t); Y3 := subs(diff(y(t),t) = Y1,Y3); Y4 := diff(Y3,t); Y4 :=...
proc (f, t0, y0, H) local Y1, Y2, Y3, Y4, t, y, tay4, h; Y1 := f(t,y(t)); Y2 := diff(Y1,t); Y2 := subs(diff(y(t),t) = Y1,Y2); Y3 := diff(Y2,t); Y3 := subs(diff(y(t),t) = Y1,Y3); Y4 := diff(Y3,t); Y4 :=...
proc (f, t0, y0, H) local Y1, Y2, Y3, Y4, t, y, tay4, h; Y1 := f(t,y(t)); Y2 := diff(Y1,t); Y2 := subs(diff(y(t),t) = Y1,Y2); Y3 := diff(Y2,t); Y3 := subs(diff(y(t),t) = Y1,Y3); Y4 := diff(Y3,t); Y4 :=...
proc (f, t0, y0, H) local Y1, Y2, Y3, Y4, t, y, tay4, h; Y1 := f(t,y(t)); Y2 := diff(Y1,t); Y2 := subs(diff(y(t),t) = Y1,Y2); Y3 := diff(Y2,t); Y3 := subs(diff(y(t),t) = Y1,Y3); Y4 := diff(Y3,t); Y4 :=...
proc (f, t0, y0, H) local Y1, Y2, Y3, Y4, t, y, tay4, h; Y1 := f(t,y(t)); Y2 := diff(Y1,t); Y2 := subs(diff(y(t),t) = Y1,Y2); Y3 := diff(Y2,t); Y3 := subs(diff(y(t),t) = Y1,Y3); Y4 := diff(Y3,t); Y4 :=...
proc (f, t0, y0, H) local Y1, Y2, Y3, Y4, t, y, tay4, h; Y1 := f(t,y(t)); Y2 := diff(Y1,t); Y2 := subs(diff(y(t),t) = Y1,Y2); Y3 := diff(Y2,t); Y3 := subs(diff(y(t),t) = Y1,Y3); Y4 := diff(Y3,t); Y4 :=...

Kaksi viimeistä riviä edustavat "laiskan Maple-miehen" tapaa kerätä kunkin h:n potenssin kertoimet. (Varmaan löytyy suorempiakin.). Tässä täytyy vielä konvertoida tulos polynomiksi, sillä taylor  palauttaa "sarja-tietorakenteen", jossa on jäännöstermi mukana.

(Kts. ?taylor)

>    f:=(t,y)->y*t;

f := proc (t, y) options operator, arrow; y*t end proc

Kiintoisaa on verrata tay4step:iä ja rk4step:iä

>    op(rk4step);

proc (f, tn, yn, h) local n, t, y, k1, k2, k3, k4, yuusi, tuusi; k1 := h*f(tn,yn); k2 := h*f(tn+1/2*h,yn+1/2*k1); k3 := h*f(tn+1/2*h,yn+1/2*k2); k4 := h*f(tn+h,yn+k3); yuusi := yn+1/6*k1+1/3*k2+1/3*k3+...
proc (f, tn, yn, h) local n, t, y, k1, k2, k3, k4, yuusi, tuusi; k1 := h*f(tn,yn); k2 := h*f(tn+1/2*h,yn+1/2*k1); k3 := h*f(tn+1/2*h,yn+1/2*k2); k4 := h*f(tn+h,yn+k3); yuusi := yn+1/6*k1+1/3*k2+1/3*k3+...
proc (f, tn, yn, h) local n, t, y, k1, k2, k3, k4, yuusi, tuusi; k1 := h*f(tn,yn); k2 := h*f(tn+1/2*h,yn+1/2*k1); k3 := h*f(tn+1/2*h,yn+1/2*k2); k4 := h*f(tn+h,yn+k3); yuusi := yn+1/6*k1+1/3*k2+1/3*k3+...
proc (f, tn, yn, h) local n, t, y, k1, k2, k3, k4, yuusi, tuusi; k1 := h*f(tn,yn); k2 := h*f(tn+1/2*h,yn+1/2*k1); k3 := h*f(tn+1/2*h,yn+1/2*k2); k4 := h*f(tn+h,yn+k3); yuusi := yn+1/6*k1+1/3*k2+1/3*k3+...
proc (f, tn, yn, h) local n, t, y, k1, k2, k3, k4, yuusi, tuusi; k1 := h*f(tn,yn); k2 := h*f(tn+1/2*h,yn+1/2*k1); k3 := h*f(tn+1/2*h,yn+1/2*k2); k4 := h*f(tn+h,yn+k3); yuusi := yn+1/6*k1+1/3*k2+1/3*k3+...
proc (f, tn, yn, h) local n, t, y, k1, k2, k3, k4, yuusi, tuusi; k1 := h*f(tn,yn); k2 := h*f(tn+1/2*h,yn+1/2*k1); k3 := h*f(tn+1/2*h,yn+1/2*k2); k4 := h*f(tn+h,yn+k3); yuusi := yn+1/6*k1+1/3*k2+1/3*k3+...
proc (f, tn, yn, h) local n, t, y, k1, k2, k3, k4, yuusi, tuusi; k1 := h*f(tn,yn); k2 := h*f(tn+1/2*h,yn+1/2*k1); k3 := h*f(tn+1/2*h,yn+1/2*k2); k4 := h*f(tn+h,yn+k3); yuusi := yn+1/6*k1+1/3*k2+1/3*k3+...
proc (f, tn, yn, h) local n, t, y, k1, k2, k3, k4, yuusi, tuusi; k1 := h*f(tn,yn); k2 := h*f(tn+1/2*h,yn+1/2*k1); k3 := h*f(tn+1/2*h,yn+1/2*k2); k4 := h*f(tn+h,yn+k3); yuusi := yn+1/6*k1+1/3*k2+1/3*k3+...

>    h:='h':

>    rk:=rk4step(f,t0,y0,h):

>    t4:=tay4step(f,t0,y0,'h'):

>    rk;

y0+1/6*h*y0*t0+1/3*h*(y0+1/2*h*y0*t0)*(t0+1/2*h)+1/3*h*(y0+1/2*h*(y0+1/2*h*y0*t0)*(t0+1/2*h))*(t0+1/2*h)+1/6*h*(y0+h*(y0+1/2*h*(y0+1/2*h*y0*t0)*(t0+1/2*h))*(t0+1/2*h))*(t0+h)
y0+1/6*h*y0*t0+1/3*h*(y0+1/2*h*y0*t0)*(t0+1/2*h)+1/3*h*(y0+1/2*h*(y0+1/2*h*y0*t0)*(t0+1/2*h))*(t0+1/2*h)+1/6*h*(y0+h*(y0+1/2*h*(y0+1/2*h*y0*t0)*(t0+1/2*h))*(t0+1/2*h))*(t0+h)

>    t4;

y0+h*y0*t0+(1/2*y0*t0^2+1/2*y0)*h^2+(1/6*y0*t0^3+1/2*y0*t0)*h^3+(1/24*y0*t0^4+1/4*y0*t0^2+1/8*y0)*h^4

Tässä tapauksessa taylorin menetelmä antaa jopa yksinkertaisemman lausekkeen.

>    tay4step(f,t0,y0,0.1);

1.005012500*y0+.1005000000*y0*t0+.5025000000e-2*y0*t0^2+.1666666667e-3*y0*t0^3+.4166666667e-5*y0*t0^4

>    f:=(t,y)->1/y^2-y*t;

f := proc (t, y) options operator, arrow; 1/(y^2)-y*t end proc

>    t4:=tay4step(f,t0,y0,h);

t4 := y0+1/24*(24*y0^9-24*y0^12*t0)/y0^11*h+1/24*(-24*y0^6+12*y0^9*t0+12*y0^12*t0^2-12*y0^12)/y0^11*h^2+1/24*(40*y0^3-48*y0^6*t0+12*y0^9*t0^2-4*y0^12*t0^3+12*y0^12*t0)/y0^11*h^3+1/24*(-80+140*y0^3*t0-6...
t4 := y0+1/24*(24*y0^9-24*y0^12*t0)/y0^11*h+1/24*(-24*y0^6+12*y0^9*t0+12*y0^12*t0^2-12*y0^12)/y0^11*h^2+1/24*(40*y0^3-48*y0^6*t0+12*y0^9*t0^2-4*y0^12*t0^3+12*y0^12*t0)/y0^11*h^3+1/24*(-80+140*y0^3*t0-6...

>    t4step_f:=unapply(t4,t0,y0,h);

t4step_f := proc (t0, y0, h) options operator, arrow; y0+1/24*(24*y0^9-24*y0^12*t0)/y0^11*h+1/24*(-24*y0^6+12*y0^9*t0+12*y0^12*t0^2-12*y0^12)/y0^11*h^2+1/24*(40*y0^3-48*y0^6*t0+12*y0^9*t0^2-4*y0^12*t0^...
t4step_f := proc (t0, y0, h) options operator, arrow; y0+1/24*(24*y0^9-24*y0^12*t0)/y0^11*h+1/24*(-24*y0^6+12*y0^9*t0+12*y0^12*t0^2-12*y0^12)/y0^11*h^2+1/24*(40*y0^3-48*y0^6*t0+12*y0^9*t0^2-4*y0^12*t0^...
t4step_f := proc (t0, y0, h) options operator, arrow; y0+1/24*(24*y0^9-24*y0^12*t0)/y0^11*h+1/24*(-24*y0^6+12*y0^9*t0+12*y0^12*t0^2-12*y0^12)/y0^11*h^2+1/24*(40*y0^3-48*y0^6*t0+12*y0^9*t0^2-4*y0^12*t0^...

Meillä on nyt funktio t4step_f , joka suorittaa Taylorin 4:nnen asteen menetelmän askeleen juuri tähän konkreettiseen funktioon f liittyen. Huomataan, että unapplyn  käyttö on olennaista. Tässä vaiheessa voidaan

tehdä haluttuja sievennysoperaatioita.

Kirjoitetaan nyt funktio, joka laskee n askelta käyttäen tätä askelfunktiota. Nyt siis funktio f ei enää ole argumenttilistalla, vaan sen vaikutus tulee mukaan kutsuttaessa t4step_f -funktiota.

>    op(tay4_f);

proc (vali, y0, n) local a, b, k, h, t, y; a := vali[1]; b := vali[2]; h := (b-a)/n; a := evalf(a); b := evalf(b); h := evalf(h); t[0] := a; y[0] := y0; for k from 0 to n-1 do y[k+1] := t4step_f(t[k],y...
proc (vali, y0, n) local a, b, k, h, t, y; a := vali[1]; b := vali[2]; h := (b-a)/n; a := evalf(a); b := evalf(b); h := evalf(h); t[0] := a; y[0] := y0; for k from 0 to n-1 do y[k+1] := t4step_f(t[k],y...
proc (vali, y0, n) local a, b, k, h, t, y; a := vali[1]; b := vali[2]; h := (b-a)/n; a := evalf(a); b := evalf(b); h := evalf(h); t[0] := a; y[0] := y0; for k from 0 to n-1 do y[k+1] := t4step_f(t[k],y...
proc (vali, y0, n) local a, b, k, h, t, y; a := vali[1]; b := vali[2]; h := (b-a)/n; a := evalf(a); b := evalf(b); h := evalf(h); t[0] := a; y[0] := y0; for k from 0 to n-1 do y[k+1] := t4step_f(t[k],y...
proc (vali, y0, n) local a, b, k, h, t, y; a := vali[1]; b := vali[2]; h := (b-a)/n; a := evalf(a); b := evalf(b); h := evalf(h); t[0] := a; y[0] := y0; for k from 0 to n-1 do y[k+1] := t4step_f(t[k],y...
proc (vali, y0, n) local a, b, k, h, t, y; a := vali[1]; b := vali[2]; h := (b-a)/n; a := evalf(a); b := evalf(b); h := evalf(h); t[0] := a; y[0] := y0; for k from 0 to n-1 do y[k+1] := t4step_f(t[k],y...
proc (vali, y0, n) local a, b, k, h, t, y; a := vali[1]; b := vali[2]; h := (b-a)/n; a := evalf(a); b := evalf(b); h := evalf(h); t[0] := a; y[0] := y0; for k from 0 to n-1 do y[k+1] := t4step_f(t[k],y...
proc (vali, y0, n) local a, b, k, h, t, y; a := vali[1]; b := vali[2]; h := (b-a)/n; a := evalf(a); b := evalf(b); h := evalf(h); t[0] := a; y[0] := y0; for k from 0 to n-1 do y[k+1] := t4step_f(t[k],y...
proc (vali, y0, n) local a, b, k, h, t, y; a := vali[1]; b := vali[2]; h := (b-a)/n; a := evalf(a); b := evalf(b); h := evalf(h); t[0] := a; y[0] := y0; for k from 0 to n-1 do y[k+1] := t4step_f(t[k],y...
proc (vali, y0, n) local a, b, k, h, t, y; a := vali[1]; b := vali[2]; h := (b-a)/n; a := evalf(a); b := evalf(b); h := evalf(h); t[0] := a; y[0] := y0; for k from 0 to n-1 do y[k+1] := t4step_f(t[k],y...
proc (vali, y0, n) local a, b, k, h, t, y; a := vali[1]; b := vali[2]; h := (b-a)/n; a := evalf(a); b := evalf(b); h := evalf(h); t[0] := a; y[0] := y0; for k from 0 to n-1 do y[k+1] := t4step_f(t[k],y...
proc (vali, y0, n) local a, b, k, h, t, y; a := vali[1]; b := vali[2]; h := (b-a)/n; a := evalf(a); b := evalf(b); h := evalf(h); t[0] := a; y[0] := y0; for k from 0 to n-1 do y[k+1] := t4step_f(t[k],y...
proc (vali, y0, n) local a, b, k, h, t, y; a := vali[1]; b := vali[2]; h := (b-a)/n; a := evalf(a); b := evalf(b); h := evalf(h); t[0] := a; y[0] := y0; for k from 0 to n-1 do y[k+1] := t4step_f(t[k],y...

Kutsuparametreina ovat vali , alkuarvo  välin alkupisteessä ja askelten lukumäärä. (Huomaa, että vali j a y0 ovat aivan samoin kuin Matlabin ODE-funktioissa. Askeleen suorittava t4step_f on "kolvattu" kiinteän nimisenä koodiin.

>    T4pisteet:=tay4_f([1,2],1,10);

T4pisteet := [[1., 1], [1.100000000, .9954750000], [1.200000000, .9836463965], [1.300000000, .9667976911], [1.400000000, .9468193314], [1.500000000, .9252337022], [1.600000000, .9032115004], [1.7000000...
T4pisteet := [[1., 1], [1.100000000, .9954750000], [1.200000000, .9836463965], [1.300000000, .9667976911], [1.400000000, .9468193314], [1.500000000, .9252337022], [1.600000000, .9032115004], [1.7000000...
T4pisteet := [[1., 1], [1.100000000, .9954750000], [1.200000000, .9836463965], [1.300000000, .9667976911], [1.400000000, .9468193314], [1.500000000, .9252337022], [1.600000000, .9032115004], [1.7000000...

Siistiä!

Verrataan RK4-pisteisiin:

>    # op(RK4);

>    RK4(f,[1,2],1,10);

[[1, 1], [1.100000000, .9954745362], [1.200000000, .9836448154], [1.300000000, .9667952785], [1.400000000, .9468167382], [1.500000000, .9252316601], [1.600000000, .9032106430], [1.700000000, .881596397...
[[1, 1], [1.100000000, .9954745362], [1.200000000, .9836448154], [1.300000000, .9667952785], [1.400000000, .9468167382], [1.500000000, .9252316601], [1.600000000, .9032106430], [1.700000000, .881596397...
[[1, 1], [1.100000000, .9954745362], [1.200000000, .9836448154], [1.300000000, .9667952785], [1.400000000, .9468167382], [1.500000000, .9252316601], [1.600000000, .9032106430], [1.700000000, .881596397...

>   

>    T4pisteet[-1][-1];  # Viimeisen parin viimeinen alkio, eli y(2):n approksimaatio

.8235667948

>    RK4(f,[1,2],1,10)[-1][-1];

.8235722752

>    tay4_f([1,2],1,10)[-1][-1]; # Yllä oleva yhdellä rivillä.

.8235667948

5:n numeron tarkkuudella samat (6:nnessa yhden numeron ero). Kumpi on tarkempi?

Nyt päästään tutkimaan tehtävän tilannetta

Katsotaan tehtävässä kysyttyja askelpituuksia.

>    Digits:=10:    # Oletusarvo

>    tayarvot:=seq(tay4_f([1,2],1,2^k)[-1][-1],k=2..10);

tayarvot := .8235060350, .8235650250, .8235677448, .8235678881, .8235678963, .8235678972, .8235678979, .8235678975, .8235679647

>    RKarvot:=seq(RK4(f,[1,2],1,2^k)[-1][-1],k=2..10);

RKarvot := .8237784359, .8235791252, .8235685130, .8235679329, .8235678991, .8235678971, .8235678969, .8235678977, .8235679659

Mikä on tarkin arvo?  Turha toivoa, että kahta viimeistä numeroa voisi saada oikein. Askelpituuden puolittaminen ei loputtomasti lisää tarkkuutta, vaan jostain alkaen tulokset alkavat huonontua.

Otetaan viimeistä edellisten keskiarvo:

>    tarkinkai:=.8235678976;

tarkinkai := .8235678976

>    tayvirheet:=seq((tarkinkai-tayarvot[k]),k=1..nops([tayarvot])-1);

tayvirheet := .618626e-4, .28726e-5, .1528e-6, .95e-8, .13e-8, .4e-9, -.3e-9, .1e-9

>    RKvirheet:=seq((tarkinkai-RKarvot[k]),k=1..nops([tayarvot])-1);

RKvirheet := -.2105383e-3, -.112276e-4, -.6154e-6, -.353e-7, -.15e-8, .5e-9, .7e-9, -.1e-9

>    seq(tayvirheet[i+1]/tayvirheet[i],i=1..nops([tayarvot])-2);

.4643516438e-1, .5319223004e-1, .6217277487e-1, .1368421053, .3076923077, -.7500000000, -.3333333333

>    seq(RKvirheet[i+1]/RKvirheet[i],i=1..nops([tayarvot])-2);

.5332806430e-1, .5481135773e-1, .5736106597e-1, .4249291785e-1, -.3333333333, 1.400000000, -.1428571429

>    taulukko:=<<h,seq(2.^(-k),k=2..9)>|<Taylor4,tayarvot[1..-2]>|<RK4,RKarvot[1..-2]>|<Tay4Virhe,tayvirheet>|<RK4Virhe,RKvirheet>>;

taulukko := Matrix(%id = 138034456)

>    RKarvot[1..-2];

.8237784359, .8235791252, .8235685130, .8235679329, .8235678991, .8235678971, .8235678969, .8235678977

>   

>   

>    tayarvot20:=seq(tay4_f([1,2],1,2^k)[-1][-1],k=2..10);

tayarvot20 := .8235060350, .8235650250, .8235677448, .8235678881, .8235678963, .8235678972, .8235678979, .8235678975, .8235679647

>    RKarvot20:=seq(RK4(f,[1,2],1,2^k)[-1][-1],k=2..10);

RKarvot20 := .8237784359, .8235791252, .8235685130, .8235679329, .8235678991, .8235678971, .8235678969, .8235678977, .8235679659

>    melkeintarkka:=tayarvot20[-1];

melkeintarkka := .8235679647

>    Digits:=10:

>    tayvirheet:=seq((melkeintarkka-tayarvot[k]),k=1..nops([tayarvot20]));

tayvirheet := .619297e-4, .29397e-5, .2199e-6, .766e-7, .684e-7, .675e-7, .668e-7, .672e-7, 0.

>    RKvirheet:=seq((melkeintarkka-RKarvot[k]),k=1..nops([tayarvot]));

RKvirheet := -.2104712e-3, -.111605e-4, -.5483e-6, .318e-7, .656e-7, .676e-7, .678e-7, .670e-7, -.12e-8

>    seq(tayvirheet[i+1]/tayvirheet[i],i=1..nops([tayarvot20])-1);

.4746833910e-1, .7480355138e-1, .3483401546, .8929503916, .9868421053, .9896296296, 1.005988024, 0.

>    seq(RKvirheet[i+1]/RKvirheet[i],i=1..nops([tayarvot])-1);

.5302625727e-1, .4912862327e-1, -.5799744665e-1, 2.062893082, 1.030487805, 1.002958580, .9882005900, -.1791044776e-1

>   

>    taulukko:=<<h,seq(2.^(-k),k=2..10)>|<Taylor4,tayarvot>|<RK4,RKarvot>|<Tay4Virhe,tayvirheet>|<RK4Virhe,RKvirheet>>;

taulukko := Matrix(%id = 138826612)

Kysymys: Kuinka monta oikeaa numeroa?

Kun taulukoa katsoo, niin h=2^(-5)  on pienin askel, jolla virhe pienenee normaalin näköisesti. Siitä alaspäin tulokset jopa huononevat.

Lisätään ensin laskentatarkkuutta.

>    tarkinkai;  # Ainakin 2 viimeistä numeroa ovat "satunnaislukuja".

.8235678976

Sama tarkemmin.

>    Digits:=20:

>    tayarvot20:=seq(tay4_f([1,2],1,2^k)[-1][-1],k=2..10);

tayarvot20 := .82350603507003191406, .82356502512718106796, .82356774486818922615, .82356788832383738755, .82356789653651435707, .82356789702748726707, .82356789705749470316, .82356789705934926674, .82...
tayarvot20 := .82350603507003191406, .82356502512718106796, .82356774486818922615, .82356788832383738755, .82356789653651435707, .82356789702748726707, .82356789705749470316, .82356789705934926674, .82...

>    RKarvot20:=seq(RK4(f,[1,2],1,2^k)[-1][-1],k=2..10);

RKarvot20 := .82377843583996561178, .82357912533565830630, .82356851293146592676, .82356793281027476015, .82356789920873972585, .82356789719115701613, .82356789706762018052, .82356789705997887312, .823...
RKarvot20 := .82377843583996561178, .82357912533565830630, .82356851293146592676, .82356793281027476015, .82356789920873972585, .82356789719115701613, .82356789706762018052, .82356789705997887312, .823...

>    tarkinkai20:=tayarvot20[-1];

tarkinkai20 := .82356789705946452853

>    tayvirheet20:=seq((tarkinkai20-tayarvot[k]),k=1..nops([tayarvot20]));

tayvirheet20 := .6186205946452853e-4, .287205946452853e-5, .15225946452853e-6, .895946452853e-8, .75946452853e-9, -.14053547147e-9, -.84053547147e-9, -.44053547147e-9, -.6764053547147e-7
tayvirheet20 := .6186205946452853e-4, .287205946452853e-5, .15225946452853e-6, .895946452853e-8, .75946452853e-9, -.14053547147e-9, -.84053547147e-9, -.44053547147e-9, -.6764053547147e-7

>    RKvirheet20:=seq((tarkinkai20-RKarvot[k]),k=1..nops([tayarvot20]));

RKvirheet20 := -.21053884053547147e-3, -.1122814053547147e-4, -.61594053547147e-6, -.3584053547147e-7, -.204053547147e-8, -.4053547147e-10, .15946452853e-9, -.64053547147e-9, -.6884053547147e-7
RKvirheet20 := -.21053884053547147e-3, -.1122814053547147e-4, -.61594053547147e-6, -.3584053547147e-7, -.204053547147e-8, -.4053547147e-10, .15946452853e-9, -.64053547147e-9, -.6884053547147e-7

>    2.^(-4);

.62500000000000000000e-1

Globaalin virheen tulisi pienetyä suunnilleen tällä kertoimella, kun askel puolittuu.

>    seq(tayvirheet20[i+1]/tayvirheet20[i],i=1..nops([tayarvot20])-1);

.46426832365245744711e-1, .53014036237416319535e-1, .58843399694547052651e-1, .84766731997387247431e-1, -.18504547110582879035, 5.9809488855589634291, .52411288568173578451, 153.54163251772621215
.46426832365245744711e-1, .53014036237416319535e-1, .58843399694547052651e-1, .84766731997387247431e-1, -.18504547110582879035, 5.9809488855589634291, .52411288568173578451, 153.54163251772621215

>    seq(RKvirheet20[i+1]/RKvirheet20[i],i=1..nops([tayarvot20])-1);

.53330494776709663481e-1, .54856860183181402986e-1, .58188304564231935226e-1, .56933732842644591569e-1, .19865114837135509921e-1, -3.9339502600338202012, -4.0167896733817910470, 107.47341644247129332
.53330494776709663481e-1, .54856860183181402986e-1, .58188304564231935226e-1, .56933732842644591569e-1, .19865114837135509921e-1, -3.9339502600338202012, -4.0167896733817910470, 107.47341644247129332

Virhekäytös on järkevännäköistä arvoon i=5 saakka, eli h=1/2^6 = 1/64.

>    tayarvot20[5],RKarvot20[5];

.82356789653651435707, .82356789920873972585

Kertalukua lisää, yleinen Taystep

>    restart:

Warning, the name changecoords has been redefined

>    #read("c:\\usr\\heikki\\numsym04\\maple\\ns04.mpl");

>    #read("/home/apiola/opetus/numsym/04/maple/ns04.mpl");
read("/p/edu/mat-1.192/ns04.mpl");

>   

>    op(Taystep);

proc (f, N) local Y, k, t, y, tay, t0, y0, h; Y := array(1 .. N); Y[1] := f(t,y(t)); for k from 2 to N do Y[k] := diff(Y[k-1],t); Y[k] := subs(diff(y(t),t) = Y[1],Y[k]) end do; k := 'k'; tay := y0+sum(...
proc (f, N) local Y, k, t, y, tay, t0, y0, h; Y := array(1 .. N); Y[1] := f(t,y(t)); for k from 2 to N do Y[k] := diff(Y[k-1],t); Y[k] := subs(diff(y(t),t) = Y[1],Y[k]) end do; k := 'k'; tay := y0+sum(...
proc (f, N) local Y, k, t, y, tay, t0, y0, h; Y := array(1 .. N); Y[1] := f(t,y(t)); for k from 2 to N do Y[k] := diff(Y[k-1],t); Y[k] := subs(diff(y(t),t) = Y[1],Y[k]) end do; k := 'k'; tay := y0+sum(...
proc (f, N) local Y, k, t, y, tay, t0, y0, h; Y := array(1 .. N); Y[1] := f(t,y(t)); for k from 2 to N do Y[k] := diff(Y[k-1],t); Y[k] := subs(diff(y(t),t) = Y[1],Y[k]) end do; k := 'k'; tay := y0+sum(...
proc (f, N) local Y, k, t, y, tay, t0, y0, h; Y := array(1 .. N); Y[1] := f(t,y(t)); for k from 2 to N do Y[k] := diff(Y[k-1],t); Y[k] := subs(diff(y(t),t) = Y[1],Y[k]) end do; k := 'k'; tay := y0+sum(...
proc (f, N) local Y, k, t, y, tay, t0, y0, h; Y := array(1 .. N); Y[1] := f(t,y(t)); for k from 2 to N do Y[k] := diff(Y[k-1],t); Y[k] := subs(diff(y(t),t) = Y[1],Y[k]) end do; k := 'k'; tay := y0+sum(...
proc (f, N) local Y, k, t, y, tay, t0, y0, h; Y := array(1 .. N); Y[1] := f(t,y(t)); for k from 2 to N do Y[k] := diff(Y[k-1],t); Y[k] := subs(diff(y(t),t) = Y[1],Y[k]) end do; k := 'k'; tay := y0+sum(...
proc (f, N) local Y, k, t, y, tay, t0, y0, h; Y := array(1 .. N); Y[1] := f(t,y(t)); for k from 2 to N do Y[k] := diff(Y[k-1],t); Y[k] := subs(diff(y(t),t) = Y[1],Y[k]) end do; k := 'k'; tay := y0+sum(...
proc (f, N) local Y, k, t, y, tay, t0, y0, h; Y := array(1 .. N); Y[1] := f(t,y(t)); for k from 2 to N do Y[k] := diff(Y[k-1],t); Y[k] := subs(diff(y(t),t) = Y[1],Y[k]) end do; k := 'k'; tay := y0+sum(...
proc (f, N) local Y, k, t, y, tay, t0, y0, h; Y := array(1 .. N); Y[1] := f(t,y(t)); for k from 2 to N do Y[k] := diff(Y[k-1],t); Y[k] := subs(diff(y(t),t) = Y[1],Y[k]) end do; k := 'k'; tay := y0+sum(...

>    f:=(t,y)->1/y^2-y*t;

f := proc (t, y) options operator, arrow; 1/(y^2)-y*t end proc

>    MainTaylor(4,f,[1,2],1,10);

[[1., 1], [1.100000000, .9954750000], [1.200000000, .9836463963], [1.300000000, .9667976913], [1.400000000, .9468193317], [1.500000000, .9252337025], [1.600000000, .9032115004], [1.700000000, .88159565...
[[1., 1], [1.100000000, .9954750000], [1.200000000, .9836463963], [1.300000000, .9667976913], [1.400000000, .9468193317], [1.500000000, .9252337025], [1.600000000, .9032115004], [1.700000000, .88159565...
[[1., 1], [1.100000000, .9954750000], [1.200000000, .9836463963], [1.300000000, .9667976913], [1.400000000, .9468193317], [1.500000000, .9252337025], [1.600000000, .9032115004], [1.700000000, .88159565...

>    MainTaylor(5,f,[1,2],1,10);

[[1., 1], [1.100000000, .9954770000], [1.200000000, .9836486133], [1.300000000, .9667995333], [1.400000000, .9468207250], [1.500000000, .9252347875], [1.600000000, .9032124675], [1.700000000, .88159664...
[[1., 1], [1.100000000, .9954770000], [1.200000000, .9836486133], [1.300000000, .9667995333], [1.400000000, .9468207250], [1.500000000, .9252347875], [1.600000000, .9032124675], [1.700000000, .88159664...
[[1., 1], [1.100000000, .9954770000], [1.200000000, .9836486133], [1.300000000, .9667995333], [1.400000000, .9468207250], [1.500000000, .9252347875], [1.600000000, .9032124675], [1.700000000, .88159664...

>    MainTaylor(6,f,[1,2],1,10);

[[1., 1], [1.100000000, .9954766917], [1.200000000, .9836482613], [1.300000000, .9667992349], [1.400000000, .9468205103], [1.500000000, .9252346550], [1.600000000, .9032124008], [1.700000000, .88159662...
[[1., 1], [1.100000000, .9954766917], [1.200000000, .9836482613], [1.300000000, .9667992349], [1.400000000, .9468205103], [1.500000000, .9252346550], [1.600000000, .9032124008], [1.700000000, .88159662...
[[1., 1], [1.100000000, .9954766917], [1.200000000, .9836482613], [1.300000000, .9667992349], [1.400000000, .9468205103], [1.500000000, .9252346550], [1.600000000, .9032124008], [1.700000000, .88159662...

>    MainTaylor(6,f,[1,2],1,20);

[[1., 1], [1.050000000, .9988109951], [1.100000000, .9954767260], [1.150000000, .9903231775], [1.200000000, .9836483007], [1.250000000, .9757243506], [1.300000000, .9667992701], [1.350000000, .95709750...
[[1., 1], [1.050000000, .9988109951], [1.100000000, .9954767260], [1.150000000, .9903231775], [1.200000000, .9836483007], [1.250000000, .9757243506], [1.300000000, .9667992701], [1.350000000, .95709750...
[[1., 1], [1.050000000, .9988109951], [1.100000000, .9954767260], [1.150000000, .9903231775], [1.200000000, .9836483007], [1.250000000, .9757243506], [1.300000000, .9667992701], [1.350000000, .95709750...
[[1., 1], [1.050000000, .9988109951], [1.100000000, .9954767260], [1.150000000, .9903231775], [1.200000000, .9836483007], [1.250000000, .9757243506], [1.300000000, .9667992701], [1.350000000, .95709750...
[[1., 1], [1.050000000, .9988109951], [1.100000000, .9954767260], [1.150000000, .9903231775], [1.200000000, .9836483007], [1.250000000, .9757243506], [1.300000000, .9667992701], [1.350000000, .95709750...

>    melkeintarkka;

melkeintarkka

>    MainTaylor(7,f,[1,2],1,10);

[[1., 1], [1.100000000, .9954767305], [1.200000000, .9836483057], [1.300000000, .9667992746], [1.400000000, .9468205422], [1.500000000, .9252346786], [1.600000000, .9032124167], [1.700000000, .88159663...
[[1., 1], [1.100000000, .9954767305], [1.200000000, .9836483057], [1.300000000, .9667992746], [1.400000000, .9468205422], [1.500000000, .9252346786], [1.600000000, .9032124167], [1.700000000, .88159663...
[[1., 1], [1.100000000, .9954767305], [1.200000000, .9836483057], [1.300000000, .9667992746], [1.400000000, .9468205422], [1.500000000, .9252346786], [1.600000000, .9032124167], [1.700000000, .88159663...

>   

Kertalukua 7 olevalla Taylorilla päästään jo 10:llä askeleella tarkkaan (10 numeroa) tulokseen.

>   

Analyyttinen ratkaisu on tolkuton, "numeric" voi aiheuttaa työarkin korruptoitumista.

>    #nratk:=dsolve({diff(y(t),t)=f(t,y(t)),y(1)=1},y(t),numeric);

>