0

これが私の仕事です。フーリエ級数でn=3を作成すると、メープルがゼロ除算エラーを吐き出す理由がわかりません。これを実現するには、いくつかの提案が必要です。n=1およびn=2のフーリエ級数は完全にグラフ化されます。これは、n=3以降でのみ問題になり始めます。f(x)を定義する方法に問題があるかもしれないと思っていますが、iveはそれを定義するために多くの方法を試しましたが、同じ結果が得られました。メープルは初めてなので、気楽に行ってください。

これが私の作品のいくつかの写真へのリンクです:

page1: http://tinypic.com/r/34iqmfa/6    
page2: http://tinypic.com/r/2rzruvm/6 
4

1 に答える 1

0

コード内のすべてのforget()呼び出しは、以前に保存された結果をクリアしようとするためだけに存在するため、タイミングの比較がより公平になります。forget()必要に応じて、 およびへのすべての呼び出しを削除できtime()ます。

ffsNN 番目の項 (N から N) を追加するだけでなく、さまざまな手順で 1 から N を追加する必要があると考えました。だから私はffsあなたが持っていたものと同様に i=N ではなく be i=1..N の最後の引数を作りました。

純粋に正確なシンボリックな方法でこれにアプローチすることも、係数を数値的に計算することもできます。また、以前の呼び出しで計算された、より少ない項を追加した係数 (正確なシンボリックまたは浮動小数) を再利用することもできます。「最初の 2 項の合計」、「最初の 5 項の合計」などを使用してプロットを比較する場合、これにより測定可能なパフォーマンスの違いが生じます。このような再利用を取得する 1 つの方法は、再帰的な手順を使用することです。これはoption remember、正確な係数アプローチと浮動小数点係数アプローチの両方で以下で行われます。

私は正確なシンボリック係数に適用simplifyしました。これにより、それらがより期待されるものに折りたたまれます。(直交性について考えてみてください。)アクティブなand orではなくvalueand inert Int*も使用しましたが、これはシンボリックな作業を行わずに float 係数を取得できるようにするためでした。Sumintsumadd

これは Maple 15 で動作します。動作しない場合は大声で言ってから、バージョンをお知らせください。

restart:
f:=x->sin(3*x)/x:
an:=1/Pi*Int(f(t)*cos(n*t),t=-Pi..Pi):
bn:=1/Pi*Int(f(t)*sin(n*t),t=-Pi..Pi):
ffs:=unapply(Sum(an*cos(n*x)+bn*sin(n*x),n=1..N),[x,N]):

a0:=1/(2*Pi)*int(f(t),t=-Pi..Pi):

a0+simplify(value(ffs(x,1)));
evalf(%);

seq(a0+simplify(value(ffs(x,i))),i=0..3);

seq(evalf(a0+ffs(x,i)),i=0..3);

forget(evalf): forget(int): forget(`evalf/int`):
forget(Si): forget(Ci): forget(ffsrecursive): forget(value):
st:=time():
G5:=[seq(a0+simplify(value(ffs(x,i))),i=0..5)]:
plot(G5,x=-Pi..Pi);
time()-st;

forget(evalf): forget(int): forget(`evalf/int`):
forget(Si): forget(Ci): forget(ffsrecursive): forget(value):
st:=time():
H5:=[seq(evalf(a0+ffs(x,i)),i=0..5)]:
plot(H5,x=-Pi..Pi);
time()-st;

ffsrecursive:=proc(x,N) option remember, system;
  if N<=0 then return evalf(a0);
  else
     return procname(x,N-1)+evalf(eval(an*cos(N*x)+bn*sin(N*x),n=N));
  end if;
end proc:

ffsrecursive(x,3);

ffsrecursiveexact:=proc(x,N) option remember, system;
  if N<=0 then return a0;
  else
     return procname(x,N-1)+simplify(value(eval(an*cos(N*x)+bn*sin(N*x),n=N)));
  end if;
end proc:

ffsrecursiveexact(x,3);

forget(evalf): forget(int): forget(`evalf/int`):
forget(Si): forget(Ci): forget(ffsrecursive): forget(value):
st:=time():
S5exact:=[seq(ffsrecursiveexact(x,i),i=0..5)]:
plot(S5exact,x=-Pi..Pi);
time()-st;

forget(evalf): forget(int): forget(`evalf/int`):
forget(Si): forget(Ci): forget(ffsrecursive): forget(value):
st:=time():
S5:=[seq(ffsrecursive(x,i),i=0..5)]:
plot(S5,x=-Pi..Pi);
time()-st;

# difference w.r.t. f(x)
forget(evalf): forget(int): forget(`evalf/int`):
forget(Si): forget(Ci): forget(ffsrecursive): forget(value):
st:=time():
plot([seq(ffsrecursive(x,i)-f(x),i=15..19)],x=-Pi..Pi);
time()-st;

# difference w.r.t. f(x)
forget(evalf): forget(int): forget(`evalf/int`):
forget(Si): forget(Ci): forget(ffsrecursive): forget(value):
st:=time():
plot([seq(a0+simplify(value(ffs(x,i)))-f(x),i=15..19)],x=-Pi..Pi);
time()-st;

# difference w.r.t. f(x)
forget(evalf): forget(int): forget(`evalf/int`):
forget(Si): forget(Ci): forget(ffsrecursive): forget(value):
st:=time():
H15_19diff:=[seq(a0+evalf(ffs(x,i))-f(x),i=15..19)]:
plot(H15_19diff,x=-Pi..Pi);
time()-st;

[補遺] 提出者は、ただ 1 つの単純なアプローチを求めました。これは、正確な非再帰的アプローチです(上記の4つのうち)。

restart:

f:=x->sin(3*x)/x:
an:=1/Pi*Int(f(t)*cos(n*t),t=-Pi..Pi):
bn:=1/Pi*Int(f(t)*sin(n*t),t=-Pi..Pi):

ffs:=unapply(Sum(an*cos(n*x)+bn*sin(n*x),n=1..N),[x,N]):

a0:=1/(2*Pi)*int(f(t),t=-Pi..Pi):

G5:=seq(a0+simplify(value(ffs(x,i))),i=0..5);

plot([f(x), G5],x=-Pi..Pi,
     legend=[f(x),"n=0","n=1","n=2","n=3","n=4","n=5"],
     color=[black,gold,cyan,green,blue,magenta,red]);

ここに画像の説明を入力

于 2013-02-05T18:39:27.567 に答える