innmo_2013_02.mw

 

> restart:
with(plots):
 

> fce:=x->(x^2);
 

proc (x) options operator, arrow; `*`(`^`(x, 2)) end proc (1)
 

> zlatyRez:=proc(fce,a,b,pocet)
local i, z, xk1, xk2, ak:=a, bk:=b, castecna, cela;

z:=evalf((1+sqrt(5))/2);
xk1:=evalf(a+(1/z^2)*(b-a));
xk2:=evalf(b-(1/z^2)*(b-a));

cela:=plot(fce(x),x=a..b,color=blue,transparency=0.7,thickness=1);
castecna[0]:=plot(fce(x),x=a..b,color=red,transparency=0,thickness=3);

for i from 1 to pocet do
if (evalf(fce(xk1)) <= evalf(fce(xk2))) then
 ak:=ak;
 bk:=xk2;
 xk2:=evalf(xk1);
 xk1:=evalf(ak+(1/z^2)*(bk-ak));
else
 ak:=xk1;
 bk:=bk;
 xk1:=evalf(xk2);
 xk2:=evalf(bk - (1/z^2)*(bk-ak));
end if;
castecna[i]:=plot(fce(x),x=ak..bk, color=red,transparency=0,thickness = 3);
end do;
display(display(seq(castecna[t],t=0..pocet-1),insequence=true),cela);
end proc:
 

> zlatyRez(fce,-2,3,30);
 

Plot_2d
 

> zlatyRezPresnost:=proc(fce,a,b,epsilon)
local i:=0, z, xk1, xk2, ak:=a, bk:=b, castecna, cela, presnost;

z:=evalf((1+sqrt(5))/2);
xk1:=evalf(a+(1/z^2)*(b-a));
xk2:=evalf(b-(1/z^2)*(b-a));
presnost:=evalf(log10((bk-ak)/(2*epsilon))/log10(z)+1); # nepouzito, mozno pouzit v podmince misto porovnani s epsilon
printf("Přesnost spočítaná pomocí logaritmu: %f\r",presnost);
cela:=plot(fce(x),x=a..b,color=blue,transparency=0.7,thickness=1);
castecna[0]:=plot(fce(x),x=a..b,color=red,transparency=0,thickness=3);

while bk-ak >= epsilon do
i:=i+1;
if (evalf(fce(xk1)) <= evalf(fce(xk2))) then
 ak:=ak;
 bk:=xk2;
 xk2:=evalf(xk1);
 xk1:=evalf(ak+(1/z^2)*(bk-ak));
else
 ak:=xk1;
 bk:=bk;
 xk1:=evalf(xk2);
 xk2:=evalf(bk - (1/z^2)*(bk-ak));
end if;
castecna[i]:=plot(fce(x),x=ak..bk, color=red,transparency=0,thickness = 3);
end do;
printf("Iterací provedených: %a\r",i);
printf("Nalezené minimum: %f ",(ak+bk)/2);
display(display(seq(castecna[t],t=0..i),insequence=true),cela);
end proc:
 

> zlatyRezPresnost(fce,-2,2,0.005);
 

 

Přesnost spočítaná pomocí logaritmu: 13.450784 Iterací provedených: 14 Nalezené minimum: 0.000906
Plot_2d
 

>
 

> # DU: fibonacciho metoda, vstup,počet kroků, výsledkem bude animace grafu, v každým kroku bude vidět, jak se zmenšuje interval. Subj emailu: INNMO ukol
 

> with(plots):
with(combinat,fibonacci):
fibonacciNalezeniMinima:=proc(fce,a,b,kroku)
local k, xk1, xk2, ak:=a, bk:=b, castecna, cela, N:=kroku+1;

#knihovny
xk1:=evalf(bk-((fibonacci(N-1)/fibonacci(N))*(bk-ak)));
xk2:=evalf(ak+((fibonacci(N-1)/fibonacci(N))*(bk-ak)));
# printf("xk1: %f, xk2: %f",xk1,xk2);
cela:=plot(fce(x),x=a..b,color=blue,transparency=0.7,thickness=1);
castecna[0]:=plot(fce(x),x=a..b,color=red,transparency=0,thickness=3);

for k from 1 to N-1 do
if (evalf(fce(xk1)) <= evalf(fce(xk2))) then
 ak:=ak;
 bk:=xk2;
 xk2:=evalf(xk1);
 xk1:=evalf(bk-(fibonacci(N-k)/fibonacci(N-k+1))*(bk-ak));
else
 ak:=xk1;
 bk:=bk;
 xk1:=evalf(xk2);
 xk2:=evalf(ak+(fibonacci(N-k)/fibonacci(N-k+1))*(bk-ak));
end if;
castecna[k]:=plot(fce(x),x=ak..bk, color=red,transparency=0,thickness = 3);
end do;

printf("Iterací provedených: %a\r",N-1);
printf("Nalezené minimum: %f ",(ak+bk)/2);
display(display(seq(castecna[t],t=0..N-1),insequence=true),cela);

end proc:
 

> fibonacciNalezeniMinima(fce,-2,2,10);
 

 

Iterací provedených: 10 Nalezené minimum: 0.013653
Plot_2d
 

>
 

>