はいー 今回は構造体を使って複素数の計算をしていきます。
複素数はわかりますよね、実数と虚数両方を含めた数ですね。
構造体自体を一つの複素数として計算する関数を作っていきます。
ちなみにこれは以前書いた分数を構造体で表して計算するプログラムと本質は一緒なので興味があればそちらもどうぞ
またこの記事の一番下に全体のコードを貼っておくので参考にどうぞ。
コードの実装
早速やっていきましょう
まず構造体の定義、次に関数を作っていきます
構造体の定義
必要なのは実部と虚部だけですね。
サクッと作りましょう。
typedef struct complex{
double r;
double i;
}complex;
実部がr(real)で虚部がi(image)です。
扱いやすいようにtypedefで構造体名をstruct complexからcomplexに変更しています。
和と差の関数
複素数の構造体を仮引数で二つ受け取って計算して、返り値は結果の複素数にします。
まあ実部虚部でそれぞれ計算するだけです。
差の関数に関しては、和の関数の+を-にしただけ。
complex add(complex x, complex y){
complex z;
z.r = x.r + y.r;
z.i = x.i + y.i;
return z;
}
complex sub(complex x, complex y){
complex z;
z.r = x.r - y.r;
z.i = x.i - y.i;
return z;
}
積の関数
これが便利ですね。作っていきましょう。
といっても虚数iが2乗されると-1になるってだけですね。
仮引数、返り値も和と一緒です
complex multi(complex x, complex y){
complex z;
z.r = x.r * y.r - x.i * y.i;
z.i = x.r * y.i + x.i * y.r;
return z;
}
はい完成です。簡単ですね。
商の関数
これは少しややこしいですね。
といっても計算がややこしいだけでコードは易しいので大丈夫です。
割り算に関しては分数で考えて、有利化を行い実数となった分母で分子を割る作戦です。
それではコードです。
complex div(complex x, complex y){//x/y
complex z, y_;
y_.r = y.r;
y_.i = y.i;
double deno = y.r*y.r + y.i*y.i;
z = multi(x,y_);
z.r /= deno;
z.i /= deno;
return z;
}
denoは有利化を行なっている分子ですね。
そんでy_にはyの共役の複素数を代入して、z = multi(x,y_)で有利化した後の分子を計算します。
最後にzをdenoで割ってreturnすればおkですね。
全体のコード
#include <stdio.h>
typedef struct complex{
double r;
double i;
}complex;
complex add(complex x, complex y){
complex z;
z.r = x.r + y.r;
z.i = x.i + y.i;
return z;
}
complex sub(complex x, complex y){
complex z;
z.r = x.r - y.r;
z.i = x.i - y.i;
return z;
}
complex multi(complex x, complex y){
complex z;
z.r = x.r * y.r - x.i * y.i;
z.i = x.r * y.i + x.i * y.r;
return z;
}
complex div(complex x, complex y){//x/y
complex z, y_;
y_.r = y.r;
y_.i = -y.i;
double deno = y.r*y.r + y.i*y.i;
z = multi(x,y_);
z.r /= deno;
z.i /= deno;
return z;
}
int main(int argc, const char * argv[]) {
complex a,b;
a.r=1; a.i=3;
b.r=2; b.i=6;
complex c;
c = add(a,b);
printf("a = %f + %fi\n",a.r,a.i);
printf("b = %f + %fi\n",b.r,b.i);
printf("a + b = %f+%fi\n",add(a,b).r,add(a,b).i);
printf("a - b = %f+%fi\n",sub(a,b).r,sub(a,b).i);
printf("a * b = %f+%fi\n",multi(a,b).r,multi(a,b).i);
printf("a / b = %f+%fi\n",div(a,b).r,div(a,b).i);
return 0;
}
計算の関数は返り値が複素数の構造体なので
add(a,b).r や add(a,b).i をそのままprintfに入れても大丈夫です。
てことで完成。
ではまた
コメント
全体のコードに商が入ってないような
ご指摘ありがとうございます!修正しておきました!
div() は
y_.i = – y.i;
ではないですか?
本当ですね!修正しておきました!
ご指摘ありがとうございます。