C言語で学ぶ大学の数学 「複素数の四則演算 その1『そのまま計算』」

この記事ではC言語で複素数の計算をする方法を、素朴なやり方でやる方法について説明します。



1.C言語での複素数の扱い


複素数とは、虚数単位 i と二つの実数 x, y により


x + iy


と表される数です。これをC言語で扱うには、実部 x と虚部 y それぞれを格納する変数が必要です。そのためには配列変数を使います。

たとえば 1 + 2i を格納するには


float a[2] = {1, 2};


などとします。



2.加法と減法


それでは複素数の計算方法について説明します。

四則演算いずれについても、ユーザ関数を使えば便利です。


まずは加法について、複素数 a, b に対し c = a + b を計算するユーザ関数は次のように定義できます。


void add_cpx(float a[2], float b[2], float c[2]){

 c[0] = a[0] + b[0];

 c[1] = a[1] + b[1];

}


add は addition の意味です。ポイントは返り値を void とすることで c[0], c[1] 両方の値を一度に変更しているところです。

減法を計算するのも同様です。


void sub_cpx(float a[2], float b[2], float c[2]){

 c[0] = a[0] - b[0];

 c[1] = a[1] - b[1];

}


sub は subtraction の意味です。



3.乗法と除法


まずは乗法から説明します。

乗法は、x + iy と u + iv の積が


(x*u - y*v) + i(x*v + y*u)


になるので、これをそのままユーザ関数で計算するというものです。

a[]とb[]の積をc[]に代入するには次のようにします。


void multi_cpx(float a[2], float b[2], float c[2]){

 c[0] = a[0]*b[0] - a[1]*b[1];

 c[1] = a[0]*b[1] + a[1]*b[0];

}


次に除法です。

除法を計算する際は、割る数 u + iv の逆数を求めてから、逆数を x + iy に掛けることで計算します。

そのために逆数を求めるユーザ関数を定義します。u + iv ≠ 0 の逆数は


(u - iv)/(u^2 + v^2)


なので


void inverse_cpx(float a[2]){

 float b[2];

 b[0] = a[0]/(a[0]*a[0] + a[1]*a[1]);

 b[1] = -a[1]/(a[0]*a[0] + a[1]*a[1]);

 a[0] = b[0];

 a[1] = b[1]; 

}


とすると、a[]にa[]の逆数を代入することができます。一度b[]という変数に計算結果を代入してからa[]に移しています。

これを使って、a[] を b[]で割った値を c[]に代入するには


void div_cpx(float a[2], float b[2], float c[2]){

 float d[2];

 d[0] = b[0];

 d[1] = b[1];

 inverse_cpx(d);

 multi_cpx(a, d, c);

}


とします。上のやり方はb[]を書き換えないためにd[]という変数を用意して、そこにb[]の値をコピーして逆数を求めています。

なお、b[]が0の場合には計算結果がおかしなことになるので、使う時は注意します。



4.計算例


では最後に、簡単な四則演算を上記の方法を使って計算してみます。

 a = 2.0 + 3.0i

 b = -2.0 -1,0i

 c = 1.0 + 1.0i

 d = 3.0 + 5.0i

として

 e = (a + b)/c - d

を計算します。正しい答えは -2.0 - 4.0i です。


#include<stdio.h>


void add_cpx(float a[2], float b[2], float c[2]){

(省略)

}


void sub_cpx(float a[2], float b[2], float c[2]){

(省略)

}


void multi_cpx(float a[2], float b[2], float c[2]){

(省略)

}


void inverse_cpx(float a[2]){

(省略)

}


void div_cpx(float a[2], float b[2], float c[2]){

(省略)

}


int main(){

 float a[2] = {2.0, 3.0};

 float b[2] = {-2.0, -1.0};

 float c[2] = {1.0, 1.0};

 float d[2] = {3.0, 5.0};

 float e[2], f1[2], f2[2];

 add_cpx(a, b, f1);

 div_cpx(f1, c, f2);

 sub_cpx(f2, d, e);


 printf("answer is %f + %f*i\n", e[0], e[1]);


 return 0;

}


返り値が void のユーザ関数に同じ変数を入力するとうまく計算されないので、f1[]とf2[]という変数を用意しf1 に a + b、f2 に f1/c の計算結果を代入し、最後にe[]に求めたい数値を代入しています。



  • Xで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る