2012-11-25 2 views
0

메이플에 프로 시저를 쓰려면 함수 f를 사용하지 않고 [-1..1] 간격으로 차수 n의 Chebyshev 다항식으로 근사 할 것입니다. Chebyshev 다항식과 관련된 내장 된 Maple 함수. http://en.wikipedia.org/wiki/Chebyshev_polynomials메이플 프로 시저에 대한 도움을 찾고 있는데

예를 들어 CPlot (f, [2,3,4])가 다른 색상의 [-1, 1]과 함께 함수 f의 플롯을 생성하도록하는 절차 CPlot , 그것의 제 2, 제 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에서) 오류, 루프가 숫자 또는 문자 여야 위해에 최종 값을"GET *

내가 orthopoly (로 호출하여, 체비 쇼프 다항식에 대한 기능 T에서 빌드를 사용하는 경우, T) 대신 ChebT 대신에 그래프를 사용합니다. 제안 사항이 있으십니까?

답변

1

nops(c) 대신에 nopc(c)이 오타되었습니다. sumadd으로 변경하는 자유를 취했습니다 (할당되지 않은 i에 대해 i-1 값을 갖는 첫 번째 인수로 ChebT이 잘못 호출 되었기 때문에). 효율성을 위해 루프에서 프로 시저를 제거하고 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]); 
+0

감사합니다 ... 작동합니다 ... 프로그램이 정확한 결과를 출력하는지/Chebychev approximations에 대한 음모를 확인할 수있는 방법이 있습니까? – Stefan

관련 문제