Nekonecne rady s programem Maple
Fourierovy rady a ortogonalni polynomy
Karel Srot, xsrot@math.muni.cz
Zapisnik ilustruje vybrane typy ortogonalnich polynomu a vypocet Fourierovych rad vzhledem k systemu techto polynomu.
> |
> | restart; |
Procedura automatizuje Grammuv-Schmidtuv ortogonalizacni proces.
> | GramSchmidt:=proc(base, inner_product) local ortonormbase, norm, i, proj, new_vector; |
> | ortonormbase:=NULL; |
> | norm:=a->sqrt(inner_product(a,a)); |
> | for i from 1 to nops(base) do |
> | if i = 1 then |
> | ortonormbase:=[simplify(base[i]/norm(base[i]))]; |
> | else |
> | proj:=sum(inner_product(base[i], ortonormbase[j])/norm(ortonormbase[j])*ortonormbase[j], j=1..(i-1)); |
> | new_vector:=base[i]-proj; |
> | ortonormbase:=[op(ortonormbase), simplify(new_vector/norm(new_vector))]; |
> | end if; |
> | end do; |
> | RETURN(ortonormbase); |
> | end: |
> |
> |
Priklad:
Pomici procedury Gramschmidt spocitejte prvnich pet Legendrovych polynomu a nakreslete jejich grafy.
> | f:=(a,b)->int(a*b,x=-1..1); |
> | GramSchmidt([1, x, x^2, x^3, x^4], f); |
> | L:=map(pol->expand(pol/eval(pol,x=1)), %); |
> | pol:=L[3]; |
Overime ortogonalitu ziskanych polynomu
> | for pol2 in L do |
> | 'f'(pol, pol2) = f(pol,pol2); |
> | end do; |
Vykreslime graf
> | plot(L,x=-1..1); |
> |
> |
Priklad:
Napiste procedury pocitajici Legendrovy polynomy pomoci vztahu
a rekurentni formule
a overte jejich spravnost pomoci procedur LegendreP a orthopoly/P .
> | Leg1:=proc(n::nonnegint,x); |
> | if n=0 then |
> | 1 |
> | else |
> | expand(1/(2^n*n!)*diff((x^2-1)^n,x$n)); |
> | end if; |
> | end proc: |
> |
Upravime rekurentni vzorec ze zadani na vhodnejsi tvar
> | P(n+1,x)=(2*n+1)/(n+1)*x*P(n,x)-n/(n+1)*P(n-1,x); |
> | algsubs(n+1=k,%); |
> | Leg2:=proc(k::nonnegint,x) option remember; |
> | if k=0 then |
> | 1 |
> | elif k=1 then |
> | x |
> | else |
> | expand((2*k-1)/k*x*Leg2(k-1,x)-(k-1)/k*Leg2(k-2,x)); |
> | end if; |
> | end proc: |
> |
> | Leg1(8,x); |
> | Leg2(9,x); |
overime spravnost predchozich vysledku pomoci procedur LegendreP a orthopoly/P .
> | expand(LegendreP(8,x)); |
> | with(orthopoly); |
> | P(9,x); |
> |
> |
Priklad:
Spocitejte prvnich pet koeficientu Fourierovy rady funkce sin(Pi*x) vzhledem k systemu tvoreneho Legendrovymi polynomy na intervalu [-1,1]. Dale nakreslete graf takto ziskaneho castecneho souctu spolu s grafem funkce sin(Pi*x) .
> | f:=x->sin(Pi*x); |
> | g:=(a,b)->int(a*b,x=-1..1); |
> | cn:=n->g(LegendreP(n,x),f(x))/g(LegendreP(n,x),LegendreP(n,x)); |
> | N:=6: |
> | for i from 0 to (N-1) do |
> | print(c[i]=cn(i)); |
> | end do; |
> | S:=sum(cn(k)*LegendreP(k,x),k=0..N-1); |
> | pol:=expand(S); |
> | evalf(pol); |
> | g1:=plot(f(x),x=-1..1,thickness=4,color=green,scaling=constrained): |
> | g2:=plot(pol,x=-1..1,thickness=2,color=red,scaling=constrained): |
> | plots[display](g2,g1); |
Pro srovnani nakreslime take graf Maclaurinova polynomu 3. stupne.
> | tayl:=convert(taylor(f(x),x=0,N),polynom); |
> | g3:=plot(tayl,x=-1..1,thickness=2,color=blue,scaling=constrained): |
> | plots[display](g3,g1); |
> |
> |
Priklad:
Nakreslete grafy prvnich peti Cebysevovych polynomu prvniho a druheho druhu.
Cebysevovy polynomy prvniho druhu:
definujeme skalarni soucin
> | g:=(a,b)->int((1-x^2)^(-1/2)*a*b,x=-1..1); |
> | N:=5: |
> | GramSchmidt([seq(x^n, n=0..N-1)], g); |
Podobne jako v pripade Legendrovych polynomu ziskane normovane polynomy normalizujeme pomoci vztahu
> | L:=map(pol->expand(pol/eval(pol,x=1)), %); |
> | plot(L,x=-1..1,thickness=2); |
Cebysevovy polynomy druheho druhu:
definujeme skalarni soucin
> | h:=(a,b)->int((1-x^2)^(1/2)*a*b,x=-1..1); |
> | N:=5: |
> | GramSchmidt([seq(x^n, n=0..N-1)], h); |
Cebysevovy polynomy druheho druhu normalizujeme pomoci vztahu
> | L2:=expand([seq(%[i]/eval(%[i],x=1)*i,i=1..N)]); |
> | plot(L2,x=-1..1,thickness=2); |
> |
> |
Priklad:
Aproximujte funkci abs(x) na intervalu [-1,1] polynomem pateho stupne, jez je castecnym souctem jeji Fourierovy rady vzhledem k systemu tvoreneho
Cebysevovymi polynomy prvniho druhu.
> | f:=x->abs(x); |
> | g:=(a,b)->int(a*b/sqrt(1-x^2),x=-1..1); |
> | cn:=n->g(ChebyshevT(n,x),f(x))/g(ChebyshevT(n,x),ChebyshevT(n,x)); |
> | N:=6: |
> | for i from 0 to (N-1) do |
> | print(value(c[i]=cn(i))); |
> | end do; |
> | S:=sum(cn(k)*ChebyshevT(k,x),k=0..N-1); |
> | pol:=expand(S); |
> | evalf(pol); |
> |
> | g1:=plot(f(x),x=-1..1,color=green,thickness=3): |
> | g2:=plot(pol,x=-1..1,color=red,thickness=2): |
> | plots[display](g2,g1); |
> |
> | minmax_f:=numapprox[minimax](f, -1..1,[N-1,0]); |
> | minmaxpol:=expand(minmax_f(x)); |
> | g3:=plot(minmaxpol,x=-1..1,color=blue,thickness=2): |
> | plots[display](g3,g2,g1); |
> |
> | g4:=plot(minmaxpol-f(x),x=-1..1,color=blue,thickness=2): |
> | g5:=plot(pol-f(x),x=-1..1,color=red,thickness=2): |
> | plots[display](g4,g5,scaling=constrained); |
> |
> |
Priklad:
Aproximujte funkci exp(x) na intervalu [-1,1] polynomem tretiho stupne, jez je castecnym souctem jeji Fourierovy rady vzhledem k systemu tvoreneho
Cebysevovymi polynomy prvniho druhu.
> | f:=x->exp(x); |
> | g:=(a,b)->int(a*b/sqrt(1-x^2),x=-1..1); |
> | cn:=n->g(ChebyshevT(n,x),f(x))/g(ChebyshevT(n,x),ChebyshevT(n,x)); |
> | N:=4: |
> | for i from 0 to (N-1) do |
> | print(c[i]=cn(i)); |
> | end do; |
> | S:=sum(cn(k)*ChebyshevT(k,x),k=0..N-1): |
> | pol:=evalf(expand(S)); |
> |
> | g1:=plot(f(x),x=-1..1,color=green,thickness=3): |
> | g2:=plot(pol,x=-1..1,color=red,thickness=2): |
> | plots[display](g2,g1); |
> |
> | minmax_f:=numapprox[minimax](f, -1..1,[N-1,0]); |
> | minmaxpol:=expand(minmax_f(x)); |
> | g3:=plot(minmaxpol,x=-1..1,color=blue,thickness=2): |
> | plots[display](g3,g2,g1); |
> |
> | g4:=plot(abs(minmaxpol-f(x)),x=-1..1,color=blue,thickness=2): |
> | g5:=plot(abs(pol-f(x)),x=-1..1,color=red,thickness=2): |
> | plots[display](g4,g5); |
> | evalf(maximize(abs(minmaxpol-f(x)),x=-1..1)); |
> | evalf(maximize(abs(pol-f(x)),x=-1..1)); |
> |
> |