Maple Division by Zero

时间:2013-02-05 16:26:28

标签: math fft maple divide-by-zero

这是我的工作。我无法弄清楚为什么当我在傅立叶级数中使n = 3时,枫子会出现零误差的分裂..我需要一些建议来解决这个问题。 n = 1且n = 2的傅立叶级数完美。当n = 3并且打开时,这仅开始成为问题。我认为这可能是我定义f(x)的方式的问题,但我尝试了很多方法来定义它,我得到相同的结果。 枫树的新手,所以对我来说很容易。

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

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

1 个答案:

答案 0 :(得分:0)

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

我认为您希望各种ffsN过程从1添加到N,而不是仅添加第N个术语(从N到N)。所以我做了ffs的最后一个论点是i = 1..N而不是i = N类似于你所拥有的。

您可以用纯粹精确的符号方式来处理它,或者您可以用数字计算系数。并且您还可以尝试重新使用在先前调用中计算的系数(精确符号或浮点数),这些系数增加了更少的项。如果要使用“前2个术语的总和”,“前5个术语的总和”等比较绘图,这会产生可测量的性能差异。获得此类重用的一种方法是使用递归过程使用option remember,对于精确系数和浮点系数方法都在下面完成。

我将simplify应用于确切的符号系数,这会将它们折叠成更令人期待的东西。 (想想正交性。)我还使用value和惰性Int * Sum而不是有效intsumadd,但是只是这样我也可以在不做任何象征性工作的情况下获得浮动系数。

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

[addendum]提交者只要求一个简单的方法。这是精确的,非递归的方法(上面的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]);

enter image description here