Wolfram mathematica 集成一个涉及另一个集成的函数

Wolfram mathematica 集成一个涉及另一个集成的函数,wolfram-mathematica,application-integration,Wolfram Mathematica,Application Integration,我想用Mathematica进行数值积分。被积函数是 I=Exp[-z^2]F[z]^2 其中F[z]定义为积分[1/(q+I)Exp[-c(q+z)^2],{q,-无穷大,0}]。因为Mathematica不知道如何进行积分,所以必须用数值进行积分。我必须将集成更改为“NIntegrate”。在我看来,Mathematica拒绝对另一个数值积分进行数值积分。我不在多变量上使用NIntegrate的原因是,实际的被积函数是长而复杂的,涉及F[z] 我还想知道我们是否可以定义自己的特殊函数,比如M

我想用Mathematica进行数值积分。被积函数是

I=Exp[-z^2]F[z]^2

其中F[z]定义为积分[1/(q+I)Exp[-c(q+z)^2],{q,-无穷大,0}]。因为Mathematica不知道如何进行积分,所以必须用数值进行积分。我必须将集成更改为“NIntegrate”。在我看来,Mathematica拒绝对另一个数值积分进行数值积分。我不在多变量上使用NIntegrate的原因是,实际的被积函数是长而复杂的,涉及F[z]

我还想知道我们是否可以定义自己的特殊函数,比如Mathematica中的内置函数。因为误差函数是一个积分,当数值积分超过误差函数时,Mathematica不会抱怨。我可以像一个内置函数一样变换F[z]吗


非常感谢

谢谢比尔,你的建议行得通。唯一关心的是效率。如果我将误差函数定义为erf[z_?NumericQ]:=Sqrt[Pi]/2nintegrate[Exp[-t^2],{t,0,z}],并将该函数从-无穷大积分到无穷大,则所需时间为4.5s。但是如果我使用内置的Erf,整个集成需要0.056秒。我需要尽量减少时间。我还尝试将F函数定义为F[z_?NumericQ]:=F[z]=。。。这避免了重复计算,但实际的计算时间太长。编译到Mathematica内核中的函数通常比用户定义的函数快10-100倍。如果您确实需要速度,那么您可以尝试优化或简化您的函数。Mathematica中有一个编译函数,但这并不是一个新手很容易理解如何使用的。或者,您可以在Mathematica之外编写自己的C代码中F的优化集成,使用C编译器编译,并对其进行最少数量的调用。这些都不好。也许最好从一个关于速度的新问题开始,展示你的功能。
In[1]:= c = 2; (* make sure all variables have constant values assigned *)
F[z_?NumericQ] := NIntegrate[1/(q + I) Exp[-c (q + z)^2], {q, -Infinity, 0}];
NIntegrate[Exp[-z^2] F[z]^2, {z, 1, 3}]

Out[3]= 0.00387755 + 0.0794878 I