• 締切済み

mathematicaでの行列の計算

Aを5×5の行列として(成分は与えられている) Pを5×5行列で各列、各行に1が一つ(残りは0)の行列(置換行列) とします。このときに全てのPに対して P×A×(Pの逆行列) を計算するプログラムってmathematicaで出来るのでしょうか? 分かりにくい説明で申し訳ありません! いずれはn×nでやりたいと思っているのですが、とりあえず5×5くらいで考えています。 あまりmathematicaはやったことがないので、変な質問でしたらすみませんっ。。。

みんなの回答

回答No.2

置換行列の定義が。ちょっとあいまいな様な気もします。任意の整数を与えたとき、転置行列のリストを返す関数を以下に掲げます。引数で、Debug->Trueをあたえると、計算の途中結果を見ることができます。 置換行列の解釈が私と違う場合、最初の関数を書き直してください。 Options[generatePList] = {Debug -> False}; generatePList[n_, OptionsPattern[]] := Module[{i, j, d, J, elm, idxList, idx, mList, debug}, (* 各行に、1が一つだけ、他は0の行列のリストをつくる *) (* 行列のインデックスの表を作る {{i1,j1},{12,j2},...}をつくる。 Det(P)は逆行列を持たねば張らないから、jk \[NotEqual] jm ( j \[NotEqual] m) *) debug = OptionValue[Debug]; J = Permutations[Range[n]]; idxList = {}; For[i = 1, i <= Length[J], i++, j = 1; elm = Map[{j++, #} &, J[[i]]]; idxList = Append[idxList, elm]]; If[debug, Print["idxList = ", idxList ]]; (* 行列を作る *) idx = Map[# -> 1 &, idxList, {2}]; If[debug, Print[" idx = ", idx]]; mList = Map[Normal[SparseArray[#]] &, idx]; If[debug, Map[Print["matrix = ", MatrixForm[#]] &, mList]]; mList ] (* 次に PAP^(-1)を計算する部分です.これも計算結果を返してくれます *) (* 正方行列が、与えられたとき置換行列をすべて計算し、PAP^-1のリストを返す *) Options[compulePAInverseP] = {Debug -> False}; compulePAInverseP[A_, OptionsPattern[]] /; MatrixQ[A] := Module[{debug, dim, pList, i}, debug = OptionValue[Debug]; dim = Dimensions[A]; If[dim[[1]] != dim[[2]], Print["Not Square Matrix"]; Return[Null]]; pList = generatePList[dim[[1]], Debug -> debug]; For[i = 1, i <= Length[pList], i++, Print[" P = ", MatrixForm[pList[[i]]], " , INV(P) = ", MatrixForm[Inverse[pList[[i]]]], ",PAP^(-1) = ", MatrixForm[Simplify[pList[[i]] A Inverse[pList[[i]]]]]] ; ]; Map[# A Inverse[#1] &, pList] ] A = Array[a, {3, 3}] compulePAInverseP[A] (* とすると、お望みの結果が得られます。*)

  • info22
  • ベストアンサー率55% (2225/4034)
回答No.1

同類のソフトのMapleでできますのでMathematicaでもできると思います。 参考URLに行列の積や逆行列の取り方の例がありますので参考にしてやってみてください。

参考URL:
http://www.alpha-works.com/math/mathematica/chap6/content.html
be-bechan
質問者

お礼

ありがとうございます! これからちょっとやってみます。

関連するQ&A

  • mathematicaの質問です

    mathematicaで色々な行列計算をしています。 例えば、行列として、P={{1, 0, 0}, {1, 3/2, 0}, {1, 3/4, 3/2}}のような行列があるとします。 この行列のP32成分とP33成分だけを取り出して、色々計算したいと思っています。この行列を一旦リスト化して、もっと大きい行列では、Forを使うなどして要素を色々計算できたらと思っています(Arrayなど色々やってみたのですが・・ このよううに値が入っているN×Nの正則行列を一旦リスト化(配列に)して要素を取りだして計算などするにはどうすればよいのでしょうか? 独学でmathematicaを勉強してまして、色々調べましたがわからず投稿させていただきました。よろしければお願いいたしますm(_ _)m

  • Mathematica を使った行列の積に関するご質問です.

    Mathematica を使った行列の積に関するご質問です. Mathematica で,n行1列の行列 と 1行n列の行列 の積を計算したいのですが,計算の方法がわかりません. 教えていただけると大変助かります.

  • 行列式(n-1次)の計算について

    n-1次正方行列Aの成分が以下のようなとき 行列式の値はどうなるでしょうか。 対角成分が {1/p(i)}+{1/p(n)} (n=1,2,3,…,n-1) その他の成分がすべて 1/p(n)  ただし、p(1)+p(2)+p(3)+…p(n-1)+p(n)=1 答えは、 p(1)・p(2)・p(3)・…p(n-1)・p(n) になると解答には書いてあります。 全ての列からn-1列目を引くと、0が沢山でてきたのですが、 最後まで導けませんでした。 よろしくお願いします。

  • Mathematicaでの行列計算

    MathematicaでN×Nの複素行列   ┌               ┐   | a_11+i*b_11 … a_1N+i*b_1N | A= |                |   | a_N1+i*b_N1 … a_NN+i*b_NN |   └               ┘ などでa_ij、b_ijを実数として Conjugate[A]などを計算するためにはどうしたらよいでしょうか? Assumptions->{Im[a_11]==0,Im[a_12]==0,Im[a_13]・・・・・}のように単純に一つ一つ定義していくのではなく、a_ij、b_ijをいっぺんに定義する方法があればお願いします。

  • 行列式の計算について

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

  • Σの計算について(行列を含む)

    よろしくお願いします。 以下のΣの計算になりますが行列を含みます。 このことによりちょっと混乱が生じ、正しい解答を導くことができません。 順序立てて回答を頂けると幸いです。 N=10で構いません。 N Y = Σ(A) ・x^n・x^(N-n) n=1 行列 A は以下のように1行2列です(括弧がうまく書けません)。 N n

  • 行列の計算

    お恥ずかしいながら、行列の計算でてこずっております。 以下の問題です。 行列A、Bをn×n行列とする。 また行列Aのi,j成分をa(i,j)とし、行列Bのi,j成分をb(i,j)とする。 ここで a(i,j) = {n-i+1 (1≦j≦i), n-j+1(i+1≦j≦n)} b(i,j) = {1(i=j=1), 0(i≠j-1, j, j+1), -1(i=j-1, j+1), 2(j=k)} である。 このとき、行列A×Bのi,j成分を求めよ。 という問題です。 答えはi=jのとき1,i≠jのとき0 (つまり、A×B=I(n×nの単位行列)) なのですが、そこまでの計算のプロセスが分かりません。 分かり易いご解答をお待ちしております。

  • Mathematicaで行と列の総和を求めたい

    Mathematicaで行と列の総和を求めたいのですが、簡単に算出するコマンドはないのでしょうか? 例えば、下の行列式の場合は、 ┌ ┐ | 1 2 3 | | | | 1 2 3 | └ ┘ 各行成分の総和が[6,6]で、各列成分の総和は[2,4,6]のベクトルになりますよね。 このような感じにしたいのですが・・・。

  • 行列の問題

     N行N列の行列A   行列Aの成分は成分を(行,列)で表すと、(1,1)=(N,N)=2、(1,2)=(1,N)=(2,1)=(N,1)=(N-1,N)=(N,N-1)-1  この行列の固有値と固有ベクトルを求めたいのですが、どうすればいいかわかりません。どなたか教えてください。

  • 行列の計算の進め方

    行列P(a,b,c,d)(順に左上,右上,左下,右下の成分です)が P^2-dP=P^(-1)…(1) および ad-bc=1…(2) を満たしている。このときa=-1を示せ。ただしa,b,c,dはいずれも実数である。 という問題なんですが、まず逆行列が嫌なので(1)に両辺Pをかけて逆行列を消し、またハミルトンケーリーで今作った式の次数下げをどんどんやっていきます。そうすると、 {a(a+d)-1}P=(a+1)E という式が出てくると思うのですが、ここで場合分けに入ると、 a(a+d)-1=0 の場合はa=-1と定まるのですが、 a(a+d)-1≠0 の場合に、PはEの実数倍にならないということが言えませんので((2)よりdetP=1)P=kEとしてハミルトンケーリーの式に代入することになると思います。ところ が代入した後に{k^2-(a+d)k+1}E=0となり、kの2次方程式が表れますが、これ以上進めません。 どこか見落としているだけかもしれませんが... 解答では素直に逆行列を求めてから成分を比較して、途中背理法を使うことによってa=-1と示していました。もちろん僕のやり方をするなら後者のほうも調べないといけませんから、このままでは点数になりません。 お聞きしたいことは2点あります。 一つ目は僕が進めなかったところから進めるのか。 二つ目はどういうときに成分計算に入ろうと考えるのか。 特に二つ目は、行列は成分計算が面倒になるからなるべく行列式でもちこみたいと教わっていたので、どうも成分計算に入る決意が出来ません。特に今回のようにもう少しで出来るのでないかと思うようなところまでくるとなおさら「いまさら成分なんか計算してたら時間が無くなってしまう!」と考えてしまいます。それは問題量や経験の差かもしれませんが、何かアドバイスあればよろしくお願いします!