如何避免数值积分中的奇点?
how to avoid singularity in numerical integration?
我想在 Maple18 中绘制 E2(t)
,但它在 t=0 左右爆炸了。我怎样才能对这个积分应用渐近评估来避免奇点并解决这个问题?
restart: with(plots):
with(Student[NumericalAnalysis]):
g1:=(x,t)->(-sqrt(t)/(2*sqrt(Pi*r^3)))*(sin((r*(x-1)^(2)/(4*t))+(Pi/4))-sin((r*(x+1)^(2)/(4*t))+(Pi/4))):
g2:=(x,t)->int(g1(x,t),r=1..infinity);
g3:=(x,t) -> (diff(g2(x,t),t)):
g4:=(x,t) -> (diff(g2(x,t),x,x)):
g5:=(x,t) -> ((1/2)*(g3(x,t)^2+g4(x,t)^2)):
E2:=t->(int(g5(x,t),x=0..100)):
evalf(E2(0));
Error, (in g1) numeric exception: division by zero
evalf(E2(1));
Error, (in g3) invalid input: diff received 1, which is not valid for its 2nd argument
plot(E2(t),t=0..20);
此致,
我不知道你说的 "avoid the singularity" 是什么意思。您的函数在 t=0 时是单一的,并且无法更改它。只是不要尝试在 0 处对其进行评估。
你的另一个问题是由于试图区分一个数字引起的。您需要做的是使用 unapply 创建过程 E2。然后将象征性地进行微分。本质上,这是您的代码。我删除了多余的括号、(x,t)-> 和不需要的包加载。
restart:
g1:= -sqrt(t/Pi/r^3)/2 *
(sin(r*(x-1)^2/4/t+Pi/4)-sin(r*(x+1)^2/4/t+Pi/4)):
g2:= int(g1, r= 1..infinity):
g3:= diff(g2,t):
g4:= diff(g2,x):
g5:= (g3^2+g4^2)/2:
这里是 E2:
E2:= unapply(Int(g5, x= 0..100, epsilon= 1e-4, digits= 7), t):
注意 Int 中的大写 I。这将避免浪费时间尝试符号积分,并在应用 evalf 时直接进入数值积分。 epsilon 和 digits 参数将降低精度并提高速度。对于情节来说,精度仍然足够。绘图命令是
plot(E2, 0..20, numpoints= 50, labels= [t, ``]);
这将需要两到三分钟。如果增加 numpoints 以获得更准确的绘图,时间将按比例增加。
我想在 Maple18 中绘制 E2(t)
,但它在 t=0 左右爆炸了。我怎样才能对这个积分应用渐近评估来避免奇点并解决这个问题?
restart: with(plots):
with(Student[NumericalAnalysis]):
g1:=(x,t)->(-sqrt(t)/(2*sqrt(Pi*r^3)))*(sin((r*(x-1)^(2)/(4*t))+(Pi/4))-sin((r*(x+1)^(2)/(4*t))+(Pi/4))):
g2:=(x,t)->int(g1(x,t),r=1..infinity);
g3:=(x,t) -> (diff(g2(x,t),t)):
g4:=(x,t) -> (diff(g2(x,t),x,x)):
g5:=(x,t) -> ((1/2)*(g3(x,t)^2+g4(x,t)^2)):
E2:=t->(int(g5(x,t),x=0..100)):
evalf(E2(0));
Error, (in g1) numeric exception: division by zero
evalf(E2(1));
Error, (in g3) invalid input: diff received 1, which is not valid for its 2nd argument
plot(E2(t),t=0..20);
此致,
我不知道你说的 "avoid the singularity" 是什么意思。您的函数在 t=0 时是单一的,并且无法更改它。只是不要尝试在 0 处对其进行评估。
你的另一个问题是由于试图区分一个数字引起的。您需要做的是使用 unapply 创建过程 E2。然后将象征性地进行微分。本质上,这是您的代码。我删除了多余的括号、(x,t)-> 和不需要的包加载。
restart:
g1:= -sqrt(t/Pi/r^3)/2 *
(sin(r*(x-1)^2/4/t+Pi/4)-sin(r*(x+1)^2/4/t+Pi/4)):
g2:= int(g1, r= 1..infinity):
g3:= diff(g2,t):
g4:= diff(g2,x):
g5:= (g3^2+g4^2)/2:
这里是 E2:
E2:= unapply(Int(g5, x= 0..100, epsilon= 1e-4, digits= 7), t):
注意 Int 中的大写 I。这将避免浪费时间尝试符号积分,并在应用 evalf 时直接进入数值积分。 epsilon 和 digits 参数将降低精度并提高速度。对于情节来说,精度仍然足够。绘图命令是
plot(E2, 0..20, numpoints= 50, labels= [t, ``]);
这将需要两到三分钟。如果增加 numpoints 以获得更准确的绘图,时间将按比例增加。