Mathematica中确定与不定积分的区别?

yay*_*ayu 14 wolfram-mathematica

我注意到mathematica扼杀了某些定积分,但如果我进行了一个无限积分并减去了所得函数的极限值,它就会给我一个答案.

是否有不同的算法来计算确定和不定积分?是否有某些原因上述程序不是由Mathematica手动完成的?

例子:

正如评论中的人们要求举例,这里有两个.

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])}
Run Code Online (Sandbox Code Playgroud)

立即获取输出.而,

Integrate[(r - c x)/(r^2 + c^2 - (2 r) c x)^(3/2), {x, -1, 1}]
Run Code Online (Sandbox Code Playgroud)

保持计算并减慢我的旧电脑速度.经过一段时间后,它会在很多情况下返回一个不必要的长结果.这是Mathematica 7.这个积分中没有奇点或者遇到复数等等.为了得到这个值,让我们中止运行大约一分钟的计算,然后手动使用微积分基本定理找到该值.

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
Run Code Online (Sandbox Code Playgroud)

这实际上是正确的.最后,为了完整性,让我们比较定积分的输出和时间:

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
Run Code Online (Sandbox Code Playgroud)

注意三分钟的计算时间和非常困惑的答案.

从我的工作中得到一个实际的例子,我注意到它并且在截止日期提交之后忘记了它,直到今天我再次遇到同样的问题.

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))
Run Code Online (Sandbox Code Playgroud)

当我尝试定积分时,我等了几个小时后等了(真的!)我终于决定尝试一下有效的解决方法:

fl =  Integrate[f, k] /. k -> -1 ;
fu =  Integrate[f, k] /. k -> 1 ;
F = fu - fl;
F1 = F /. {a -> .01, c -> 0, d -> 1};
Run Code Online (Sandbox Code Playgroud)

请注意,正如一条评论所暗示的那样,我并不是在谈论奇点.Integrate[1/x, {x, -1, 1}]几乎立即返回Integrate::idiv: Integral of 1/x does not converge on {-1,1}. >>,这是一个完全合理的输出.

Dr.*_*ius 12

我认为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
Run Code Online (Sandbox Code Playgroud)

而:

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} 
Run Code Online (Sandbox Code Playgroud)

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}]

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}
Run Code Online (Sandbox Code Playgroud)

因此,您需要为常量指定哪些条件.

Simon的评论中提出了另一种方式:

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]}
Run Code Online (Sandbox Code Playgroud)

最后,你也可以这样做:

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
Run Code Online (Sandbox Code Playgroud)


Dan*_*lau 5

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}
Run Code Online (Sandbox Code Playgroud)

如果没有有用的假设,Integrate可能需要花费大量时间来梳理好行为和坏行为的区域.引擎盖下的技术令人生畏(不平等处理可以这样).也许并非所有地方都以最有效的方式应用.

更多信息可在以下网站找到

http://library.wolfram.com/infocenter/Conferences/5832/

要么

http://dl.acm.org/citation.cfm?doid=2016567.2016569

Daniel Lichtblau