我注意到 mathematica 会在某些定积分上 chokes 灭,但是如果我做一个无限积分并减去结果函数的极限值,它很容易给我一个答案。
是否有不同的算法来计算定积分和不定积分?上面描述的过程不是由 Mathematica 手动完成的吗?
Examples:正如人们在评论中要求的例子,这里有两个。
Timing[Integrate[(r - c x)/(r^2 + c^2 - (2 r) c x)^(3/2), x]]
Out:={0.010452,(-c+r x)/(r^2 Sqrt[c^2+r^2-2 c r x])}
立即获取输出。而,
Integrate[(r - c x)/(r^2 + c^2 - (2 r) c x)^(3/2), {x, -1, 1}]
保持计算并降低我的旧计算机的速度。一段时间后,它会返回一个不必要的长结果,其中包含很多情况。这是 Mathematica 7。此积分或运行到复数等中没有奇点。要获取该值,让我们中止运行约一分钟的计算,然后使用fundamental theorem of calculus手动查找该值。
g = (r - c x)/(r^2 + c^2 - (2 r) c x)^(3/2)
l = Integrate[g, x] /. x -> -1;
u = Integrate[g, x] /. x -> 1;
u - l
Out:= (-c+r)/(r^2 Sqrt[c^2-2 c r+r^2])-(-c-r)/(r^2 Sqrt[c^2+2 c r+r^2])
FullSimplify[%]
Out:= ((-c+r)/Sqrt[(c-r)^2]+(c+r)/Sqrt[(c+r)^2])/r^2
这实际上是正确的。最后,为了完整性,让我们比较定积分的输出和时间:
Timing[Integrate[(r - c x)/(r^2 + c^2 - (2 r) c x)^(3/2), {x, -1,
1}]]
Out:= {174.52,If[(Re[c/r+r/c]>=2||2+Re[c/r+r/c]<=0||c/r+r/c\[NotElement]Reals)&&((Im[r] Re[c]+Im[c] Re[r]<=0&&((Im[c]+Im[r]) (Re[c]+Re[r])>=0||Im[c]^3 Re[r]+Im[r] Re[c] (Im[r]^2-Re[c]^2+Re[r]^2)>=Im[c] (Im[c] Im[r] Re[c]+Re[r] (Im[r]^2 ... blah blah half a page
注意三分钟的计算时间和非常混乱的答案。
一个实际的例子,从我的工作,我注意到它,并感到困惑,但忘了它的最后期限提交后,直到今天,当我再次面临同样的问题。
f = 1/((-I c + k^2/2 - 1/2 (a + k)^2) (I d + k^2/2 -
1/2 (-b + k)^2)) + 1/((I c + k^2/2 - 1/2 (-a + k)^2) (I c + I d +
k^2/2 - 1/2 (-a - b + k)^2)) + 1/((I d + k^2/2 -
1/2 (-b + k)^2) (I c + I d + k^2/2 -
1/2 (-a - b + k)^2)) + 1/((I c + k^2/2 - 1/2 (-a + k)^2) (-I d +
k^2/2 - 1/2 (b + k)^2)) + 1/((-I c + k^2/2 -
1/2 (a + k)^2) (-I c - I d + k^2/2 -
1/2 (a + b + k)^2)) + 1/((-I d + k^2/2 - 1/2 (b + k)^2) (-I c -
I d + k^2/2 - 1/2 (a + b + k)^2))
当我尝试定积分时,我等了又等,几个小时后(真的!)我终于决定尝试在任何时间工作的解决方法:
fl = Integrate[f, k] /. k -> -1 ;
fu = Integrate[f, k] /. k -> 1 ;
F = fu - fl;
F1 = F /. {a -> .01, c -> 0, d -> 1};
请注意,我不是像一个评论所建议的那样谈论奇点。Integrate[1/x, {x, -1, 1}]
几乎立即返回Integrate::idiv: Integral of 1/x does not converge on {-1,1}. >>
这是一个完全合理的输出。
我认为 Daniel 在上面的评论中是正确的:“很可能是确定的集成代码正在检查集成路径上的奇异性”
只是看:
Timing@Integrate[(r - c x)/(r^2 + c^2 - (2 r) c x)^(3/2), {x, -1, 1}]
Result -> None, I got bored waiting and aborted the calc
While:
Timing@Integrate[(r-c x)/(r^2 + c^2-(2 r) c x)^(3/2),{x,-1,1},
Assumptions->{r ∈ Reals &&c ∈ Reals &&c!= r &&c!=-r}]
->{3.688, (-Sign[c - r] + Sign[c + r])/r^2}
所以,这是你为你的常量指定的条件的问题。
另一种方式是建议在西蒙的评论上面:
Timing@Integrate[(r - c x)/(r^2 + c^2 - (2 r) c x)^(3/2), {x, -1, 1},
GenerateConditions -> False]
{10.375, ((-c + r)/Sqrt[(c - r)^2] + (c + r)/Sqrt[(c + r)^2])/r^2}
最后,你也可以做:
Timing@Integrate[(r - c x)/(r^2 + c^2 - (2 r) c x)^(3/2), {x, -1, 1},
GenerateConditions -> True]
{16.45, ConditionalExpression[.. A long expression ...., Re[c^2 + r^2] > 0]}
Belisarius 回答了这个问题。我只是想具体说明一下我在评论中的意思,以及它如何适用于这个例子。
被积分中的分母清楚地表明,如果 r 和 c 是实数、正数和 r,我们就有问题了
In[1]:= InputForm[Timing[Integrate[(r - c*x)/(r^2 + c^2 - 2*r*c*x)^(3/2),
{x, -1, 1}, Assumptions->r>c>0]]]
Out[1]//InputForm= {2.33, 2/r^2}
如果没有有用的假设,Integrate 可能需要大量时间来理清好与坏行为的区域。引擎盖下的技术令人生畏 (不平等处理可以是这种方式)。也许它并没有以最有效的方式应用于任何地方。
更多信息可在
http://library.wolfram.com/infocenter/Conferences/5832/或
http://dl.acm.org/citation.cfm?doid=2016567.2016569Daniel Lichtblau
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(71条)