我正在尝试计算一些积分,例如:
a = 1/sqrt(2);
b = -5;
c = 62;
d = 1;
f = exp(-x^2-y^2)*(erfc((sym(a) + 1/(x^2+y^2)*(sym(b)*x+sym(d)*y))*sqrt((x^2+y^2)*sym(10.^(c/10))))...
+ erfc((sym(a) - 1/(x^2+y^2)*(sym(b)*x+sym(d)*y))*sqrt((x^2+y^2)*sym(10.^(c/10)))));
h = int(int(f,x,-Inf,Inf),y,-Inf,Inf);
会发生这样的错误:
警告:找不到显式积分。
然后,我尝试使用vpa
来计算积分,并得到像这样的结果
vpa(int(int(f,x,-Inf,Inf),y,-Inf,Inf),5)
numeric::int(numeric::int(exp(- x^2 - y^2)*(erfc(((6807064429273519*x^2)/4294967296 + (6807064429273519*y^2)/4294967296)^(1/2)*(2^(1/2)/2 + (5*x - y)/(x^2 + y^2))) + erfc(((6807064429273519*x^2)/4294967296 + (6807064429273519*y^2)/4294967296)^(1/2)*(2^(1/2)/2 - (5*x - y)/(x^2 + y^2)))), x == -Inf..Inf), y == -Inf..Inf)
我已尝试将时间间隔[-Inf,Inf]
更改为[-100,100]
,并获得相同的结果:
numeric::int(numeric::int(exp(- x^2 - y^2)*(erfc(((6807064429273519*x^2)/4294967296 + (6807064429273519*y^2)/4294967296)^(1/2)*(2^(1/2)/2 + (5*x - y)/(x^2 + y^2))) + erfc(((6807064429273519*x^2)/4294967296 + (6807064429273519*y^2)/4294967296)^(1/2)*(2^(1/2)/2 - (5*x - y)/(x^2 + y^2)))), x == -100..100), y == -100..100)
我的问题是为什么在这种情况下vpa
无法恢复到真正的价值?
上面的Matlab代码有问题吗? (我,我自己,到目前为止找不到这个bug)
提前感谢您的帮助。
答案 0 :(得分:1)
这种积分不太可能存在分析解决方案,因此使用int
可能不是一个好的选择。在某些情况下,vpa
可用于数字解决方案。当这个失败时(通过返回一个自己的调用),可能有几个原因:积分可能不存在,积分可能收敛太慢,奇点可能引起问题,被积函数可能是高度振荡或不平滑等.Mathematica也在努力解决这个问题。
您可以尝试使用integral2
a = 1/sqrt(2);
b = -5;
c = 62;
d = 1;
f = @(x,y)exp(-x.^2-y.^2).*(erfc((a + 1./(x.^2+y.^2).*(b*x+d*y)).*sqrt((x.^2+y.^2)*10^(c/10)))...
+erfc((a - 1./(x.^2+y.^2).*(b*x+d*y)).*sqrt((x.^2+y.^2)*10^(c/10))));
h = integral2(f,-Inf,Inf,-Inf,Inf)
返回5.790631184403967
。这与使用NIntegrate
的Mathematica数值积分相比较。您可以尝试为integral2
指定较小的绝对和相对容差,以获得更准确的值,但这会导致计算时间慢得多。