如何在Mathematica中数值计算二重积分?

3
如何在Mathematica中进行数值计算的双重积分?
Integrate[Exp[-0.099308 s]
       * Integrate[Exp[0.041657423 u] Exp[-3.1413 s + 3.12 u]
             * ((u/(s - u))^(1/2) BesselI[1,2 (u (s - u))^(1/2)]
             + 0.293 BesselI[0,2 (u (s - u))^(1/2)]),{u,0,s}],{s,0,10}]

enter image description here


2
可能是如何在MATLAB中数值计算双重积分?的(近)重复。 - High Performance Mark
一个Mathematica问题怎么可能是Matlab问题的副本?这就像Java问题和C#问题一样。 - Verbeia
@Verbeia 你说得有道理,但是OP问如何在两种语言中处理相同的积分。 - rcollyer
2个回答

4

有两件事情。首先,Integrate接受多个“迭代器”,即{x, x1, x2},因此您可以在不嵌套它们的情况下指定多重积分,如下所示:

Integrate[x y, {x, 0, 1}, {y, 0, x}]

在由y == xx == 0x == 1所限定的三角形上对x y进行积分。注意,极限的顺序是从外到内,因此积分是从右到左进行的。然后,你的积分变为

Integrate[Exp[-0.099308 s] Exp[0.041657423 u] Exp[-3.1413 s + 3.12 u]
   * ((u/(s - u))^(1/2) BesselI[1,2 (u (s - u))^(1/2)]
   + 0.293 BesselI[0,2 (u (s - u))^(1/2)]),
 {s,0,10}, {u,0,s}]

其次,Mathematica有许多与标准算法相对应的数值算法,如NSolveNDSolveNSumNIntegrate等。它们都以前缀N开头,这也是一个函数。这些函数的好处在于它们具有与它们的解析等价物相同的签名。因此,要进行数值积分,您只需将Integrate更改为NIntegrate,如下所示:

NIntegrate[Exp[-0.099308 s] Exp[0.041657423 u] Exp[-3.1413 s + 3.12 u]
   * ((u/(s - u))^(1/2) BesselI[1,2 (u (s - u))^(1/2)]
   + 0.293 BesselI[0,2 (u (s - u))^(1/2)]),
 {s,0,10}, {u,0,s}]

这会得到27.4182,正如tkott所指出的那样,但没有生成任何警告。


1
如果您想在Mathematica中进行数值积分,应该使用NIntegrate。这将给您一个数值近似而不是确定积分。
NIntegrate[ Exp[-0.099308*s]*
  NIntegrate[Exp[0.041657423*u]*(Exp[-3.1413*s + 3.12*u])*((u/(s - u))^(1/2)*
       BesselI[1, 2*(u*(s - u))^(1/2)] + 0.293*BesselI[0, 2*(u*(s - u))^(1/2)])
  , {u, 0, s}]
, {s, 0, 10}]

它抱怨因为内部积分首先被评估,而且没有指定s就无法进行评估,但是会给出

27.4182

不知道这是否正确!

顺便说一句:您可能会在https://mathematica.stackexchange.com/上获得更好的回应。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接