複素数 編集

Maximaでは、複素数を扱うことができる。

複素数宣言 編集

Maximaの文字変数はすべて実数とみなされている。特に宣言を変えない限りは、虚数単位%iを含むもの、負の数の平方根を含むものが複素数として扱われる。

(%i1) sqrt(-5);
(%o1) 				  sqrt(5) %i
(%i2) a+%i*b+c+%i*d;
(%o2) 			      %i d + c + %i b + a

のように、多項式形式で複素数を表している。

宣言(declare) 編集

declare(文字, 属性,文字, 属性, ...)を用いると、その文字単独に、複素数、純虚数、実数といった属性をつけることができる。詳しくはMaxima/変数と定数を参照。

(%i1) declare(z, complex, i, imaginary, r , real);
(%o1) 				     done

変数の属性が違うといくらかの関数で挙動が変わってくる。ただ、すべての関数が正しく対応しているわけではないので注意が必要である。以下の節に出てくるz,i,rは上記の宣言を受けたものとして、例を紹介する。(ちなみにこれらを試したバージョンは5.10.0と5.11.0)

複素数特有の関数 編集

実部・虚部に分ける(realpart,imagpart) 編集

realpart(式)は複素数の実部拾い出す。またimagpart(式)は式の虚部を実数としてとりだす。

(%i2) c:a+b*%i;
(%o2) 				   %i b + a
(%i3) realpart(c);
(%o3) 				       a
(%i4) realpart(z);
(%o4) 				  realpart(z)
(%i5) realpart(r);
(%o5) 				       r
(%i6) realpart(i);
(%o6) 				  realpart(i)
(%i7) imagpart(c);
(%o7) 				       b
(%i8) imagpart(z);
(%o8) 				  imagpart(z)
(%i9) imagpart(r);
(%o9) 				       0
(%i10) imagpart(i);
(%o10)				  imagpart(i)
(%i11) realpart(c+z+i);
(%o11)			 realpart(z) + realpart(i) + a
(%i12) imagpart(c+z+i);
(%o12)			 imagpart(z) + imagpart(i) + b

この例を見てもわかるとおり、現在はあまりimaginary宣言された変数の対応が悪く、複素数と同じ扱いである。

複素共役(conjugate) 編集

conjugate(式)は式の複素共役を求める。

(%i2) c:a+b*%i;
(%o2) 				   %i b + a
(%i3) conjugate(c);
(%o3) 				   a - %i b
(%i4) conjugate(z);
(%o4) 				 conjugate(z)
(%i5) conjugate(i);
(%o5) 				      - i
(%i6) conjugate(c+z+i);
(%o6) 			  conjugate(z) - i - %i b + a
(%i7) conjugate(z)+z;
(%o7)                         conjugate(z) + z
(%i8) conjugate(z)*z;
(%o8)                          z conjugate(z)

imaginary宣言された変数の対応はconjugate()においては完璧であるが、共役との和・積をrealpart(),imagpart(),abs()には残念ながら変えてくれない。この後にrectform(%)としても、かなり奇妙な式が出てくる。

絶対値(abs) 編集

abs(式)は複素数の絶対値を求める。

(%i3) abs(c);
				       2    2
(%o3) 				 sqrt(b  + a )
(%i4) abs(z);
(%o4) 				    abs(z)
(%i5) abs(i);
(%o5) 				    abs(i)
(%i6) abs(c+z+i);
                                          2                                  2
(%o6) sqrt((realpart(z) + realpart(i) + a)  + (imagpart(z) + imagpart(i) + b) )
					    

実際は多項式に対して、abs(z)=sqrt(realpart(z)^2+imagpart(z)^2)を実行しているだけのようだ。

偏角(carg) 編集

carg(式)は複素数式を極形式にしたときの偏角を返す。

(%i1) y:a+b*%i;
(%o1)                             %i b + a

(%i2) carg(y);
(%o2)                            atan2(b, a)

(%i3) carg(r);
Is  r  positive, negative, or zero?

positive;
(%o3)                                 0

(%i4) carg(r);
Is  r  positive, negative, or zero?

negative;
(%o4)                                %pi

(%i5) carg(b*%i);
Is  b  positive, negative, or zero?

positive;
                                     %pi
(%o5)                                ---
                                      2

(%i6) carg(3*exp(%i*2));
(%o6)                                 2

この関数は(実数)と%i*(実数)にはうまく働いているが、

(%i7) carg(i);
Is  i  positive, negative, or zero?

negative;
(%o7)                                %pi

(%i8) carg(z);
Is  z  positive, negative, or zero?

positive;
(%o8)                                 0

のように、複素数宣言された変数にまったく未対応でとんでもない答えを返す。ちなみにこれらの仕様は公式マニュアルにもバグであると書かれている。atan2(b,a)は、偏角を求めるための拡張された逆接弦関数である。詳しくはMaxima/三角関数・双曲線関数を参照しよう。

形式変換 編集

直交形式化(rectform) 編集

(実数)+(純虚数)の形にまとめるには、rectform(式)を使う。 

(%i1) y:a+%i*b+c+%i*d;
(%o1)                        %i d + c + %i b + a

(%i2) rectform(y);
(%o2)                        %i (d + b) + c + a

(%i3) rectform(y+i+z);
(%o3) realpart(z) + %i (imagpart(z) + imagpart(i) + d + b) + realpart(i) + c
                                                                            + a

(%i4) rectform(y*z);
(%o4) %i ((d + b) realpart(z) + (c + a) imagpart(z)) + (c + a) realpart(z)
                                                          - (d + b) imagpart(z)

極形式化(polarform) 編集

(絶対値)*%e^(%i*(偏角))の極形式にまとめるには、polarform(式)を使う。多項式をひとつの項であらわそうとするので、よく考えて使わないと式がむしろ複雑になる。

(%i1) y:a+b*%i;
(%o1)                             %i b + a

(%i2) polarform(y);
                             2    2    %i atan2(b, a)
(%o2)                  sqrt(b  + a ) %e

(%i3) polarform(z);
Is  z  positive, negative, or zero?

positive;
(%o3)                                 z

(%i4) polarform(y*z);
                                          2                                  2
(%o4) sqrt((b realpart(z) + a imagpart(z))  + (a realpart(z) - b imagpart(z)) )
      %i atan2(b realpart(z) + a imagpart(z), a realpart(z) - b imagpart(z))
    %e

この極形式化は、結局直交形式で計算された後に実行される。(%o4)など、sqrt(a^2+b^2)*abs(z)*%e^(%i*(atan2(b,a)+carg(z))のほうが良い気がするのだが、そもそもcargの挙動がおかしいのでその期待もできない。そのため(%i3)など奇妙なことに、複素数zが正か負か?などと聞いてきたうえ、ぜんぜん極形式になってないないのは、おそらくcargの複素数宣言に対する対応のおかしさにあるのだろう。

行列形式化 編集

今のところ、そのような行列を作ってくれる手段はないようだ。

コーシー積分 編集

正則な複素関数の特異点を回る経路を積分すると2*%i*%pi*(留数)になり、含まない閉じた経路の積分は0である。

(%i1) f(z):=A/(z-%i);
                                          A
(%o1)                           f(z) := ------
                                        z - %i
(%i2) integrate(f(%i+exp(%i*theta))*%i*exp(%i*theta),theta,0,2*%pi);
(%o2)                             2 %i %pi A
(%i3) integrate(f(-%i+exp(%i*theta))*%i*exp(%i*theta),theta,0,2*%pi);
(%o3)                                  0
(%i4) integrate(f(1+exp(%i*theta))*%i*exp(%i*theta),theta,0,2*%pi);
(%o4)                                  0
(%i5) integrate(f(-1+exp(%i*theta))*%i*exp(%i*theta),theta,0,2*%pi);
(%o5)                                  0

これはz=%iに留数Aを持つ関数f(x)を、%i, -%i, 1, -1を囲む単位円周回上を積分する例である。確かに留数が出てくる。

演習問題 編集

 と置く。この時、曲線  および を通るように複素数 と実数 を定めよ。

解答


関連項目 編集

Wikipedia 編集

外部リンク 編集