Matlab中符号积分的变精度算法
我试图计算一些积分,它们使用非常高的幂指数。一个例子是:Matlab中符号积分的变精度算法,matlab,symbolic-math,arbitrary-precision,Matlab,Symbolic Math,Arbitrary Precision,我试图计算一些积分,它们使用非常高的幂指数。一个例子是: (-exp(-(x+sqrt(p)).^2)+exp(-(x-sqrt(p)).^2)).^2 ... ./( exp(-(x+sqrt(p)).^2)+exp(-(x-sqrt(p)).^2)) ... / (2*sqrt(pi)) 其中,p是常数(1000是一个典型值),我需要x=[-inf,inf]的积分。如果我使用integral函数进行数值积分,结果得到NaN。如果我把积分的极限设为[-20,20]和一个低的p(1,这应该是错
(-exp(-(x+sqrt(p)).^2)+exp(-(x-sqrt(p)).^2)).^2 ...
./( exp(-(x+sqrt(p)).^2)+exp(-(x-sqrt(p)).^2)) ...
/ (2*sqrt(pi))
其中,p
是常数(1000是一个典型值),我需要x=[-inf,inf]的积分。如果我使用integral
函数进行数值积分,结果得到NaN
。如果我把积分的极限设为[-20,20]和一个低的p
(1,这应该是错误的,因为方程应该渐近到1(或者辅域应该是[0,1])
我的vpa有什么问题吗?或者有没有其他方法来计算我的积分的高精度值?首先,你在做一些事情,使解决符号问题变得更困难和更不准确。变量
pi
是一个浮点值,而不是基本c的精确符号表示在Matlab符号数学代码中,您应该始终使用sym('pi')
。您应该对任何其他特殊数值执行相同的操作,例如,您使用的sqrt(sym('2'))
和exp(sym('1'))
,否则默认情况下它们将转换为近似有理分数(您在问题的代码中看到的奇怪的大数字的来源)。有关更多详细信息,我建议您通读函数的文档
应用上述方法,下面是一个可运行的示例:
syms x;
p = 1000;
f = (-exp(-(x+sqrt(p)).^2)+exp(-(x-sqrt(p)).^2)).^2./(exp(-(x+sqrt(p)).^2)...
+exp(-(x-sqrt(p)).^2))/(2*sqrt(sym('pi')));
现在vpa(int(f,x,-100100))
和vpa(int(f,x,-1e3,1e3))
精确返回1.0
(精度为32位,见下文)
不幸的是,vpa(int(f,x,-Inf,Inf))
不返回答案,而是调用底层的MuPAD函数。正如我在中所解释的,这就是当int
无法获得结果时可能发生的情况。通常,它应该尝试以数字形式计算积分,但您的函数在±处似乎定义不正确∞, 导致变量精度求积方法无法很好地处理被零除的问题。您可以通过使用函数增加变量精度来计算更宽范围内的积分(只需记住在完成时将位数设置回默认值32)。设置位数(128)
允许我计算vpa(int(f,x,-1e4,1e4))
。您还可以在较低有效位数设置下通过2*vpa(int(f,x,0,1e4))
在更大范围内更有效地计算积分
如果您的目标是查看比一个p=1000
对应的值小多少,您可以使用类似于vpa(1-2*int(f,x,0,1e4))
的内容。在位(128)
处,返回
0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086457415971094118490438229708839420392402555445545519907545198837816908450303280444030703989603548138797600750757834260181259102
应用于这表明,它大约是<代码>8.6e-89谢谢,这起了工作!我还有另一个,虽然:(-7*exp((x+x+7*7*sqrt(x+7+7*7*sqrt(p/21)p/21)表示,我有另一个,但我有另一个:(-7*exp(((x+x+7*x+7*x+7*7*sqrt(x+7*x+7*sqrt(x+7*sqrt)sqrt(x+7*sqrt(x+7*sqrt(p/x+7*sqrt(p/x+7*sqrt(p/x+7*sqrt(p/x+7*sqrt(p(p/p/p/p/p/p/21)sqrt(p/21)(p/21)(p/21)(p/21)(p/21)p/p/p/p/p/p/21)^2./(exp(-(x+7*sqrt(p/21))。^2)+exp(-(x+5*sqrt(p/21))。^2)+exp(-(x+3*sqrt(p/21))。^2)+exp(-(x+7*sqrt(p/21))。^2)+exp(-(x-5*sqrt(p/21))。^2)+exp(-(x-3*sqrt(p/21))。^2)+exp(-(x-sqrt(p/21))。^2)+对于p=0.001,Matlab在这一个上无休止地运行。有什么想法吗?有两件事要尝试。0.001
没有精确的浮点表示法。符号数学引擎似乎正确地将其识别为这个十进制值1/1000
,但如果您改为设置p=1/sym(1000)
(通常可能是个好主意),似乎方程的操作方式不同。您也可以尝试设置p=1/vpa(1000)
。对于本例,在这两种情况下,我都能从vpa(int(f,x,-Inf,Inf))
得到相同的结果。
0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086457415971094118490438229708839420392402555445545519907545198837816908450303280444030703989603548138797600750757834260181259102