Maxima/複素数のソースを表示
←
Maxima/複素数
ナビゲーションに移動
検索に移動
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループに属する利用者のみが実行できます:
登録利用者
。
このページのソースの閲覧やコピーができます。
== 複素数 == 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)は、偏角を求めるための拡張された逆接弦関数である。詳しくは[[../三角関数・双曲線関数]]を参照しよう。 === 形式変換 === ==== 直交形式化(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を囲む単位円周回上を積分する例である。確かに留数が出てくる。 ===演習問題=== <math>z_{1}=5+6i, z_{2}=3+2i</math>と置く。この時、曲線<math>|z-\alpha|=r</math>が<math>z_{1}, z_{2}</math>および<math>i</math>を通るように複素数<math>\alpha</math>と実数<math>r</math>を定めよ。 :[[Maxima/演習問題解答#複素数|解答]] <noinclude> ===関連項目=== ====Wikipedia==== * [[w:複素数|複素数]] * [[w:複素解析|複素解析]] ====外部リンク==== * [http://maxima.sourceforge.net/docs/manual/en/maxima_6.html#SEC23#SEC50 Maxima Manual: 6.3 Complex] (英文の公式マニュアル) * [http://www.bekkoame.ne.jp/~ponpoko/Math/maxima/maxima_6.html#SEC17 日本語に翻訳中のマニュアル:6.3 複素数] </noinclude> [[Category:Maxima|ふくそすう]]
Maxima/複素数
に戻る。
ナビゲーション メニュー
個人用ツール
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
ソースを閲覧
履歴表示
その他
検索
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
特別ページ
ツール
リンク元
関連ページの更新状況
ページ情報