2016-09-20 2 views
1

私はCramerのルールに精通しており、なぜそれが「役に立たない」のかを知っています。しかし、以下のコードを使用して残差がxxxxE-016のようなものを与えるとき、私は興味があります。ここで、xxxxは数字を表します。私は線形方程式の浮動システムの3〜10の行列サイズで以下のコードを試しました。MATLAB:Cramerのルールの残余エラー

残存誤差が最小限に抑えられるのはなぜですか?

このようなエラーを最小限に抑えるためのコードにdisp(['norm of Cramer's rule residual = ' num2str(norm(A*x-b),4)])の正しい構文がありませんか?

私は提供されたコードは、私だけが当たり前

 function x=cramerr(A,b) 
     A=input('matrix A ='); 
     b=input('vector b ='); 
     n=size(A,1); 
     m=size(A,2); 
     tic; 
     if n~=m 
      Error ('The matrix is not square!'); 
      x=[]; 
     else 
      detA=det(A); 
    if det(A)~=0 
      x=zeros(n,1); 
    for j=1:n 
     if j~=1 & j~=n 
      Ab=[A(:,1:j-1) b A(:,j+1:n)]; 
     elseif j==1 
      Ab=[b A(:,2:n)]; 
     elseif j==n 
      Ab=[A(:,1:n-1) b]; 
     end 
      x(j)=det(Ab)/detA; 
     end %for j=1:n 
    else 
      Error('The matrix A has a zero determinant'); 
      x=[]; 
    end % if det(A)~=0 
     toc; 
     disp(['norm of Cramer's rule residual = ' num2str(norm(A*x-b),4)]); 
    end % if n~=m 

に使用する構文を疑う、完璧に働いているあなたは、一例として、これを使用することができますしてください

A =[0.373,0.296;0.326,0.260]; 
    b =[0.521;0.456]; 

おかげ

+0

字下げを修正できますか?あなたのコードは読みにくいです。 – edwinksl

+0

ここのコードは普通のようです。しかし、私があなたが要求するように調整します – dupsy

+2

メソッドが不安定であるという理由だけで、それはあなたに間違った答えを与えることを意味しません。それはちょうどそれがあなたにそれを避けるのに十分である正確な答えを与えないかもしれないことを意味します。その小さな誤差は、機械の精度である 'eps(1)'とほぼ同じです。これは、Cramerのルールがマシンの精度内で正しいことを意味します。 –

答えて

1

I wouldnこれは問題そのものだとは言いません。 Cramerのルールを使用するときに行うことは、方程式の線形システムを解くことです。 Matlabでは、x=inv(A)*bで簡単に行うことができます。このアルゴリズムでは、逆アルゴリズム(LU分解)を計算するアルゴリズムが異なります。逆関数と決定要因に関するMatlabのページでは、それは言う:

Aが正方かつ正則であれば、方程式AX = IとXAは=私はこの解決策は、Aの逆数と呼ばれる 同じソリューション、Xを持っています、 A-1で示される であり、関数invによって計算される。マトリックスの行列式 は、理論的考察や記号計算のいくつかのタイプで有用ですが、スケーリングと丸め誤差のプロパティ は、数値計算ではそれほど満足できるものではありません。それにもかかわらず、 関数detは、正方行列の行列式を計算します。

あなたはこれを行うことができ、両方の精度をチェックしたい場合:

format long 
built_in=inv(A)*b 
own_function=r(A,b) 

をし、結果を比較します。私が得たものは:

built_in= [1.000000000000000;0.500000000000000] 
own_function= [1.000000000000054;0.500000000000000] 

小さな基準の由来を知ることができます。これを念頭に置いて、このようなエラーは、エラーを四捨五入している可能性が最も高いです。

disp(['norm of Cramer's rule residual = ' num2str(norm(A*x-b),4)])のフォーマットについては、Cramer'sでアポストロフィ(')をスキップするとエラーが発生します。

+0

@ptevにあなたの提案をありがとうございました。あなたが指摘したように、ギャップ/エラーを見ました。しかし、私はあなたの最後の声明を完全に理解していません。 "dispのフォーマットについては、Cramerのルールの残差= num2str(ノルム(A * x-b)、4)])では、Cramer'sのアポストロフィ( ')をスキップするとエラーが発生します。 – dupsy

+0

ああ、申し訳ありません - 私はあなたが 'Cramer'sの代わりに' disp'の行に 'Cramers'を書かなければならないことを意味しました。余分な '''は文字列を分割し、Matlabにエラーを与えます。私の提案は簡単です: 'disp(['norm of Cramers rule residual =' num2str(norm(A * x-b)、4)]' – ptev

関連する問題