|
[ 簡単な説明 ] 複素数演算の関数ライブラリです。複素数は、"sslib.h" 内で定義した Complex 型の構造体で表します。 Complex 型の数値 a の実数部、虚数部はそれぞれ、a.r、a.i で参照できます。 ライブラリには、四則演算及び基本的な関数を準備しています。 基本的な関数は数学公式の通りに計算しています。 |
| 関数名 | 関数の機能 | 呼び出し例 | |
| cadd( ) | 四則演算 | 加算 | c = cadd(a, b); |
| csub( ) | 減算 | c = csub(a, b); | |
| cmul( ) | 乗算 | c = cmul(a, b); | |
| cmul1( ) | 乗算(対 double) | c = cmul1(a, x); | |
| cdiv( ) | 除算 | c = cdiv(a, b); | |
| cdiv1( ) | 除算(対 double) | c = cdiv1(a, x); | |
| cln( ) | 対数関数 | 自然対数 | c = cln(a); |
| clog10( ) | 常用対数 | c = clog10(a); | |
| cexp( ) | 指数関数 | c = cexp(a); | |
| cpow( ) | ベキ乗 | Complex 乗 | c = cpow(a, b); |
| cpowd( ) | double 乗 | c = cpowd(a, x); | |
| csin( ) | 三角関数 | 正弦関数 | c = csin(a); |
| ccos( ) | 余弦関数 | c = ccos(a); | |
| ctan( ) | 正接関数 | c = ctan(a); | |
| csqrt( ) | 平方根 | c = csqrt(a); | |
| tocomplex( ) | double → Complex データ変換 | c = tocomplex(xr, xi); | |
| conj( ) | 複素共役 | c = conj(a); | |
| cfunc( ) | 代数多項式の値計算 | c = cfunc(a, n, x); | |
| cabslt( ) | 絶対値 | x = cabslt(a); | |
| carg( ) | 偏角 | t = carg(a); | |
| cne( ) | 判定 | 異値判定 | if(cne(a, b)) ... |
| ceq( ) | 等値判定 | if(cwq(a, b)) ... | |
/* complex.c */
#include <stdio.h>
#include "sslib.h"
Complex cadd(Complex a, Complex b)
{
return tocomplex(a.r + b.r, a.i + b.i);
}
Complex csub(Complex a, Complex b)
{
return tocomplex(a.r - b.r, a.i - b.i);
}
Complex cmul(Complex a, Complex b)
{
return tocomplex(a.r * b.r - a.i * b.i, a.r * b.i + a.i * b.r);
}
Complex cmul1(Complex a, double k)
{
return tocomplex(a.r * k, a.i * k);
}
Complex cdiv(Complex a, Complex b)
{
double w;
if(ceq(a, b)) return tocomplex(1., 0.);
w = b.r * b.r + b.i * b.i;
if(w == 0)
{
fprintf(stderr, "Error : Divide by 0 in cdiv()\n");
return tocomplex(0., 0.);
}
return tocomplex((a.r * b.r + a.i * b.i) / w, (a.i * b.r - a.r * b.i) / w);
}
Complex cdiv1(Complex a, double k)
{
if(k == 0.)
{
fprintf(stderr, "Error : Divide by 0 in cdiv1()\n");
return tocomplex(0., 0.);
}
return tocomplex(a.r / k, a.i / k);
}
Complex cln(Complex a)
{
return tocomplex(log(cabslt(a)), carg(a));
}
Complex clog10(Complex a)
{
return cmul(tocomplex(M_LOG10E, 0.), cln(a));
}
Complex cexp(Complex a)
{
double x;
x = exp(a.r);
return tocomplex(x * cos(a.i), x * sin(a.i));
}
Complex cpow(Complex a, Complex b)
{
return cexp(cmul(cln(a), b));
}
Complex cpowd(Complex a, double n)
{
double w, t;
t = carg(a) * n;
w = pow(cabslt(a), n);
return tocomplex(w * cos(t), w * sin(t));
}
Complex csin(Complex a)
{
double ar;
if(fabs(a.r) > 2. * M_PI) ar = (int)(a.r / 2. / M_PI) * 2. * M_PI;
else ar = a.r;
return tocomplex(sin(ar) * cosh(a.i), cos(ar) * sinh(a.i));
}
Complex ccos(Complex a)
{
double ar;
if(fabs(a.r) > 2. * M_PI) ar = (int)(a.r / 2. / M_PI) * 2. * M_PI;
else ar = a.r;
return tocomplex(cos(ar) * cosh(a.i), - sin(ar) * sinh(a.i));
}
Complex ctan(Complex a)
{
Complex x;
if(fabs(a.r) > 2. * M_PI) a.r = (int)(a.r / 2. / M_PI) * 2. * M_PI;
x = tocomplex(cos(a.r) * cosh(a.i), - sin(a.r) * sinh(a.i));
if(x.r == 0. && x.i == 0.)
{
fprintf(stderr, "Error : Divide by 0. in ctan()\n");
return tocomplex(0., 0.);
}
return cdiv(csin(a), x);
}
Complex csqrt(Complex a)
{
double t, z;
z = pow(cabslt(a), 0.5);
t = carg(a) / 2.;
return tocomplex(z * cos(t), z * sin(t));
}
Complex tocomplex(double x, double y)
{
Complex a;
a.r = x;
a.i = y;
return a;
}
Complex conj(Complex a)
{
return tocomplex(a.r, - a.i);
}
Complex cfunc(Complex *a, int n, Complex x)
{
Complex *p, y;
int i;
p = a;
y = *p++;
for(i = 1; i <= n; i++) y = cadd(cmul(y, x), *p++);
return y;
}
double cabslt(Complex a)
{
return sqrt(a.r * a.r + a.i * a.i);
}
double carg(Complex a)
{
if(cabslt(a) == 0.) return 0.;
return atan2(a.i, a.r);
}
int ceq(Complex a, Complex b)
{
if(a.r == b.r && a.i == b.i) return 1;
return 0;
}
int cne(Complex a, Complex b)
{
if(a.r != b.r || a.i != b.i) return 1;
return 0;
}
|