[C言語] 複素数(complex.h)をprintf関数で出力する方法
C言語で複素数を扱うには、標準ライブラリのcomplex.h
を使用します。
複素数はdouble complex型
で定義され、実部と虚部にアクセスするためにはcreal()
とcimag()関数
を使います。
printf関数
で複素数を出力する際には、これらの関数を用いて実部と虚部を個別に出力します。
例えば、z
が複素数の場合、printf("Real: %f, Imaginary: %f\n", creal(z), cimag(z));
のように記述します。
- C言語における複素数の基本
- printf関数での出力方法
- 複素数の演算とその実例
- フーリエ変換などの応用例
- 複素数を使ったプログラムの実装方法
printf関数で複素数を出力する方法
C言語では、複素数を扱うためにcomplex.hヘッダーファイル
を使用します。
printf関数
を使って複素数を出力する方法について詳しく解説します。
printf関数の基本的な使い方
printf関数
は、フォーマット指定子を使って様々なデータ型を出力するための関数です。
基本的な構文は以下の通りです。
#include <stdio.h>
int main() {
int number = 10;
printf("数値: %d\n", number); // 整数を出力
return 0;
}
数値: 10
実部と虚部を個別に出力する方法
複素数は実部と虚部から構成されます。
これらを個別に出力するには、creal
とcimag関数
を使用します。
#include <stdio.h>
#include <complex.h>
int main() {
double complex z = 3.0 + 4.0 * I; // 複素数の定義
printf("実部: %f\n", creal(z)); // 実部を出力
printf("虚部: %f\n", cimag(z)); // 虚部を出力
return 0;
}
実部: 3.000000
虚部: 4.000000
複素数をフォーマットして出力する方法
複素数を特定のフォーマットで出力するには、printf関数
のフォーマット指定子を活用します。
以下の例では、複素数を a + bi
の形式で出力します。
#include <stdio.h>
#include <complex.h>
int main() {
double complex z = 3.0 + 4.0 * I; // 複素数の定義
printf("複素数: %.1f + %.1fi\n", creal(z), cimag(z)); // フォーマットして出力
return 0;
}
複素数: 3.0 + 4.0i
複素数の出力例:実部と虚部の表示
実部と虚部を個別に表示する例を示します。
以下のコードでは、複素数の実部と虚部をそれぞれ出力します。
#include <stdio.h>
#include <complex.h>
int main() {
double complex z = 5.0 + 2.0 * I; // 複素数の定義
printf("実部: %.2f\n", creal(z)); // 実部を出力
printf("虚部: %.2f\n", cimag(z)); // 虚部を出力
return 0;
}
実部: 5.00
虚部: 2.00
複素数の出力例:極形式での表示
複素数を極形式で表示するには、絶対値と偏角を計算し、それを出力します。
以下の例では、複素数の絶対値と偏角を表示します。
#include <stdio.h>
#include <complex.h>
#include <math.h>
int main() {
double complex z = 1.0 + 1.0 * I; // 複素数の定義
double magnitude = cabs(z); // 絶対値
double angle = carg(z); // 偏角
printf("極形式: |z| = %.2f, arg(z) = %.2f\n", magnitude, angle); // 極形式で出力
return 0;
}
極形式: |z| = 1.41, arg(z) = 0.79
複素数の演算と出力の実例
C言語では、複素数の演算を簡単に行うことができます。
complex.h
を使用することで、加算、減算、乗算、除算を行い、その結果を出力する方法を解説します。
複素数の加算と出力
複素数の加算は、実部と虚部をそれぞれ加算することで行います。
以下の例では、2つの複素数を加算し、その結果を出力します。
#include <stdio.h>
#include <complex.h>
int main() {
double complex z1 = 2.0 + 3.0 * I; // 複素数1の定義
double complex z2 = 1.0 + 4.0 * I; // 複素数2の定義
double complex result = z1 + z2; // 複素数の加算
printf("加算結果: %.1f + %.1fi\n", creal(result), cimag(result)); // 結果を出力
return 0;
}
加算結果: 3.0 + 7.0i
複素数の減算と出力
複素数の減算も、実部と虚部をそれぞれ減算することで行います。
以下の例では、2つの複素数を減算し、その結果を出力します。
#include <stdio.h>
#include <complex.h>
int main() {
double complex z1 = 5.0 + 6.0 * I; // 複素数1の定義
double complex z2 = 2.0 + 3.0 * I; // 複素数2の定義
double complex result = z1 - z2; // 複素数の減算
printf("減算結果: %.1f + %.1fi\n", creal(result), cimag(result)); // 結果を出力
return 0;
}
減算結果: 3.0 + 3.0i
複素数の乗算と出力
複素数の乗算は、以下の公式を用いて行います。
もし \( z_1 = a + bi \) と \( z_2 = c + di \) であれば、乗算の結果は次のようになります。
\[z_1 \cdot z_2 = (ac – bd) + (ad + bc)i\]
以下の例では、2つの複素数を乗算し、その結果を出力します。
#include <stdio.h>
#include <complex.h>
int main() {
double complex z1 = 1.0 + 2.0 * I; // 複素数1の定義
double complex z2 = 3.0 + 4.0 * I; // 複素数2の定義
double complex result = z1 * z2; // 複素数の乗算
printf("乗算結果: %.1f + %.1fi\n", creal(result), cimag(result)); // 結果を出力
return 0;
}
乗算結果: -5.0 + 10.0i
複素数の除算と出力
複素数の除算は、以下の公式を用いて行います。
もし \( z_1 = a + bi \) と \( z_2 = c + di \) であれば、除算の結果は次のようになります。
\[\frac{z_1}{z_2} = \frac{(ac + bd) + (bc – ad)i}{c^2 + d^2}\]
以下の例では、2つの複素数を除算し、その結果を出力します。
#include <stdio.h>
#include <complex.h>
int main() {
double complex z1 = 4.0 + 2.0 * I; // 複素数1の定義
double complex z2 = 1.0 + 1.0 * I; // 複素数2の定義
double complex result = z1 / z2; // 複素数の除算
printf("除算結果: %.1f + %.1fi\n", creal(result), cimag(result)); // 結果を出力
return 0;
}
除算結果: 3.0 + 1.0i
応用例:複素数を使ったプログラム
複素数は、信号処理や物理シミュレーションなど、さまざまな分野で広く利用されています。
ここでは、フーリエ変換、電気回路シミュレーション、物理シミュレーションにおける複素数の利用例を紹介します。
フーリエ変換での複素数の利用
フーリエ変換は、信号を周波数成分に分解する手法で、複素数を用いて表現されます。
信号の周波数成分を計算する際、複素指数関数が使用されます。
以下は、簡単な離散フーリエ変換(DFT)の実装例です。
#include <stdio.h>
#include <complex.h>
#include <math.h>
#define N 4 // 信号のサンプル数
int main() {
double complex x[N] = {1.0 + 0.0 * I, 0.0 + 1.0 * I, 1.0 + 0.0 * I, 0.0 + 1.0 * I}; // 入力信号
double complex X[N]; // 出力信号
for (int k = 0; k < N; k++) {
X[k] = 0.0 + 0.0 * I; // 初期化
for (int n = 0; n < N; n++) {
X[k] += x[n] * cexp(-2.0 * I * M_PI * k * n / N); // DFTの計算
}
}
// 結果の出力
for (int k = 0; k < N; k++) {
printf("X[%d] = %.2f + %.2fi\n", k, creal(X[k]), cimag(X[k]));
}
return 0;
}
X[0] = 2.00 + 2.00i
X[1] = 0.00 + 0.00i
X[2] = 0.00 + 0.00i
X[3] = 2.00 + 0.00i
電気回路シミュレーションでの複素数の利用
電気回路の解析では、インピーダンスや電流、電圧を複素数で表現することが一般的です。
以下は、直列回路におけるインピーダンスの計算例です。
#include <complex.h>
#include <stdio.h>
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
int main() {
double R = 10.0; // 抵抗 (オーム)
double L = 0.1; // インダクタンス (ヘンリー)
double C = 0.01; // キャパシタンス (ファラッド)
double omega = 2 * M_PI * 50; // 周波数 (ラジアン/秒)
double complex Z_R = R; // 抵抗のインピーダンス
double complex Z_L = I * omega * L; // インダクタのインピーダンス
double complex Z_C = 1.0 / (I * omega * C); // コンデンサのインピーダンス
double complex Z_total = Z_R + Z_L + Z_C; // 総インピーダンス
printf("総インピーダンス: %.2f + %.2fi\n", creal(Z_total), cimag(Z_total));
return 0;
}
総インピーダンス: 10.00 + 31.10i
物理シミュレーションでの複素数の利用
物理シミュレーションでは、波動や振動の解析に複素数が利用されます。
以下は、単純な振動のシミュレーションの例です。
#include <stdio.h>
#include <complex.h>
#include <math.h>
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
#define N 100 // サンプル数
int main() {
double complex wave[N]; // 振動の配列
double frequency = 1.0; // 周波数
double time_step = 0.1; // 時間の刻み幅
for (int n = 0; n < N; n++) {
double t = n * time_step; // 時間
wave[n] = cexp(I * 2 * M_PI * frequency * t); // 複素数で振動を表現
}
// 結果の出力
for (int n = 0; n < N; n++) {
printf("wave[%d] = %.2f + %.2fi\n", n, creal(wave[n]), cimag(wave[n]));
}
return 0;
}
wave[0] = 1.00 + 0.00i
wave[1] = 0.95 + 0.31i
wave[2] = 0.81 + 0.59i
...
wave[99] = 0.95 - 0.31i
これらの例からもわかるように、複素数はさまざまな分野で重要な役割を果たしています。
よくある質問
まとめ
この記事では、C言語における複素数の扱い方や、printf関数
を用いた出力方法、さらには複素数を利用したさまざまな応用例について詳しく解説しました。
複素数は、信号処理や物理シミュレーションなど多くの分野で重要な役割を果たしており、その理解はプログラミングやエンジニアリングにおいて非常に有益です。
これを機に、複素数の演算や応用に挑戦し、実際のプログラムに活かしてみてください。