1

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

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

我发现我可以调用 callexpand(fun)将 1e-320 乘以括号。生成的表达式然后具有预期大小的指数(在 -1 到 -30 范围内),但我更希望首先知道表达式看起来像这样的原因,以及是否有比调用更好的选项expand来避免问题。此外,调用expand似乎创建了一个比我拥有的更复杂的函数,我试图在这里获得一个计算速度非常快的函数。

4

1 回答 1

1

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

我读过的最好的理由是这个

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

于 2015-11-30T14:00:05.523 回答