• 締切済み

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をいっぺんに定義する方法があればお願いします。

みんなの回答

回答No.4

ComplexExpand[expr]とするとexprの中の変数は全て実数としてあるかわれます。 m = {{a + b I, c + d I}, {e + f I, g + h I}} In[7]:=ComplexExpand[Conjugate[m]] Out[7]:={{a - I b, c - I d}, {e - I f, g - I h}} 以下のURLに詳細が記載されていますので、参考にしてください。 http://reference.wolfram.com/mathematica/ref/ComplexExpand.html

  • gruska
  • ベストアンサー率50% (3/6)
回答No.3

a_ijとb_ijを未定義のままConjugate[A]を代数的に表示したいということでしょうか? でしたら A = Table[a[i, j] + I*b[i, j], {i, 2}, {j, 2}] のようにa,bを未定義の関数のように扱ってやれば Simplify[Conjugate[A], Assumptions -> {a[_, _], b[_, _]} ∈ Reals] のように入力でき {{a[1, 1] - i b[1, 1], a[1, 2] - i b[1, 2]}, {a[2, 1] - i b[2, 1], a[2, 2] - i b[2, 2]}} が得られます。

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

#1の補足に対する回答 私が使用しているMathematicaは最新のVersion 5.2のWindows版ですが、質問者さんのはどのVersionですか? >A = {{a11 + i*b11, a12 + i*b12}, {a21 + i*b21, a22 + i*b22}} の出力は {{a11 + b11 i, a12 + b12 i}, {a21 + b21 i, a22 + b22 i}} となって、iはただの変数として認識されます。 A = {{a11 + I*b11, a12 + I*b12}, {a21 + I*b21, a22 + I*b22}} 虚数単位の「i=√(-1)」はシステム変数ですので大文字の「I」で入力しないと正しく認識されませんね。こうすると正しく入力されます。「I」の出力表示は小文字のiのベクトル表示のような記号で表示されます。 (Mathematicaでは組込み関数名やシステム定数の先頭文字を大文字で表しますので、通常の変数名や行列名の先頭文字は小文字を使った方がべターですね。) >Conjugate[A]... を入力すると私のversionでの出力は以下のようになります。 {{Conjugate[a11 + I b11], Conjugate[a12 + I b12]}, { Conjugate[a21 + I b21], Conjugate[a22 + I b22]}} ここで、a'sやb'sに具体的な数値を与えると以下のように正しくConjugateが計算されて出力されます。 a11 = 1 b11 = 2 a12 = 2 b12 = 3 a21 = 3 b21 = 4 a22 = 4 b22 = 5 Conjugate[A] この出力は以下の通り。 {{1 - 2 I, 2 - 3 I}, {3 - 4 I, 4 - 5 I}} 「Conjugate」という表示は消えていますね。 ここで、{a11,a12,a21,a22,b11,b12,b21,b22}⊂Realsは定義しなくてもDefaultで定義されるようです。 a's,b'sを文字のまま扱った場合 >Simplify[A,Assumptions-> >{a11,a12,a21,a22,b11,b12,b21,b22}∈Reals] >とすれば > >{{a11-i*b11,a12-i*b12},{a21-i*b21,a22-*b22}} {{a11+I b11,a12+ I b12},{a21+ I b21,a22+I b22}} と出力されます。これは特にSimplify関数を使わなくても A と入力するだけで同じ結果がOutされます。(Version5.2) A = {{a11 + I*b11, a12 + I*b12}, {a21 + I*b21, a22 + I*b22}} B=Conjugate[A] Simplify[B, Assumptions -> {a11, a12, a21, a22, b11, b12, b21, b22} ∈ Reals] と入力すると矢張り {{Conjugate[a11 + I b11], Conjugate[a12 + I b12]}, {Conjugate[a21 + I b21], Conjugate[a22 + I b22]}} となります。 確認してみてください。 ということは以下の >Assumptions->{????} の????の入力をしても意味がないですね。 というより定義しなくてもDefaultで定義されてしまうようです。つまり、入力の必要がないということになりますね。 いずれにしても a'sやb'sに具体的な定数を与えれば<Conjugate>という表現の入らないOutが得られるということです。 文字変数を行列要素に使っている限りConjugateの表現は、現在の最新Version5.2でも消すことはできないようです。

vhb1953
質問者

お礼

ありがとうございました。

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

>a_ij、b_ijをいっぺんに定義する方法があればお願いします。 たとえば、3行3列の複素行列を入力するには以下のように書きます。大文字の「I」は虚数単位です。 a = {{1 + I 5, 2 - I, 3 + I 4}, {I 2, 2 + I, 5 - I 3}, {1 + I, 2 - I 2, 1 - I 2}} 全体を中括弧{}で囲み、その中に、最初の中括弧{}の中に一行目の複素行列要素をコンマ「,」で区切って並べて行きます。2行目と行区切り文字も「,」を使用します。その後二行目の中括弧{}の中に二行目の行列複素行列要素をコンマで「,」で区切って並べます。この繰り返しで、行列の最後の行を中括弧の中にコンマ「,」区切りで書きます。 複素行列要素は「<実部>±I <虚部>」の形式で与えます。 >Conjugate[A]などを計算するためにはどうしたらよいでしょうか? b=Conjugate[a] と入力するだけです。 出力は行列aの各行列要素が複素共役数に変換され、bに格納され、その内容がOutに表示されます。

vhb1953
質問者

補足

早速の回答ありがとうございます。 質問の内容ですが、 複素行列 A={{a11+i*b11,a12+i*b12},{a21+i*b21,a22+i*b22}} についてたとえば、Conjugate[A]を計算すると、 Conjugate[A]= {  {Conjugate[a11]-i*Conjugate[b11],   Conjugate[a12]-i*Conjugate[b12]},  {Conjugate[a21]-i*Conjugate[b21],   Conjugate[a22]-i*Conjugate[b22]}, } と出力されてしまいますが、 ここで{a11,a12,a21,a22,b11,b12,b21,b22}⊂R と定義するなどして Conjugate[A] ->{{a11-i*b11,a12-i*b12},{a21-i*b21,a22-*b22}} と出力されるようにしたいのです。 このとき、 Simplify[A,Assumptions-> {a11,a12,a21,a22,b11,b12,b21,b22}∈Reals] とすれば {{a11-i*b11,a12-i*b12},{a21-i*b21,a22-*b22}} が得られるようですが、この方法では行列の大きさを大きくすると Assumptions->{????} の????の部分がどうしても長くなってしまいます。 これをうまく行う方法はないものでしょうか? よろしくお願いします。

関連するQ&A