Matlab符号表达式创建溢出

时间:2015-11-30 13:49:52

标签: matlab symbolic-computation

我正在使用Matlab符号工具箱来创建高复杂度的函数。然后将此函数写入.m文件(使用matlabFunction)。出于某种原因,在简化函数之后,函数在看起来像fun = (A*1.329834759483753e310 + B*5.873798798237459e305 + ...)*7.577619127319697e-320的表单上返回,其中AB是我的变量的函数(在这里重复太复杂)。也就是说,括号内的所有项都是大约1e280到1e300的量级。当指数变得大于约1.79e308时会出现问题,因为这会导致双精度溢出(当调用生成的.m函数时)。函数的实际大小远不会产生溢出,但这种表达函数的方式确实如此。如果简化函数将1e-320乘以括号,则可以解决这个问题,但由于某种原因,它并没有。

知道为什么符号工具箱会选择以这种方式表示我的功能吗?

我发现我可以拨打电话expand(fun)将1e-320乘以括号。然后得到的表达式具有预期大小的指数(在-1到-30的范围内)但是我想首先知道表达式看起来像这样的原因,并且如果有更好的选项而不是调用{{1避免这个问题。此外,调用expand似乎创建了一个比我更复杂的函数,我试图获得一个在这里评估得非常快的函数。

1 个答案:

答案 0 :(得分:1)

大指数乘数可能是由于公式中的一些浮点数。尽量避免使用它们并使用有理数(1/2而不是0.5)。

我读过的最好的原因是this one

  

浮点数倾向于转换为有理数,这通常涉及乘以2 ^ 53,然后从比率的顶部和底部分解出gcd。平方这样的值,你正在处理大约2 ^ 100的数字......依此类推。