057_ExactCalc.mws

計測データを使用した、数値計算と厳密計算の違い

このワークシートでは、Excel から .csv として保存した数値データファイルを Maple で読み込み、誤差のない厳密な計算をおこないます。

>    restart;

まず、Excel ファイルを csv 形式(カンマ区切り)で保存されたファイルを ImportMatrix 関数で読み込みます。

ImportMatirx 関数の利用方法は ImportMatirx ( "ファイルのパス" , delimiter = "区切りのタイプ" ) ; となります。

各区切りタイプに対応する入力コマンド

>    Edata:=ImportMatrix("C:/Book.csv",delimiter=",");

Edata := Matrix(%id = 12837364)

行列として読み込んだ出力を右クリックし、コンテクストメニューから [ 参照 ] を実行すると、以下のような行列の情報を知ることが出来ます。

[Maple Bitmap]
                          
図 1
                 

図1の状態から、色で表現されている部分をマウスで選択していくことにより、値も参照することが可能です。

[Maple Bitmap]
                           
図 2

それでは、読み込んだ行列 Edata から逆行列を求め、M I 1 と定義します。

>    MI1:=LinearAlgebra[MatrixInverse](Edata);

MI1 := Matrix(%id = 12849208)

Edata (読み込んだ元のデータ) と M I 1 (Edata の逆行列) の逆行列を掛け算します。
20×20の単位行列になっていることが理想です。

>    Edata.MI1;

Matrix(%id = 12856420)

結果を参照してみると、対角成分以外のほとんどの部分が 0 (白色)になっていません。
小さい誤差といえますが、正確な値を求めれていないのは確かです。

[Maple Bitmap]
                            
図 3
   
この原因は、数値計算が行われているため、誤差が発生しています。

使用する数値計算方法のアルゴリズムにより、誤差は変化すると思われますが、行列での数値計算を重ねれば重ねる程、
様々な誤差(使用するアルゴリズムによる誤差、桁数の打ち切り誤差)が発生していくと言えます。

ただし、Maple は有理数に変換することが可能で、
有理数として計算する場合は正確な値で求めることが出来ます。

>    REdata:=map(convert, Edata, rational);

REdata := Matrix(%id = 12861040)

値が有理数に変換されているかを調べます。
図 2 の青枠で囲まれている部分を確かめます。

>    REdata[7,7];

51/7

確認の為、20 桁の数値で表示してみます。

>    evalf(REdata[7,7],20);

7.2857142857142857143

MatrixInverse 関数で有理数に変換した REdata の逆行列を求めます。

>    MI2:=LinearAlgebra[MatrixInverse](REdata);

MI2 := Matrix(%id = 13058620)

REdata と求めた M I 2 の掛け算を実行します。

>    REdata.MI2;

Matrix(%id = 13043300)

対角成分以外は 0 なので、正確な逆行列が求められていることが分かります。
見事に 20×20 の単位行列になっています。

[Maple Bitmap]

この様に浮動小数点数を含む計算を行うと、計算精度等の問題から、桁落ちや丸め誤差が発生してしまいますが、Maple では浮動小数点数を有理数に変換し計算を行うことが出来ますので厳密な値を求めることが可能になります。