エクセルで逆行列を計算する際にエラーが発生する問題

このQ&Aのポイント
  • エクセル2007で108×108の対角行列の逆行列を計算する際に#NUMエラーが発生し、計算が進まない問題が発生しています。
  • 57×57以上の行列では行列式の値も#NUMとなり、逆行列の計算も#NUMとなってしまいます。
  • 問題の原因はソフトやPCの処理能力ではなく、別の要素に起因している可能性があります。
回答を見る
  • ベストアンサー

エクセルで逆行列を計算していますがエラーが出ます

よろしくお願いします。 エクセル2007で対角行列(108×108)の逆行列を計算していますが#NUMエラーが出て先に進めません。 108個の対角成分の値は7桁~4桁です。 ちなみに56×56までは計算できました。57×57からは計算できません。 57×57からは行列式の値も#NUMとなってしまい、逆行列も#NUMとなってしまいます。 先の計算に進めず困っております。 原因と#NUMの回避方法がありましたらご教示いただきたく、お願いいたしますm(__)m ソフトやPCの処理能力の問題かとも思ったのですが違うらしいです。 http://questionbox.jp.msn.com/qa4518892.html 私のPC動作環境は以下のとおりです。 OS:Windows Vista home premium メモリ:4.00GB プロセッサ:2.53GHZ どなたかご教示ください。 よろしくお願い致しますm(__)m

質問者が選んだベストアンサー

  • ベストアンサー
  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.5

#1です。 「対角行列」は読んでいませんでした。 一般の場合、逆行列をMINVERSE関数で求めるとき、Excelは行列式を計算します。対角行列かどうかはExcelは知らない。計算値がExcel最大値を超えて「#NUM」になるなら、 「=MINVERSE(行列範囲/k)/k で、求められるのではないか、ということです。 たとえば、質問の場合、k=1000にするとか、k=10000にするとかで。 ただし、Excelは、、有効桁数が15桁ほどだったと思うので、繰り返し計算が多いとデータによっては誤差が出ます。それはまた別の話ですが。

alo1-pphg9
質問者

お礼

ありがとうございますm(__)m この方法で計算できました! 大変助かりましたm(__)m

その他の回答 (4)

  • f272
  • ベストアンサー率46% (7998/17099)
回答No.4

対角行列の逆行列ですね。対角成分を逆数にするだけですから,エラーが出るような状況にはならないはずだが,どうやって計算してるの?

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.3

#1です。 ああ、Excelの制限だけ気にしていたのですが、行列の桁数を下げればできるかも。 1000*|1.2345|とかにすれば回避できるか。でも制限に引っかかるかな。

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.2

#1です. 訂正してください。 3.回避方法 行列の次数を下げて ↓ 3.回避方法 行列式の次数を下げて

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.1

1. 「ソフトやPCの処理能力の問題かとも思ったのですが違う」 どうしてそう思うのでしょうか。 Excel 2007の仕様では、処理できる最大値は、1.79769313486231E+308です。 逆行列を求めるには行列式の値を使います。 7桁~4桁の数の108乗を扱うことになれば、最大値をオーバーして「#NUM」になります。57×57ほどすなわち57乗程度が限度でしょう。 2. 逆行列がなければ、「#NUM」になります。行列式の値が0でなければいいのですが、それを確認するにも、1.の制限でそのままではできないでしょう。 3.回避方法 行列の次数を下げて計算して再組立てすればできるはずですが、108次から56次以下まで下げるなんて、プログラムでも組まなければにわかにはできないでしょう。 数学計算専用ソフトでも使いますか。

関連するQ&A

  • 対称行列の逆行列

    対称行列で、対角成分が正の値のみからなる行列があります。 この行列の逆行列の対角成分は正値のみからなるというのは正しいでしょうか。

  • 逆行列のアルゴリズム

    現在逆行列を求めるアルゴリズムを勉強してるんですが、全然わかりません。 とあるサイトさんから逆行列を求めるソースを拝借させていただきました。 実際に2行2列の値を入れて手計算でプログラムを追っていったら23行目で対角成分に1を代入したり、33行目で対角成分以外の成分に0を代入しているのはわかるんですが、わかるのはその程度で、もっと詳しくアルゴリズムを教えていただきたいです。 わかりやすいサイトなどでも結構なんで教えていただけると助かります! よろしくおねがいします。 #include <stdio.h> 01:int main(void) 02:{ 03: 04: double exp_At[2][2]={{1,3},{2,1}}; //入力用の配列 05: double inv_exp_At[2][2]; //ここに逆行列が入る 06: double buf; //一時的なデータを蓄える 07: int i,j,k; //カウンタ 08: int num=2; //配列の次数 09: //単位行列を作る 10: for(i=0;i<num;i++) 11: { 12: for(j=0;j<num;j++) 13: { 14: inv_exp_At[i][j]=(i==j)?1.0:0.0; 15: } 16: } 17: /* 掃き出し法 */ 18: for(i=0; i<num; i++) /* 逆行列をexp(-At)求める */ 19: { 20: buf=1/exp_At[i][i]; 21: for(j=0; j<num; j++) 22: { 23: exp_At[i][j] *= buf; 24: inv_exp_At[i][j] *= buf; 25: } 26: for(j=0; j<num; j++) 27: { 28: if(i != j) 29: { 30: buf=exp_At[j][i]; 31: for(k=0; k<num; k++) 32: { 33: exp_At[j][k] -= exp_At[i][k] * buf; 34: inv_exp_At[j][k] -= inv_exp_At[i][k] * buf; 35: } 36: } 37: } 38: } 39://逆行列を出力 40: 41: printf("逆行列exp(-At)=\n"); 42: 43: for(i=0;i<num;i++) 44: { 45: for(j=0;j<num;j++) 46: { 47: printf(" %f",inv_exp_At[i][j]); 48: } 49: printf("\n"); 50: } 51:}

  • 逆行列の値を求める問題です

    3次正方行列001        020        300 の逆行列を求めてください。 この場合、「対角行列の逆行列は、各成分の逆数になる」は使えないですよね? そもそも対角行列ではないですし。答えは 001/3  01/20  100

  • 三角行列 対角行列

    三角行列における行列式の計算は、 対角成分の総積で計算できますが、 対角行列(正方行列であって、その対角成分以外がゼロ であるような行列の事。)の行列式も同様に対角成分の 総積で計算して良いでしょうか? 以上、ご回答よろしくお願い致します。

  • 逆行列(LU分解)を求める数値的なテクニック

     ある行列の逆行列をLU分解で求めるプログラムを使用しています。その行列の成分の大きさの最大値と最小値の差が10の30乗ほどあります。コンピュータで計算する場合、極端に大きな数字や小さな数字のまま計算すると正しく計算できないことがあります。AA-1=Eなので、行列の各成分をX倍すれば、求めたい逆行列A-1のX倍の逆行列が求まります。これをX分の1にすれば、求めたい逆行列を求めることができます。  すなわち、各成分の値がコンピュータで処理するのに適していない場合、ある種の補正によって、計算が可能となり、出てきた逆行列はその補正とは反対の操作をすることで求めたい逆行列を求めることができます。  そこで質問です。  コンピュータで逆行列を計算するのに適した行列の成分の値の大きさはいくつ程度でしょうか。  またその適した値にするテクニックとしてはどのようなものがあるでしょうか。

  • 行列の和の逆行列について

    情報処理系の数学(カルマンフィルタとか)では(A+B+C)^(-1)とか(A+BCF)^(-1)のように行列の和(あるいは行列と行列の積の和)の逆行列の表式があり、公式のようなものが与えられていたりします。その中で例えば(A+B+C)^(-1)でA,B,Cとは何かと言うと行列(普通は正方行列?)なわけですが、例えば単に1つの値(スカラー)であった場合は逆数というのは自然な拡張としてあり得ると思います。1行1列の行列の対角成分だけの行列と見なすわけです。これはいいだろうと思います。問題はAなどがベクトルだったときです。これは計算できないということでいいでしょうか。ベクトルだったら1行N列の行列(N行1列でも)ということであり、逆行列が定義できないということになるでしょうか。カルマンフィルタなどではベクトルではないかと思うものが式の中に入っているのですが。Rで実験してみるとAの逆行列はsolve(A)だけで求まります。Aがスカラーだったら予想どおり逆数なります。ベクトルだったらエラーです。やはりベクトルだと当然ダメということでしょうか。

  • 行列式の計算について

    対角成分(i,i)が、 "a(i)+b" で それ以外の成分が全て "b(≠0)" のn次正方行列の行列式が a(1)・a(2)・a(3)…a(n)・b となるらしいのですが、どうしてでしょうか。 全ての列からn列を引くと0が沢山でてきて計算できそうなのですが うまくいきません。 よろしくお願いします。

  • 行列の計算 数C程度

    おそらく、非常に初歩的な問題だと思うのですが、どうしてもうまくとけません。以下の問題を教えてください。 行列A=[1 -2] 行列P=[1 q] 行列QAP=[α 0]      [1  4]     [r s]        [0 β] ※QはPの逆行列 すなわち、  Q=[ s -r]                        [-q s] このとき、 「上記のQAPとなるように行列Pのq,r,sを求めよ。」またそれに対するα,βの値を求めよ。ただし、α>β , s-qr」 QAPを計算し、対角行列であるから、(1,2)成分と(2,1)成分が0になることを利用して、連立方程式で解こうと思ったのですが、 r=-1,-1/2 は求まるのですが、 q,sが求めることができません。 どなたかq,r,sの求め方を教えてください。

  • 固有ベクトルの逆行列が存在しない?

    行列A= (0,1,1) (1,0,1) (1,1,0) の固有値と固有ベクトルを求める(ただし各固有ベクトルの最大の成分は1となるようにする) 問題なのですが, 固有値λ=-1(重解),2 と求め 固有ベクトルをそれぞれ x=(x1,x2,x3)=(1,-1/2,-1/2),(1,1,1) と求めたのですが, 対角化行列P= (1,1,1) (1,-1/2,-1/2) (1,-1/2,-1/2) の行列式が0になってしまいPの逆行列が存在しないことになってしまいます。 これはどこかで計算ミスをしているのでしょうか? それとも固有ベクトルに逆行列が存在しないことはあるのでしょうか? 自分ではこれ以上見直しても分からないので 教えてくださると助かります。

  • 分散共分散行列の逆行列

    以下の行列を考えます. 行列X(M行N列,成分の値は分散1のガウスノイズ) 行列Xの分散共分散行列S(M行M列), 行列Sの逆行列Y(M行M列) N=M+1のときはN≠M+1のときに比べて行列Yの各成分の大きさがかなり大きくなる,という結果が得られました. (計算にはMATLABの関数covとpinvを用いました.) これは数学的に正しいことなのでしょうか. また,正しいとしたらどうしてこのようなことが起こるのでしょうか. 行列Yの計算結果の例を以下に示します.(行列Yを500回算出し,それらの平均値を示しています.) http://wisteria.orz.ne.jp/download/pinvcovX.jpg 縦・横方向の軸は行列Yのインデックスを,高さ方向の軸は行列Yの成分の値を示しています. 上述した現象の原因についてご教授いただけると幸いです.

専門家に質問してみよう