Metoda prost\303\251 iterace (Mpi)
Demonstra\304\215n\303\255 program
#START:
Inicializace (tuto \304\215\303\241st sta\304\215\303\255 prov\303\251st jednou na za\304\215\303\241tku pr\303\241ce)
restart;
Procedury pro metodu
maxiter:=40; # maxim\303\241ln\303\255 po\304\215et iterac\303\255
Mpi :=
proc (phi,a,b,odhad)
global plotosa, plotphi, plotiter, complplot;
local j,k,plotstart;
iterace (phi,a,b,odhad);
if infolevel[res]<8 then RETURN fi;
plotstart:=plottools[disk]([x[0],x[0]],(b-a)/60,color=yellow):
plotosa:=plot(x->x, a..b, color=BLACK, numpoints=2):
plotphi:=plot(phi, a..b, color=BLUE):
complplot[-1]:=plots[display]({plotphi, plotosa, plotstart}, scaling=CONSTRAINED):
for j from 0 to i-1 do
plotiter[j]:=plot([[x[j],x[j]],[x[j],x[j+1]],[x[j+1],x[j+1]]], a..b, color=RED
, title=cat("x=",convert(x[j+1], string)) # pokus o vyps\303\241n\303\255 x[j] do animace
):
complplot[j]:=plots[display]({seq(plotiter[k], k=0..j), plotphi, plotosa, plotstart}, scaling=CONSTRAINED)
od:
plots[display](seq(complplot[j], j=-1..i-1), insequence=true);
end:
iterace :=
proc (phi,a,b,odhad)
global i, x;
#x := vector([0..maxiter]);
x[0]:=odhad;
tisk(0);
for i from 1 to maxiter
do
x[i]:=phi(x[i-1]);
tisk(i);
if konec(x[i], x[i-1]) then RETURN(x[i]) fi;
od;
i:=maxiter
end: ## Mpi se zadanou itera\304\215n\303\255 funkc\303\255 phi (\305\231e\305\241\303\255 rovnici phi(x) = x)
tisk :=
proc (i)
if infolevel[res]>=4 then lprint(`x[`. i. `]=`, x[i], `f(x[`. i. `])=`, f(x[i]))
elif infolevel[res]>=2 then lprint(`x[`. i. `]=`, x[i])
fi
end:
Podm\303\255nka ukon\304\215en\303\255:
konec := proc (x, lastx)
evalf(abs(x-lastx)<epsilon) or
evalf(x<a) or evalf(x>b)
end:
epsilon := 1e-5:
S\303\255la \304\215\303\241ry pro grafy.
plots[setoptions](thickness=2, scaling=constrained);
P\305\231\303\255klady pou\305\276it\303\255
Itera\304\215n\303\255 funkce:
QyQ+SSRwaGlHNiJmKjYjSSJ4R0YlRiU2JEkpb3BlcmF0b3JHRiVJJmFycm93R0YlRiUsJjkkIiIiKiZJImNHRiVGLi1JImZHRiU2I0YtRi5GLkYlRiVGJUYu
Postupn\304\233 m\304\233n\303\255me constantu c a startovac\303\255 bod (v obr\303\241zc\303\255ch ozna\304\215en \305\276lut\303\275m kruhem), sledujeme konvercenci Mpi.
c:=-0.2; Mpi(phi,a,b,1.5);
c:=-0.2; Mpi(phi,a,b,1.2);
c:=+0.2; Mpi(phi,a,b,1.1);
c:=+0.2; Mpi(phi,a,b,0.88);
c:=-0.65; Mpi(phi,a,b,1.2);
c:=-0.65; Mpi(phi,a,b,1.5);
c:=-0.8; Mpi(phi,a,b,1.1);
c:=-0.8; Mpi(phi,a,b,0.88);
c:=-0.365; Mpi(phi,a,b,1.5);
\305\230e\305\241ili jsme rovnici:
phi(x)=x;
Derivace itera\304\215n\303\255 funkce v nalezen\303\251m \305\231e\305\241en\303\255:
evalf(subs(t=x[i], diff(phi(t),t)));
1/%;
Newtonova metoda:
Newton := x -> x-f(x)/D(f)(x):
Mpi(Newton, a, b, 1.5);