0

チェビシェフ多項式に関連する組み込みのメープル関数を使用せずに、関数fを区間[-1..1]の次数nのチェビシェフ多項式として近似するプロシージャをmapleで記述しようとしています。 http://en.wikipedia.org/wiki/Chebyshev_polynomials

たとえば、CPlot(f、[2,3,4])が[-1、1]の関数fのプロットを、異なる色で2番目、3番目、および4番目のChebychev近似。これは、2番目の引数として任意の長さの任意のリストに対して機能するはずです。これは私の現在のコードです:

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を使用する場合、以前にテストして機能したChebTの代わりにwith(orthopoly、T)を呼び出すと、グラフ上のすべてのプロットが同じように見えます。助言がありますか?

4

1 に答える 1

1

nopc(c)の代わりにタイプミスがありましたnops(c)。私は自由にに変更sumしましたadd(割り当てられていないChebT値を持つ最初の引数で誤って呼び出されていたため)。効率を上げるために、proc defnsをループから引き出し、の反復連結をより効率的な呼び出しに置き換えました。i-1iKseq

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]);
于 2012-11-26T02:23:15.250 に答える