2012-11-25 75 views
0

我試圖寫一個程序在楓樹中,將近似函數f作爲間隔[-1..1]上n度的切比雪夫多項式而不使用任何與Chebyshev多項式相關的內置Maple函數。 http://en.wikipedia.org/wiki/Chebyshev_polynomials我正在尋找一些楓葉程序的幫助

例如一個程序CPlot使得,例如,CPlot(F,[2,3,4])產生函數f的曲線圖上[-1,1]一起,以不同的顏色,其第二,第三和第四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循環必須是數字或字符最終值」上線*

如果我使用的生成函數T代表切比雪夫多項式,通過調用(orthopoly, T),而不是之前測試過的ChebT,它的工作原理,圖上的所有圖都看起來一樣。 有什麼建議嗎?

回答

1

您有一個錯字nopc(c)而不是nops(c)。我冒昧將sum更改爲add(因爲ChebT被錯誤地稱爲第一參數,其值爲i-1,未分配的i)。爲了提高效率,我將proc defs從循環中取出,然後用seq更高效的調用代替K的迭代級聯。

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]); 
+0

謝謝...它工作......有沒有什麼辦法知道/檢查程序輸出的切比雪夫近似正確的結果/陰謀? – Stefan