0

这是我的工作。我不知道为什么当我在傅里叶级数中使 n=3 时,枫树会吐出除以零的误差。我需要一些建议来解决这个问题。n=1 和 n=2 的傅立叶级数完美绘制。这仅在 n=3 及以上时才开始成为问题。我认为这可能是我定义 f(x) 的方式的问题,但我尝试了多种方法来定义它,我得到了相同的结果。新来的枫树,所以对我放轻松。

这是我工作的一些图片的链接:

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

1 回答 1

0

代码中的所有forget()调用都只是为了尝试清除以前存储的结果,以便时间比较可能更公平。如果您愿意,您可以删除对forget()and的所有调用。time()

我想你希望你的各种ffsN程序从 1 加到 N,而不是只加第 N 项(从 N 到 N)。所以我做了最后一个参数ffsbe i=1..N 而不是 i=N 类似于你所拥有的。

你可以用纯粹的符号方式来处理这个问题,或者你可以用数字计算系数。您还可以尝试重新使用在先前调用中计算的系数(精确符号或浮点数),这些系数添加了较少的项。如果您要使用“前 2 项的总和”、“前 5 项的总和”等来比较图表,这会产生可衡量的性能差异。获得这种重用的一种方法是使用递归过程with option remember,下面针对精确系数和浮点系数方法完成。

我应用simplify了精确的符号系数,将它们折叠成更预期的东西。(想想正交性。)我还使用了valueand inert Int*Sum而不是 active intand sumor add,但这只是为了让我也可以在不做任何符号工作的情况下获得浮点系数。

这在 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;

[附录] 提交者只要求一种简单的方法。这是确切的非递归方法(上述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 回答