Matlab中的双重符号积分

时间:2016-04-11 15:43:47

标签: matlab symbolic-math arbitrary-precision

我正在尝试计算一些积分,例如:

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) 提前感谢您的帮助。

1 个答案:

答案 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指定较小的绝对和相对容差,以获得更准确的值,但这会导致计算时间慢得多。