【问题标题】:Mathematica Integration taking too longMathematica 积分耗时太长
【发布时间】:2018-03-10 12:51:31
【问题描述】:

使用 Mathematica 我需要评估函数的积分。既然程序需要太多的计算时间,是否可以使用并行计算来缩短所需的时间?如果是这样,我该怎么做?

我上传了一张被积函数的图片:

我需要对 (x3, y3, x, y) 进行积分,它们都在一定的区间内(x3 和 y3 从 0 到 1)(x 和 y 从 0 到 100)。参数 (a,b,c...,o) 阻止 NIntegrate 函数工作。有什么建议吗?

【问题讨论】:

    标签: integration wolfram-mathematica


    【解决方案1】:

    如果您对此进行评估

    expr=E^((-(x-y)^4-(x3-y3)^4)/10^4)*
      (f x+e x^2+(m+n x)x3-f y-e y^2-(m+n y)y3)*
       ((378(x-y)^2(f x+e x^2+(m+n x)x3-f y-e y^2-(m+n y)y3))/
        (Pi(1/40+Sqrt[((x-y)^2+(x3-y3)^2)^3]))+
       (378(x-y)(x3-y3)(h x+g x^2+(o+p x)x3-h y-g y^2-(o+p y)y3))/
        (Pi(1/40+Sqrt[((x-y)^2+(x3-y3)^2)^3])))+
      (h x+g x^2+(o+p x)x3-h y-g y^2-(o +p y) y3)*
       ((378(x-y)(x3-y3)(f x+e x^2+(m+n x)x3-f y-e y^2-(m+n y)y3))/
        (Pi(1/40+Sqrt[((x-y)^2+(x3-y3)^2)^3]))+
       (378 (x3 - y3)^2 (h x + g x^2 + (o + p x)x3-h y-g y^2-(o+p y)y3))/
        (Pi(1/40+Sqrt[((x-y)^2+(x3-y3)^2)^3])));
    list=List @@ Expand[expr]
    

    然后你会得到一个包含 484 个表达式的列表,每个表达式的形式都与此非常相似

    (378*f*h*x^3*x3)/(Pi*(1/40+Sqrt[(x^2+x3^2-2*x*y+y^2-2*x3*y3+y3^2)^3]))
    

    请注意,您可以通过这种方式使用NIntegrate

    f*h*NIntegrate[(378*x^3*x3)/(Pi*(1/40+Sqrt[(x^2+x3^2-2*x*y+y^2-2*x3*y3+y3^2)^3])),
      {x,0,100},{y,0,100},{x3,0,1},{y3,0,1}]
    

    但它给出了关于收敛性和准确性的警告和错误,几乎可以肯定是由于分母中的分数幂。

    如果您能找到一种方法来提取与 x,y,x3,y3 无关的标量乘数,然后在没有警告和错误的情况下执行该积分并获得不是无穷大的准确结果,那么您也许可以执行这些积分并行并汇总结果。

    一些被积函数是其他被积函数的标量倍数,如果您组合相似的被积函数,则可以将其减少到 300 个唯一被积函数。

    我怀疑这是否会为您带来可接受的解决方案。

    请仔细检查所有这些,确保没有任何错误。

    编辑

    由于独立于积分的变量似乎很容易与上述问题中的因变量分开,我认为这将允许并行NIntegrate

    independentvars[z_] := (z/(z//.{e->1, f->1, g->1, h->1, m->1, n->1, o->1, p->1}))*
      NIntegrate[(z//.{e->1, f->1, g->1, h->1, m->1, n->1, o->1, p->1}),
        {x, 0, 100}, {y, 0, 100}, {x3, 0, 1}, {y3, 0, 1}]
    
    Total[ParallelMap[independentvars, list]]
    

    正如我之前提到的,分母中的分数幂会导致大量关于收敛失败的警告和错误。

    您可以使用以下更简单的示例进行测试

    expr = f x + f g x3 + o^2 x x3;
    list = List @@ Expand[expr];
    Total[ParallelMap[independentvars, list]]
    

    立即返回

    500000. f + 5000. f g + 250000. o^2
    

    这是一种将独立符号变量拉到NIntegrate 之外的非常原始的方法。如果其中一个被积函数不是这种原始提取尝试不合适或失败的形式,则绝对不会发出警告。

    可能有其他人在某处写过的更好的方法。如果有人能展示一个更好的方法来做到这一点,我将不胜感激。

    如果 Wolfram 考虑将这样的内容合并到 NIntegrate 本身中,那可能会很好。

    【讨论】:

    • 非常感谢,我马上试试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 2021-08-07
    • 2018-02-27
    • 2013-05-28
    相关资源
    最近更新 更多