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[]に求めたい数値を代入しています。
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます