> | restart:
with(plots): |
> | fce:=x->(x^2); |
![]() |
(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); |
![]() |
> | 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 | |
![]() |
> |
> | # 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 | |
![]() |
> |
> |