1


0

アルゴリズムの丸め誤差のレポートを生成するMATLABスクリプト

アルゴリズムにエラーの丸めレポートを取得するスクリプトの使用に興味があるか、作成しました。 スクリプトまたは類似の何かが既に行われていることを望みます…​ 設計で考慮される小数点以下の桁数に応じて精度誤差がどのようになるかを調べることが必要になる場合があるため、これはデジタル電子システムの設計に役立つと思います。 このスクリプトは、アルゴリズムコード、入力、出力の3つの要素で機能します。 このスクリプトは、アルゴリズムコードの行ごとにエラーを表示します。 roundnなどのコマンドを使用してアルゴリズムコードを変更し、出力のエラーを比較します。 私はエラーを次のように定義します

Errorrounding = Output(without rounding) - Output round

たとえば、私は次のアルゴリズムを持っています

calculation1 = input*constan1 + constan2 %line 1 of the algorithm
output = exp(calculation1)               %line 2 of the algorithm

ここで、「input」はn要素のベクトルの入力、「output」は出力、「constan1」と「constan2」は定数です。 nは入力ベクトルの要素数です

そのため、スクリプトに自分のアルゴリズムを入れて、次のアルゴリズムを自動的に生成しました。

input_round = roundn(input,-1*mdec)
calculation1 = input*constant1+constant2*ones(1,n)
calculation1_round = roundn(calculation1,-1*mdec)
output=exp(calculation1_round)
output_round= roundn(output,-1*mdec)

ここで、mdecは考慮する小数点以下の桁数です。 最後に、スクリプトは次のメッセージを出します

The rounding error at line 1 is #Errorrounding_calculation1

「#Errorrounding」は次の操作の結果になりますErrorrounding_calculation1 = Calculation1 -calculation1_round

The rounding error at line 2 is #Errorrounding_output

ここで、「Errorrounding_output」は次の操作の結果ですErrorrounding_output = output-output_round

似たようなことが既に行われていることを誰かが知っていますか、またはMatlabは関連するいくつかの問題に対処するためのソリューションを提供しますか? ありがとうございました。

2 Answer


5


最初のポイント: David Goldbergによるhttp://docs.sun.com/source/806-3568/ncg_goldberg.html [すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと]を読むことをお勧めします。 検討中の問題の複雑さをより理解するのに役立つ、浮動小数点計算に関する多くの問題を明らかにする必要があります。

*第二のポイント:*あなたが考えている問題は、あなたが理解しているよりも*はるかに*複雑です。 丸めによる精度の低下により、計算に導入されるエラーに関心があります。 あなたが気付いていないのは、これらのエラーがあなたの計算を通して_伝播するということです。 あなたの例を考えてみましょう:

output = input*C1 + C2

3つのオペランドのそれぞれがhttp://www.mathworks.com/help/techdoc/matlab_prog/f2-12135.html#f2-101310 [倍精度浮動小数点数]である場合、それぞれにいくつかのラウンド-精度のオフエラー。 この丸め誤差の限界は、関数http://www.mathworks.com/help/techdoc/ref/eps.html[EPS]を使用して見つけることができます。この関数は、1つの倍精度数値から次に大きい。 たとえば、 input`の表現の相対誤差の限界は 0.5 * eps(input) `か、それと次の最大の倍精度数の中間になります。 したがって、次のように3つのオペランドのエラー範囲を推定できます。

err_input = 0.5.*eps(input);  %# Maximum round-off error for input
err_C1 = 0.5.*eps(C1);        %# Maximum round-off error for C1
err_C2 = 0.5.*eps(C2);        %# Maximum round-off error for C2

これらのエラーは正または負の値になる可能性があることに注意してください。これは、真数が倍精度値として表現されるために切り上げまたは切り下げられた可能性があるためです。 ここで、これらのエラーを追加して四捨五入される前にオペランドの真の値を推定し、「出力」の計算を実行すると何が起こるかに注目してください。

output = (input+err_input)*(C1+err_C1) + C2+err_C2
%# ...and after reordering terms
output = input*C1 + C2 + err_input*C1 + err_C1*input + err_input*err_C1 + err_C2
%#       ^-----------^   ^-----------------------------------------------------^
%#             |                                   |
%#    rounded computation                      difference

このことから、計算を実行する前の3つのオペランドの精度の丸めにより、得られる出力が「差分」と同じくらい変化する可能性があることがわかります。 さらに、値 `output`が倍精度値として表現されるために丸められる場合、丸め誤差の別の原因があります。

したがって、精度の四捨五入によって生じる誤差を適切に見積もると思ったよりもかなり複雑であることがわかります。


2


これは、答えというよりも拡張されたコメントです。

  1. 私はこれが整形式ではないという理由でこれを閉じることに投票しています 質問。 それはある種のプログラムが存在し、あなたにとって興味深く、または有用であるという希望または希望を表しています。 質問を修正して、質問になることをお勧めします。

  2. 数値誤差を分析するためのMatlabプログラムを作成することを提案します 他のMatlabプログラムで。 これにはMatlabを使用しません。 おそらく_Mathematica_を使用します。これは、文字列(プログラムソーステキストなど)、シンボリック計算、および任意精度の算術演算に対してより高度な構造演算を提供します。 あなたが提案するものに対するMatlabの制限の1つは、Matlabは、他のすべての実際の算術のコンピュータ実装と同様に、丸め誤差に悩まされるということです。 他にも選択できる言語があります。

  3. あなたが提案することは非常に難しく、おそらく必要になるでしょう これを含むほとんどのSOersよりも長い答えは、書くことを考えて喜んでいるでしょう。 幸いなことに、他の人がこのテーマに関する本を書いています。http://www.amazon.co.uk/Accuracy-Stability-Numerical-Algorithms-Nicholas/dp/0898715210/ref=sr_1_5?s = books&ie = UTF8&qid = 1289903830&sr = 1-5 [this one] by NJ Higham。 http://en.wikipedia.org/wiki/Interval_arithmetic [間隔演算]などの問題を調査することもできます。

がんばろう。