[C言語] 複素数の絶対値を計算する方法

C言語で複素数の絶対値を計算するには、標準ライブラリ <complex.h> を使用します。

このライブラリには、複素数を扱うためのデータ型 double complex や関数 cabs() が用意されています。

複素数の絶対値は、実部 \(a\) と虚部 \(b\) を持つ複素数 \(z = a + bi\) に対して、次の式で計算されます:

\[|z| = \sqrt{a^2 + b^2}\]

cabs()関数はこの計算を自動的に行います。

この記事でわかること
  • 複素数の絶対値を計算する方法
  • cabs()関数の使い方と特徴
  • 手動での絶対値計算手法
  • 複素数の演算に関する応用例
  • 注意点や他の計算方法について

目次から探す

複素数の絶対値を計算する方法

cabs() 関数の使い方

C言語では、複素数の絶対値を計算するために、標準ライブラリのmath.hに含まれるcabs()関数を使用します。

この関数は、複素数の絶対値を簡単に取得できる便利な関数です。

cabs()関数は、複素数を引数に取り、その絶対値を返します。

cabs() 関数の引数と戻り値

cabs()関数の引数と戻り値は以下の通りです。

スクロールできます
引数の型引数名説明
double complexz複素数
戻り値double複素数の絶対値

複素数の絶対値の計算式

複素数の絶対値は、次の式で計算されます。

\[\text{絶対値} = \sqrt{(\text{実部})^2 + (\text{虚部})^2}\]

ここで、実部と虚部は複素数のそれぞれの成分を指します。

cabs()関数は、この計算を内部で行っています。

実際のコード例

以下は、cabs()関数を使用して複素数の絶対値を計算するサンプルコードです。

#include <stdio.h>
#include <math.h>
#include <complex.h> // 複素数を扱うためのヘッダ
int main() {
    double complex z = 3.0 + 4.0 * I; // 複素数の定義
    double absoluteValue; // 絶対値を格納する変数
    // cabs()関数を使って絶対値を計算
    absoluteValue = cabs(z); 
    // 結果を表示
    printf("複素数の絶対値: %f\n", absoluteValue); 
    return 0; 
}

このコードを実行すると、以下のような出力が得られます。

複素数の絶対値: 5.000000

この例では、複素数 \(3 + 4i\) の絶対値を計算し、結果として5が表示されます。

複素数の絶対値を手動で計算する方法

実部と虚部を取得する方法

複素数は、実部と虚部から構成されています。

C言語では、複素数をdouble complex型で定義し、creal()およびcimag()関数を使用してそれぞれの成分を取得できます。

これにより、実部と虚部を個別に扱うことが可能です。

sqrt() 関数を使った計算

複素数の絶対値を手動で計算する際には、実部と虚部を用いて次の式を使用します。

\[\text{絶対値} = \sqrt{(\text{実部})^2 + (\text{虚部})^2}\]

この計算には、math.hライブラリのsqrt()関数を使用します。

sqrt()関数は、引数として与えた数値の平方根を返します。

手動計算のコード例

以下は、複素数の絶対値を手動で計算するサンプルコードです。

#include <stdio.h>
#include <math.h>
#include <complex.h> // 複素数を扱うためのヘッダ
int main() {
    double complex z = 3.0 + 4.0 * I; // 複素数の定義
    double realPart; // 実部を格納する変数
    double imagPart; // 虚部を格納する変数
    double absoluteValue; // 絶対値を格納する変数
    // 実部と虚部を取得
    realPart = creal(z); 
    imagPart = cimag(z); 
    // 手動で絶対値を計算
    absoluteValue = sqrt(realPart * realPart + imagPart * imagPart); 
    // 結果を表示
    printf("複素数の絶対値: %f\n", absoluteValue); 
    return 0; 
}

このコードを実行すると、以下のような出力が得られます。

複素数の絶対値: 5.000000

この例では、複素数 \(3 + 4i\) の実部と虚部を取得し、それを用いて手動で絶対値を計算しています。

結果として5が表示されます。

応用例:複素数の演算

複素数の加算と減算

複素数の加算と減算は、実部と虚部をそれぞれ独立に計算することで行います。

具体的には、次のように計算します。

  • 加算: \((a + bi) + (c + di) = (a + c) + (b + d)i\)
  • 減算: \((a + bi) – (c + di) = (a – c) + (b – d)i\)

以下は、複素数の加算と減算を行うサンプルコードです。

#include <stdio.h>
#include <complex.h> // 複素数を扱うためのヘッダ
int main() {
    double complex z1 = 3.0 + 4.0 * I; // 複素数1
    double complex z2 = 1.0 + 2.0 * I; // 複素数2
    double complex sum; // 和を格納する変数
    double complex difference; // 差を格納する変数
    // 複素数の加算
    sum = z1 + z2; 
    // 複素数の減算
    difference = z1 - z2; 
    // 結果を表示
    printf("加算結果: %.1f + %.1fi\n", creal(sum), cimag(sum)); 
    printf("減算結果: %.1f + %.1fi\n", creal(difference), cimag(difference)); 
    return 0; 
}

このコードを実行すると、以下のような出力が得られます。

加算結果: 4.0 + 6.0i
減算結果: 2.0 + 2.0i

複素数の乗算と除算

複素数の乗算と除算も、実部と虚部を用いて計算します。

具体的には次のように行います。

  • 乗算: \((a + bi) \cdot (c + di) = (ac – bd) + (ad + bc)i\)
  • 除算: \(\frac{(a + bi)}{(c + di)} = \frac{(ac + bd)}{c^2 + d^2} + \frac{(bc – ad)}{c^2 + d^2}i\)

以下は、複素数の乗算と除算を行うサンプルコードです。

#include <stdio.h>
#include <complex.h> // 複素数を扱うためのヘッダ
int main() {
    double complex z1 = 3.0 + 4.0 * I; // 複素数1
    double complex z2 = 1.0 + 2.0 * I; // 複素数2
    double complex product; // 積を格納する変数
    double complex quotient; // 商を格納する変数
    // 複素数の乗算
    product = z1 * z2; 
    // 複素数の除算
    quotient = z1 / z2; 
    // 結果を表示
    printf("乗算結果: %.1f + %.1fi\n", creal(product), cimag(product)); 
    printf("除算結果: %.1f + %.1fi\n", creal(quotient), cimag(quotient)); 
    return 0; 
}

このコードを実行すると、以下のような出力が得られます。

乗算結果: -5.0 + 10.0i
除算結果: 2.2 + 0.4i

複素数の偏角の計算

複素数の偏角は、複素数の実部と虚部を用いて計算されます。

偏角は、次の式で求められます。

\[\theta = \tan^{-1}\left(\frac{\text{虚部}}{\text{実部}}\right)\]

C言語では、atan2()関数を使用して偏角を計算できます。

この関数は、実部と虚部を引数に取り、偏角をラジアンで返します。

以下は、複素数の偏角を計算するサンプルコードです。

#include <stdio.h>
#include <math.h>
#include <complex.h> // 複素数を扱うためのヘッダ
int main() {
    double complex z = 3.0 + 4.0 * I; // 複素数の定義
    double angle; // 偏角を格納する変数
    // 偏角を計算
    angle = atan2(cimag(z), creal(z)); 
    // 結果を表示
    printf("複素数の偏角: %f ラジアン\n", angle); 
    return 0; 
}

このコードを実行すると、以下のような出力が得られます。

複素数の偏角: 0.927295 ラジアン

複素数の絶対値を使った応用

複素数の絶対値は、信号処理や制御理論などの分野で広く応用されています。

例えば、複素数の絶対値を用いて、信号の強度を評価したり、フィルタリング処理を行ったりすることができます。

以下は、複素数の絶対値を使った簡単な応用例です。

#include <stdio.h>
#include <math.h>
#include <complex.h> // 複素数を扱うためのヘッダ
int main() {
    double complex z1 = 3.0 + 4.0 * I; // 複素数1
    double complex z2 = 1.0 + 2.0 * I; // 複素数2
    // 複素数の絶対値を計算
    double absZ1 = cabs(z1); 
    double absZ2 = cabs(z2); 
    // 絶対値を比較
    if (absZ1 > absZ2) {
        printf("z1の方が大きい: %f\n", absZ1); 
    } else {
        printf("z2の方が大きい: %f\n", absZ2); 
    }
    return 0; 
}

このコードを実行すると、以下のような出力が得られます。

z1の方が大きい: 5.000000

このように、複素数の絶対値を用いることで、複素数の強度を比較することができます。

よくある質問

cabs() 関数はどのバージョンのC言語で使えますか?

cabs()関数は、C99標準以降のC言語で使用可能です。

C99では、複素数を扱うための標準ライブラリが追加され、math.hヘッダに含まれるcabs()関数が利用できるようになりました。

C90以前のバージョンでは、複素数のサポートがなかったため、使用できません。

複素数の絶対値を計算する際に注意すべき点は?

複素数の絶対値を計算する際には、以下の点に注意が必要です。

  • データ型: 複素数を扱う際は、double complex型を使用することが推奨されます。

これにより、精度の高い計算が可能になります。

  • 引数の範囲: cabs()関数に渡す複素数が正しく定義されていることを確認してください。

未初期化の変数や不正な値を渡すと、予期しない結果が得られることがあります。

  • ライブラリのインクルード: cabs()関数を使用する場合は、必ず#include <math.h>#include <complex.h>をインクルードする必要があります。

複素数の絶対値を計算する他の方法はありますか?

複素数の絶対値を計算する方法はいくつかあります。

主な方法は以下の通りです。

  • 手動計算: 実部と虚部を取得し、平方根を用いて手動で計算する方法。

具体的には、\(\sqrt{(\text{実部})^2 + (\text{虚部})^2}\)を使用します。

  • hypot() 関数: math.hライブラリに含まれるhypot()関数を使用することで、2つの引数(実部と虚部)から直接絶対値を計算できます。

hypot(realPart, imagPart)とすることで、同様の結果が得られます。

まとめ

この記事では、C言語における複素数の絶対値を計算する方法について詳しく解説しました。

具体的には、cabs()関数を使用した簡単な計算方法から、手動での計算手順、さらには複素数の演算や応用例に至るまで、幅広く取り上げました。

複素数の絶対値を計算する技術は、信号処理や制御理論などの分野で非常に重要であり、実際のプログラミングに役立つスキルです。

ぜひ、実際にコードを試してみて、複素数の演算に慣れていってください。

  • URLをコピーしました!
目次から探す