2

我目前正在研究 Matlab 中的基本优化算法,并且遇到了 Matlab 以荒谬的精度保存变量的问题。在几次迭代中,变量是如此之大,以至于它实际上触发了 sym.m 中的某种无限循环。

这是开始这一切的代码行:

SLine = (m * (X - P(1))) + P(2);

其中 P = [2,2] 和 m = 1.2595。当我在命令行中手动键入这行代码时,SLine 被保存为符号表达式 (2519*X)/2000 - 519/1000。我不确定为什么它不使用十进制近似值,但至少这些分数具有正确的值。然而,当这行代码在我的程序中运行时,它会将 SLine 保存为表达式 (2836078626493975*X)/2251799813685248 - 584278812808727/1125899906842624,除此之外,它甚至不精确到小数点后四位。这些庞大的部分正在通过我的程序进行,随着每一行新代码的增加而增长,并导致它停止运行。

有谁知道为什么 Matlab 会这样?有没有办法指定在执行计算时应该使用什么精度?感谢您的任何帮助,您可以提供。

4

3 回答 3

1

欢迎来到符号计算的乐趣!

大多数符号代数系统将数字表示为有理数,$(p,q) = \frac{p}{q}$,并对这些数执行有理算术运算(+、-、*、/),从而产生有理结果。通常,这些结果是精确的(也称为无限精度)。

众所周知,有理数运算产生的有理数的大小呈指数增长。因此,如果你试图用任何符号代数系统解决一个现实问题,你最终会耗尽空间或时间。

这是关于这个主题的最后一句话,Nick Trefethen FRS 展示了为什么浮点运算对于解决实际数字问题绝对至关重要。

http://people.maths.ox.ac.uk/trefethen/publication/PDF/2007_123.pdf

在 Matlab 中试试这个:

function xnew = NewtonSym(xstart,niters);
% Symbolic Newton on simple polynomial
% Derek O'Connor 2 Dec 2012. derekroconnor@eircom.net
x = sym(xstart,'f');

for iter = 1:niters
    xnew = x - (x^5-2*x^4-3*x^3+3*x^2-2*x-1)/...
               (5*x^4-8*x^3-9*x^2+6*x-2);
    x    = xnew;
end

function xnew = TestNewtonSym(maxits);
% Test the running time of Symbolic Newton
% Derek O'Connor 2 Dec 2012.

time=zeros(maxits,1);
for niters=1:maxits
    xstart=0;
    tic;
    xnew = NewtonSym(xstart,niters);
    time(niters,1)=toc;
end;
semilogy((1:maxits)',time)

符号牛顿

于 2012-12-02T18:45:47.200 回答
1

您已经告诉我们 m 和 P 是什么,但 X 是什么?X 显然是一个符号变量。所以进一步的计算都是象征性地完成的。

于 2012-12-02T02:47:28.987 回答
0

因此,从有关符号计算的 MATLAB 参考文档中,符号表示将始终采用精确的有理形式,而不是浮点数的十进制近似值 [1]。这样做的原因显然是为了“帮助避免舍入错误和表示错误”[2]。

精确的表示是仅通过符号算术无法克服的。但是,您可以在 Matlab 中使用可变精度算术 (vpa) 来获得相同的精度 [3]。

例如

>> sym(pi)
ans = 
0

>> vpa(sym(pi))
ans = 
3.1415926535897932384626433832795

参考

[1] http://www.mathworks.com/help/symbolic/create-symbolic-numbers-variables-and-expressions.html

[2] https://en.wikibooks.org/wiki/MATLAB_Programming/Advanced_Topics/Toolboxes_and_Extensions/Symbolic_Toolbox

[3] http://www.mathworks.com/help/symbolic/vpa.html

于 2016-06-08T09:56:07.770 回答