3 複素数と複素関数

3.1 複素関数を使った例

以前のC言語は複素数がサポートされていなかった.数値計算をする場合,複素数が使え ないとかなり不便を強いられる.そのため,複素数が使える FORTRAN から抜け出せない 人が多くいた.新しいC言語では,複素数がサポートされている.これは非常にありがた い.

実際に複素数や複素関数を使った例をリスト2に示す.これ は,オイラーが発見した式

$\displaystyle e^{i\pi}=-1$ (1)

の計算結果である.この式はとても不思議で,25年くらい前にはじめてみたときには大変驚いた記憶があ る.それまではなんの関係もないと思っていた円周率$ \pi$とネピア数$ e$と虚数単位 $ i$が,こんなにも簡単な式で結ばれるのでる.
   1 #include <stdio.h>
   2 #include <complex.h>
   3 #include <math.h>
   4 
   5 int main(void){
   6   double _Complex z, x;
   7 
   8   x=I*M_PI;
   9   z=cexp(x);
  10 
  11   printf("real=%f\timag=%f\n", creal(z),cimag(z));
  12 
  13   return 0;
  14 }
\fbox{実行結果}
real=-1.000000  imag=0.000000
このプログラムの各行の内容は,次の通りである.

3.2 複素関数の使い方

3.2.1 記述方法

3.2.1.1 ヘッダーファイル

ヘッダーファイルcomplex.hをインクルードする必要がある.プログラムの前の方に,
	#include <complex.h>

と書く.

3.2.1.2 変数宣言

複素数の計算では,複素数型の変数宣言が必要である.変数宣言の例を,以下に示す.
	float _Complex a, b, hoge;
	double _Complex c, d. fuga;
	long double _Complex e, f, foo;

のようにする.通常は,double _Complexを使うこと.C言語で実数を扱う場合は double,複素数を扱う場合はdouble _Complexとするのが無難である.

3.2.1.3 複素数

虚数単位はIである.数学は小文字を使うが,C言語では大文字である.複素数型の 変数に値を代入するためには,次のようにする.
	z=x+I*y;
	w=3.1415+I*2.718281828;

3.2.1.4 四則演算

四則演算は特に気にすることもなく,普通に演算子(+,-,*,/)が使える.

3.2.1.5 複素関数

3のような関数が用意されている.よほどのことがない限り, 倍精度型を使うこと.

表 3: complex.hで定義されている関数.関数の引数と戻り値は同じ型である. 引数が倍精度複素数であれば,戻り値は倍精度複素数または倍精度実数である.
数学関数名 倍精度 単精度 拡張倍精度 戻り値
三角関数 csin(x) csinf(x) csinl(x) 複素数
  ccos(x) ccosf(x) ccosl(x) 複素数
  ctan(x) ctanf(x) ctanl(x) 複素数
逆三角関数 casin(x) casinf(x) casinl(x) 複素数
  cacos(x) cacosf(x) cacosl(x) 複素数
  catan(x) catanf(x) catanl(x) 複素数
双曲線関数 csinh(x) csinhf(x) csinhl(x) 複素数
  ccosh(x) ccoshf(x) ccoshl(x) 複素数
  ctanh(x) ctanhf(x) ctanhl(x) 複素数
逆双曲線関数 casinh(x) casinhf(x) casinhl(x) 複素数
  cacosh(x) cacoshf(x) cacoshl(x) 複素数
  catanh(x) catanhf(x) catanhl(x) 複素数
指数関数 cexp(x) cexpf(x) cexpl(x) 複素数
自然対数 clog(x) clogf(x) clogl(x) 複素数
絶対値 cabs(x) cabsf(x) cabsl(x) 実数
平方根 csqrt(x) csqrtf(x) csqrtl(x) 複素数
べき乗 cpow(x,y) cpowf(x,y) cpowl(x,y) 複素数($ x^y$)
実部 creal(x) crealf(x) creall(x) 実数
虚部 cimag(x) cimagf(x) cimagl(x) 実数
偏角 carg(x) cargf(x) cargl(x) 実数
複素共役 conj(x) conjf(x) conjl(x) 複素数
リーマン球の射影 cproj(x) cprojf(x) cprojl(x) 複素数

3.2.2 コンパイル方法

実数型と同じように,オプション-lmをつける.
gcc -o fugafuga hogehoge.c -lm

3.3 練習問題

[練習5]
複素数$ z_1=i$$ z_2=1+i$について,以下の値を計算せよ.
  • 2乗と3乗
  • 平方根と立方根
  • 絶対値
  • 複素共役
[練習6]
オイラーの関係式 $ e^{i\theta}=\cos\theta+i\sin\theta$が成 り立つことを, $ 0\leqq\theta\leqq 2\pi$の範囲で調べよ. この間を360等分して,両辺の値を出力する.
[練習7]
$ i^i$の値を計算してみよ.そして,解析解と比較せよ.

ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
平成19年6月26日


no counter