Legendre関数
P(x,n):=という書き方だと、subsを使うことになるのでなにかと不便です。
P(x,n):=1/2^n/n!*diff((x^2-1)^n,x$n);
print(P(x,0));
for i from 0 to 3 do
print(P(x,i)=expand(subs(P(x,n),n=i)));
end_for
0と1の時は何故か途中で計算が終わってしまいました。
P:=(x,n)->という書き方が楽ちんですが、P(x,0)といった表示ができなくなる欠点があります。
そこでhold関数を使います。
P:=(x,n)->1/2^n/n!*diff((x^2-1)^n,x$n);
for i from 0 to 3 do
print(hold(P)(x,i)=expand(P(x,i)));
end_for
0から9まで増やしてみます。
for i from 0 to 9 do
print(hold(P)(x,i)=expand(P(x,i)));
end_for
グラフにしてみました。
for i from 0 to 7 do
f:=subs(P(x,n),n=i);
print(hold(P)(x,i)=f);
plot(plot::Function2d(f,x=-1..1, Color=RGB::Blue));
end_for
Legendre関数の直交性の検討をします。P(x,○)とP(x,△)を掛け算したものを-1~1で積分しました。
hold(int(P(x,1)*P(x,1),x=-1..1))=int(P(x,1)*P(x,1),x=-1..1);
hold(int(P(x,0)*P(x,4),x=-1..1))=int(P(x,0)*P(x,4),x=-1..1);
hold(int(P(x,7)*P(x,9),x=-1..1))=int(P(x,7)*P(x,9),x=-1..1);
hold(int(P(x,13)*P(x,17),x=-1..1))=int(P(x,13)*P(x,17),x=-1..1);
hold(int(P(x,15)*P(x,15),x=-1..1))=int(P(x,15)*P(x,15),x=-1..1);
xはcosθとすることが多いです。
gth:=Symbol::theta;
P:=(gth,n)->expand(Simplify(1/2^n/n!*diff((cos(gth)^2-1)^n,gth$n)));
for n from 0 to 5 do
print(hold(P)(gth,n)=P(gth,n));
end_for
グラフにしました。
for n from 0 to 5 do
f:=P(gth,n):
print(hold(P)(gth,n)=f);
plot(plot::Function2d(f,gth=-PI/2..PI/2,Color=RGB::Blue));
end_for