这是我的工作。我不明白为什么当我在傅立叶级数中做n=3时,maple会吐出一个除以零的误差。我需要一些建议来解决这个问题。n=1和n=2图的傅立叶级数是完美的。只有当n=3打开时,这才会开始成为一个问题。我想这可能是我定义f(x)的方式的问题,但我尝试了许多方法来定义它,我得到了相同的结果。刚接触梅普,所以别对我太客气了。
这是我作品的一些图片的链接:
page1: http://tinypic.com/r/34iqmfa/6
page2: http://tinypic.com/r/2rzruvm/6 发布于 2013-02-06 02:39:28
代码中的所有forget()调用都只是尝试清除以前存储的结果,以便进行更公平的计时比较。如果愿意,您可以删除对forget()和time()的所有调用。
我认为您希望您的各种ffsN过程从1到N相加,而不是仅仅添加第N项(从N到N)。所以我把ffs的最后一个参数设为i=1..N,而不是i=N,和你之前的类似。
你可以用一种纯粹精确的符号方式来解决这个问题,或者你也可以用数值的方式计算系数。您还可以尝试重用在以前的调用中计算的系数(精确符号或浮点数),这些系数添加的术语较少。如果你打算使用“前2项的总和”、“前5项的总和”等来比较图,这将产生一个可测量的性能差异。获得这种重用的一种方法是使用带有option remember的递归过程,这将在下面针对精确系数和浮动系数方法进行。
我将simplify应用于精确的符号系数,这将它们折叠为更期望的值。(请考虑正交性。)我还使用了value和inert Int * Sum,而不是active int和sum或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]);

https://stackoverflow.com/questions/14712160
复制相似问题