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

m と P が何であるかを説明しましたが、X とは何ですか? X は明らかにシンボリック変数です。したがって、以降の計算はすべてシンボリックに行われます。

于 2012-12-02T02:47:28.987 に答える
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 に答える