Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab中符号积分的变精度算法_Matlab_Symbolic Math_Arbitrary Precision - Fatal编程技术网

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