我正在尝试在maple中编写一个过程,它将函数f近似为区间[-1..1]上的度数为n的切比雪夫多项式,而不使用任何与切比雪夫多项式相关的内置Maple函数。 http://en.wikipedia.org/wiki/Chebyshev_polynomials
例如,一个程序CPlot,例如,CPlot(f,[2,3,4])在[-1,1]上生成函数f的图,同时以不同的颜色生成其第二个,第3和第4个Chebychev近似值。它应该适用于任意长度的任意列表作为第二个参数。 这是我目前的代码:
ChebT := proc(n,x)
local i,firstT,secondT,generalT;
firstT := 1;
if n=0 then return firstT end if;
secondT := x;
if n=1 then return secondT end if;
for i from 1 to n-1 do
generalT := 2*x*secondT - firstT;
firstT := secondT;
secondT := generalT;
end do;
return expand(secondT)
end proc:
CPlot:=proc(f,L::list)
local j, K,num_ip,num_prj,c,chb;
K:=f(x);
for j from 1 to nops( L) while j<(nops(L)+1) do
num_ip := (f,g) -> evalf(Int(f*g/sqrt(1-x^2),x=-1..1)*2/Pi);
num_prj := (f,n) -> seq(num_ip(f,ChebT(i,x)),i=0..n);
c := num_prj(f(x),L[j]);
chb := c -> c[1]/2 + sum(c[i]*ChebT(i-1,x),i=2..nopc(c)); *
K:=K, chb([c]);
end do;
plot([K], x=-1..1, colour=[green, red, blue, yellow],linestyle=[1,2,3,4], thickness=[5,2,3,4]);
end proc:
尝试时:
F:= X-&X的催化剂^ 2:
ChebyPlot(F,[2,5,10]);
我得到“错误,(在ChebT中)for循环中的最终值必须是数字或字符”在线*
如果我在Chebyshev多项式的函数T中使用构建,通过调用(orthopoly,T),而不是之前测试过的ChebT,它可以工作,图上的所有图看起来都是一样的。 有什么建议吗?
答案 0 :(得分:1)
您输错了nopc(c)
而不是nops(c)
。我冒昧地将sum
更改为add
(因为ChebT
被错误地调用,第一个参数的值为i-1
,用于未分配的i
)。为了提高效率,我将proc定义退出循环,然后通过更有效的K
调用替换seq
的迭代串联。
restart:
ChebT := proc(n::nonnegint,x)
local i,firstT,secondT,generalT;
firstT := 1;
if n=0 then return firstT end if;
secondT := x;
if n=1 then return secondT end if;
for i from 1 to n-1 do
generalT := 2*x*secondT - firstT;
firstT := secondT;
secondT := generalT;
end do;
return expand(secondT)
end proc:
CPlot:=proc(f,L::list)
local j,K,num_ip,num_prj,c,chb;
num_ip:=(f,g)-> evalf(Int(f*g/sqrt(1-x^2),x=-1..1)*2/Pi);
num_prj:=(f,n)-> seq(num_ip(f,ChebT(i,x)),i=0..n);
chb:=c->c[1]/2 + add(c[i]*ChebT(i-1,x),i=2..nops(c));
### Even if you insist of forming K in a do-loop you should
### still pull the assignments to num_ip, num_prj, and chb
### outside the loop. There's no need to reassign those each
### time through the loop.
#K:=f(x);
#for j from 1 to nops(L) do
# c:= num_prj(f(x),L[j]);
# K:=K, chb([c]);
#end do;
K:=f(x), seq(chb([num_prj(f(x),L[j])]), j=1..nops(L));
plot([K], x=-1..1, colour=[green, red, blue, yellow],
linestyle=[1,2,3,4], thickness=[5,2,3,4]);
end proc:
f:=x->x^2:
CPlot(f,[2,5,10]);