Matlab 符号表达式产生溢出
Matlab Symbolic expression creates overflow
我正在使用 Matlab 符号工具箱创建一个高度复杂的函数。然后将此函数写入 .m 文件(使用 matlabFunction
)。由于某些原因,在简化函数之后,函数以类似于 fun = (A*1.329834759483753e310 + B*5.873798798237459e305 + ...)*7.577619127319697e-320
的形式返回,其中 A
和 B
是我的变量的函数(太复杂了,无法在此重复)。也就是说,括号内的所有项都在大约 1e280 到 1e300 的顺序。当指数变得大于 1.79e308 时就会出现问题,因为这会导致双精度溢出(在调用生成的 .m 函数时)。函数的实际大小远不会产生溢出,但这种表达函数的方式确实如此。如果 simplify 函数将 1e-320 乘以括号,这将得到解决,但由于某些原因它没有。
知道为什么符号工具箱选择以这种方式表示我的函数吗?
我发现我可以调用 call expand(fun)
将 1e-320 乘以括号。结果表达式然后具有预期大小的指数(在 -1 到 -30 范围内),但我更愿意首先知道表达式看起来像这样的原因,以及是否有比调用 [=15 更好的选择=] 来避免这个问题。此外,调用 expand
似乎创建了一个比我拥有的函数更复杂的函数,我试图在这里获得一个计算速度非常快的函数。
大指数乘数可能是由于公式中的一些浮点数。尽量避免使用有理数(1/2 而不是 0.5)。
我读过的最好的理由是 this one:
The floating point numbers tend to get converted to rational numbers, which usually involves multiplying by 2^53 and then factoring out the gcd from the top and bottom of the ratio. Square such a value and you are working with numbers on the order of 2^100... and so on.
我正在使用 Matlab 符号工具箱创建一个高度复杂的函数。然后将此函数写入 .m 文件(使用 matlabFunction
)。由于某些原因,在简化函数之后,函数以类似于 fun = (A*1.329834759483753e310 + B*5.873798798237459e305 + ...)*7.577619127319697e-320
的形式返回,其中 A
和 B
是我的变量的函数(太复杂了,无法在此重复)。也就是说,括号内的所有项都在大约 1e280 到 1e300 的顺序。当指数变得大于 1.79e308 时就会出现问题,因为这会导致双精度溢出(在调用生成的 .m 函数时)。函数的实际大小远不会产生溢出,但这种表达函数的方式确实如此。如果 simplify 函数将 1e-320 乘以括号,这将得到解决,但由于某些原因它没有。
知道为什么符号工具箱选择以这种方式表示我的函数吗?
我发现我可以调用 call expand(fun)
将 1e-320 乘以括号。结果表达式然后具有预期大小的指数(在 -1 到 -30 范围内),但我更愿意首先知道表达式看起来像这样的原因,以及是否有比调用 [=15 更好的选择=] 来避免这个问题。此外,调用 expand
似乎创建了一个比我拥有的函数更复杂的函数,我试图在这里获得一个计算速度非常快的函数。
大指数乘数可能是由于公式中的一些浮点数。尽量避免使用有理数(1/2 而不是 0.5)。
我读过的最好的理由是 this one:
The floating point numbers tend to get converted to rational numbers, which usually involves multiplying by 2^53 and then factoring out the gcd from the top and bottom of the ratio. Square such a value and you are working with numbers on the order of 2^100... and so on.