目录

GSL 系列 2 — 复数

1 头文件

gsl_complex.h: 定义复数类

gsl_complex_math.h: 定义复函数和相关运算

2 复数表示

gsl_complex

类定义:

1
2
3
4
5
6
// gsl_complex.h
typedef struct
  {
    double dat[2];
  }
gsl_complex;

复数实部:dat[0]

复数虚部:dat[1]

复数构建函数

gsl_complex_polar: 从极坐标构建

gsl_complex_rect: 从笛卡尔坐标构建,使用内联(当 HAVE_INLINE 定义时)

1
2
3
gsl_complex gsl_complex_polar (double r, double theta); /* r= r e^(i theta) */

INLINE_DECL gsl_complex gsl_complex_rect (double x, double y);  /* r= real+i*imag */

复数基本操作宏

GSL_REAL(z): 获取复数 z 的实部

GSL_IMAG(z): 获取复数 z 的虚部

GSL_COMPLEX_P(zp): 获取指针 zp 所指的复数

GSL_COMPLEX_P_REAL(zp): 获取指针 zp 所指的复数实部

GSL_COMPLEX_P_IMAG(zp): 获取指针 zp 所指的复数虚部

GSL_COMPLEX_EQ(z1,z2): 判断两个复数是否相等

GSL_SET_COMPLEX(zp, x, y): 通过复数指针 zp,以笛卡尔坐标形式设定复数

GSL_SET_REAL(zp, x): 通过复数指针 zp,设定复数实部

GSL_SET_IMAG(zp, y): 通过复数指针 zp,设定复数虚部

宏定义:

1
2
3
4
5
6
7
// gsl_complex.h
#define GSL_REAL(z)     ((z).dat[0])
#define GSL_IMAG(z)     ((z).dat[1])
#define GSL_COMPLEX_P(zp) ((zp)->dat)
#define GSL_COMPLEX_P_REAL(zp)  ((zp)->dat[0])
#define GSL_COMPLEX_P_IMAG(zp)  ((zp)->dat[1])
#define GSL_COMPLEX_EQ(z1,z2) (((z1).dat[0] == (z2).dat[0]) && ((z1).dat[1] == (z2).dat[1]))

3 复数属性获取函数

1
2
3
4
5
// gsl_complex_math.h
double gsl_complex_arg(gsl_complex z); /* return arg(z), -pi< arg(z) <=+pi */
double gsl_complex_abs(gsl_complex z);   /* return |z|   */
double gsl_complex_abs2(gsl_complex z);  /* return |z|^2 */
double gsl_complex_logabs(gsl_complex z); /* return log|z| */

4 复数算术运算

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
// gsl_complex_math.h
gsl_complex gsl_complex_add(gsl_complex a, gsl_complex b);  /* r=a+b */
gsl_complex gsl_complex_sub(gsl_complex a, gsl_complex b);  /* r=a-b */
gsl_complex gsl_complex_mul(gsl_complex a, gsl_complex b);  /* r=a*b */
gsl_complex gsl_complex_div(gsl_complex a, gsl_complex b);  /* r=a/b */
                                                           
gsl_complex gsl_complex_add_real(gsl_complex a, double x);  /* r=a+x */
gsl_complex gsl_complex_sub_real(gsl_complex a, double x);  /* r=a-x */
gsl_complex gsl_complex_mul_real(gsl_complex a, double x);  /* r=a*x */
gsl_complex gsl_complex_div_real(gsl_complex a, double x);  /* r=a/x */

gsl_complex gsl_complex_add_imag(gsl_complex a, double y);  /* r=a+iy */
gsl_complex gsl_complex_sub_imag(gsl_complex a, double y);  /* r=a-iy */
gsl_complex gsl_complex_mul_imag(gsl_complex a, double y);  /* r=a*iy */
gsl_complex gsl_complex_div_imag(gsl_complex a, double y);  /* r=a/iy */

gsl_complex gsl_complex_conjugate(gsl_complex z);  /* r=conj(z) * 共轭/ 
gsl_complex gsl_complex_inverse(gsl_complex a);    /* r=1/a * 逆/
gsl_complex gsl_complex_negative(gsl_complex a);    /* r=-a * 相反/

5 初等复函数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// gsl_complex_math.h
gsl_complex gsl_complex_sqrt(gsl_complex z);  /* r=sqrt(z) */
gsl_complex gsl_complex_sqrt_real(double x);  /* r=sqrt(x) (x<0 ok) */

gsl_complex gsl_complex_pow(gsl_complex a, gsl_complex b);  /* r=a^b */
gsl_complex gsl_complex_pow_real(gsl_complex a, double b);  /* r=a^b */

gsl_complex gsl_complex_exp(gsl_complex a);    /* r=exp(a) */
gsl_complex gsl_complex_log(gsl_complex a);    /* r=log(a) (base e) */
gsl_complex gsl_complex_log10(gsl_complex a);  /* r=log10(a) (base 10) */
gsl_complex gsl_complex_log_b(gsl_complex a, gsl_complex b);   /* r=log_b(a) (base=b) */

6 复三角函数

1
2
3
4
5
6
7
// gsl_complex_math.h
gsl_complex gsl_complex_sin(gsl_complex a);  /* r=sin(a) */
gsl_complex gsl_complex_cos(gsl_complex a);  /* r=cos(a) */
gsl_complex gsl_complex_sec(gsl_complex a);  /* r=sec(a) */
gsl_complex gsl_complex_csc(gsl_complex a);  /* r=csc(a) */
gsl_complex gsl_complex_tan(gsl_complex a);  /* r=tan(a) */
gsl_complex gsl_complex_cot(gsl_complex a);  /* r=cot(a) */

7 复反三角函数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// gsl_complex_math.h
gsl_complex gsl_complex_arcsin(gsl_complex a);  /* r=arcsin(a) */
gsl_complex gsl_complex_arcsin_real(double a);  /* r=arcsin(a) */
gsl_complex gsl_complex_arccos(gsl_complex a);  /* r=arccos(a) */
gsl_complex gsl_complex_arccos_real(double a);  /* r=arccos(a) */
gsl_complex gsl_complex_arcsec(gsl_complex a);  /* r=arcsec(a) */
gsl_complex gsl_complex_arcsec_real(double a);  /* r=arcsec(a) */
gsl_complex gsl_complex_arccsc(gsl_complex a);  /* r=arccsc(a) */
gsl_complex gsl_complex_arccsc_real(double a);  /* r=arccsc(a) */
gsl_complex gsl_complex_arctan(gsl_complex a);  /* r=arctan(a) */
gsl_complex gsl_complex_arccot(gsl_complex a);  /* r=arccot(a) */

8 复双曲函数

1
2
3
4
5
6
7
// gsl_complex_math.h
gsl_complex gsl_complex_sinh(gsl_complex a);  /* r=sinh(a) */
gsl_complex gsl_complex_cosh(gsl_complex a);  /* r=coshh(a) */
gsl_complex gsl_complex_sech(gsl_complex a);  /* r=sech(a) */
gsl_complex gsl_complex_csch(gsl_complex a);  /* r=csch(a) */
gsl_complex gsl_complex_tanh(gsl_complex a);  /* r=tanh(a) */
gsl_complex gsl_complex_coth(gsl_complex a);  /* r=coth(a) */

9 复反双曲函数

1
2
3
4
5
6
7
8
9
// gsl_complex_math.h
gsl_complex gsl_complex_arcsinh(gsl_complex a);  /* r=arcsinh(a) */
gsl_complex gsl_complex_arccosh(gsl_complex a);  /* r=arccosh(a) */
gsl_complex gsl_complex_arccosh_real(double a);  /* r=arccosh(a) */
gsl_complex gsl_complex_arcsech(gsl_complex a);  /* r=arcsech(a) */
gsl_complex gsl_complex_arccsch(gsl_complex a);  /* r=arccsch(a) */
gsl_complex gsl_complex_arctanh(gsl_complex a);  /* r=arctanh(a) */
gsl_complex gsl_complex_arctanh_real(double a);  /* r=arctanh(a) */
gsl_complex gsl_complex_arccoth(gsl_complex a);  /* r=arccoth(a) */

10 参考

https://www.gnu.org/software/gsl/doc/html/complex.html