pythonで複素数を計算しよう

pythonで虚数を扱うpythonで遊ぼう

複素数を扱う

前回、√(ー1)みたいな数字は、プログラムでは困るので・・・、という話をしましたが、このような数も実は扱うことができます。

この、√(ー1×実数)のような形の数は、虚数(複素数)といいます。虚数というのは、例えば、

i=√(-1)

と置くと、

i2=-1  (2乗するとルートはとれます)

となります。2乗してマイナスになる数は存在しないので、このような i のことを虚数といいます。一般的に、

3+5i (iは虚数)

の形の数を複素数といいます。

複素数の計算例

4+5i と9+13i を足すといくらのなるでしょうか。実数部分同士、虚数部分同士で足し算します。

(4+9)+(5i+13i)=13+18i

になります。プログラムで確認しましょう。

a=complex(4,5)
b=complex(9,13)
print(str(a+b))

【プログラムを見てみよう】

複素数は、complex(実数部分の値、虚数部分の値)と書きます。a,bにそれぞれ複素数を入れて、printで打ち出します。結果は、

(13+18j)

と出ました。プログラムの出力は、虚数が j で表現されています。

掛け算を見てみます。

(4+5i) ×(5+13i)=4×9+4×13i+5i×9+5i×13i

=36+52i+45iー65

=ー29+97i

になります。計算中は i2=-1 であることに注意します。プログラムで確認してみましょう。

a=complex(4,5)
b=complex(9,13)
print(str(a*b))

結果は

(-29+97j)

となります。割り算も見ておきましょう。

(9+13i)/(4+5i) の分子、分母に4-5iをかけます。

分子=(9+13i)×(4-5i)=101+7i

分母=(4+5i)×(4-5i)=16+25=41

分子/分母=(101+7i)/41 =2.4+0.17i

ぐらいになります。プログラムで確認しておきましょう。

a=complex(4,5)
b=complex(9,13)
#途中計算確認
print(str(a*a.conjugate()))
print(str(b*a.conjugate()))
#確認以上
print(str(b/a))

【プログラムを確認しよう】

分子分母に(4-5i) をかける、という計算をしました。これは、計算前の分母の値(4+5i)の虚数部の符号がプラスマイナスが反転したものになっています。このとき、(4+5i)の複素共役は(4-5i)である、

もしくは(4-5i)の複素共役は(4+5i)である、といいます。

プログラムではa=(4+5i) としたときに、aの複素共役はa.conjugate()と表すことができます。なので、

a*a.conjugate()

で分母の値を見ることができます。(b*a.conjugate()は分子の値です。)

プログラムでは、b/a と書くことで、一発で求めることができます。

(41+0j)
(101+7j)
(2.4634146341463414+0.17073170731707324j)

となりました。

プログラムでは計算できない問題

実は人間でもあまり答えられない問題があります。

  • 0/0 はいくつですか?
  • 2/0 はいくつですか?

私が20代で定職がなかったころ、塾講師の募集があり面接に行ってみたことがあります。そこで、試験を受けたのですが、その後、試験の受講者を相手に5分程度模擬授業をする、というテストがありました。(塾の関係者は後ろで見ていました)そのときに扱った問題の1つがこれです。

そのときに、私の目の前に座っていた方数名(受験者なので、おそらく皆さん大卒)に聞いてみたのですが、一人も答えられなかったです。意外と盲点の問題かもしれません。

プログラムでこの問題をさせると、エラーになります。

この問題は、実は結構やらかしますし、バグの原因にもなります。またプログラムのコードが長いと、エラーの記述場所の発見が遅れる、という人泣かせなこともあります。

【0/0はいくら?】

分数の性質として、次のようなものがあります。

例えば、2/4=1/2 ですが、4×1/2=2 になっています。なので

0/0=a

と置くと、

0×a=0

が成立する a が求める答えになります。ところで、0には何を掛けても0ですよね。だから、このaはどんな数字でもいい、ということで、あなたが高校生以上ならC(constant)と書くのが答えになります。

【2/0はいくら?】

同じ要領で、

2/0=a

と置くと、

0×a=2

になります。ところで、0には何を掛けても0ですので、0に何かを掛けて2になる数は存在しません。なので、このようなaは存在しません。

まとめると、

  • 0/0=C (数字ならなんでもいい)
  • 2/0 の値は存在しない

となります。

プログラムでやってみましょう。

a=complex(4,5)
print(str(a/0))

結果は、

print(str(a/0))
 ZeroDivisionError: complex division by zero

”complex division by zero” は 複素数を0で割ってるよ、とエラーの内容を教えてくれています。プログラムではこの0で割る、という計算はしてはいけない、ということになります。

おすすめ書籍

pythonに入門したい方向け

Pythonの絵本 Pythonを楽しく学ぶ9つの扉【電子書籍】[ 株式会社アンク ]

他の言語もかじりました系の方向け

基礎からわかる Python【電子書籍】[ 坂本俊之 ]

コメント

タイトルとURLをコピーしました