Mathematica 集成花费的时间太长
Mathematica Integration taking too long
我需要使用 Mathematica 计算函数的积分。由于程序需要太多的时间来计算它,是否可以使用并行计算来缩短所需的时间?如果可以,我该怎么做?
我上传了一张被积函数的图片:
我需要针对 (x3, y3, x, y) 对其进行积分,所有这些都在一定的区间内(x3 和 y3 从 0 到 1)(x 和 y 从 0 到 100)。参数 (a,b,c...,o) 阻止 NIntegrate 函数工作。有什么建议吗?
如果你评价这个
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]]
瞬间returns
500000. f + 5000. f g + 250000. o^2
这是一种非常原始的方法,可以将独立的符号变量拉到 NIntegrate
之外。如果其中一个被积函数不在这种原始提取尝试不合适或失败的形式中,这绝对不会发出警告。
可能有其他人在某处写下的更好的方法。如果有人可以展示更好的方法,那么我将不胜感激。
如果 Wolfram 考虑将类似的东西合并到 NIntegrate
本身,那可能会很好。
我需要使用 Mathematica 计算函数的积分。由于程序需要太多的时间来计算它,是否可以使用并行计算来缩短所需的时间?如果可以,我该怎么做?
我上传了一张被积函数的图片:
我需要针对 (x3, y3, x, y) 对其进行积分,所有这些都在一定的区间内(x3 和 y3 从 0 到 1)(x 和 y 从 0 到 100)。参数 (a,b,c...,o) 阻止 NIntegrate 函数工作。有什么建议吗?
如果你评价这个
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]]
瞬间returns
500000. f + 5000. f g + 250000. o^2
这是一种非常原始的方法,可以将独立的符号变量拉到 NIntegrate
之外。如果其中一个被积函数不在这种原始提取尝试不合适或失败的形式中,这绝对不会发出警告。
可能有其他人在某处写下的更好的方法。如果有人可以展示更好的方法,那么我将不胜感激。
如果 Wolfram 考虑将类似的东西合并到 NIntegrate
本身,那可能会很好。