#include #include /* 構造体宣言 */ struct Complex{ double Real; double Imag; }; struct Complex C_DOUBLE(double a,double b); struct Complex C_PLUS(struct Complex z1,struct Complex z2); struct Complex C_MINUS(struct Complex z1,struct Complex z2); struct Complex C_TIMES(struct Complex z1,struct Complex z2); struct Complex C_DIVIDED(struct Complex z1,struct Complex z2); double D_ABS(struct Complex z); struct Complex C_CONJ(struct Complex z); struct Complex C_SQRT(struct Complex z); struct Complex C_EXP(struct Complex z); struct Complex C_COS(struct Complex z); struct Complex C_SIN(struct Complex z); struct Complex C_COSH(struct Complex z); struct Complex C_SINH(struct Complex z); /*----------------------------------------------------------------------*/ /**********************************************/ /* 複素数計算のための構造体宣言と関数定義開始 */ /**********************************************/ /* 定義済み関数 */ /* za=C_DOUBLE(a,b) :複素数実数部と虚数部への数値の代入(Re(z)=a,Im(z)=b)*/ /* za=C_PLUS(z1,z2) :加算(za=z1+z2) */ /* za=C_MINUS(z1,z2) :減算(za=z1-z2) */ /* za=C_TIMES(z1,z2) :乗算(za=z1*z2) */ /* za=C_DIVIDED(z1,z2):除算(za=z1/z2) */ /* da=D_ABS(z) :絶対値(da=sqrt(Re(z)^2+Im(z)^2))*/ /* za=C_CONJ(z) :共役複素数(z=a+ib→za=a-ib) */ /* za=C_SQRT(z) :平方根(za=sqrt(z)) */ /* za=C_EXP(z) :exp関数(za=exp(z)) */ /* za=C_COS(z) :cos関数(za=cos(z)) */ /* za=C_SIN(z) :sin関数(za=sin(z)) */ /* za=C_COSH(z) :cosh関数(za=cosh(z)) */ /* za=C_SINH(z) :sinh関数(za=sinh(z)) */ /*----------------------------------------------------------------------*/ struct Complex C_DOUBLE(double a,double b) { /* 複素数実数部と虚数部への数値の代入 */ struct Complex zr; zr.Real=a; zr.Imag=b; return zr; } /*----------------------------------------------------------------------*/ struct Complex C_PLUS(struct Complex z1,struct Complex z2) { /* 加算 */ struct Complex zr; zr.Real=z1.Real+z2.Real; zr.Imag=z1.Imag+z2.Imag; return zr; } /*----------------------------------------------------------------------*/ struct Complex C_MINUS(struct Complex z1,struct Complex z2) { /* 減算 */ struct Complex zr; zr.Real=z1.Real-z2.Real; zr.Imag=z1.Imag-z2.Imag; return zr; } /*----------------------------------------------------------------------*/ struct Complex C_TIMES(struct Complex z1,struct Complex z2) { /* 乗算 */ struct Complex zr; zr.Real=z1.Real*z2.Real-z1.Imag*z2.Imag; zr.Imag=z1.Real*z2.Imag+z2.Real*z1.Imag; return zr; } /*----------------------------------------------------------------------*/ struct Complex C_DIVIDED(struct Complex z1,struct Complex z2) { /* 除算 */ struct Complex zr; zr.Real=0.0; zr.Imag=0.0; if(z2.Real==0.0&&z2.Imag==0.0){ printf("分母が0です!"); zr.Real=0.0; zr.Imag=0.0; }else{ zr.Real=(z1.Real*z2.Real+z1.Imag*z2.Imag)/(z2.Real*z2.Real+z2.Imag*z2.Imag); zr.Imag=(z2.Real*z1.Imag-z1.Real*z2.Imag)/(z2.Real*z2.Real+z2.Imag*z2.Imag); } return zr; } /*----------------------------------------------------------------------*/ double D_ABS(struct Complex z) { /* 絶対値 */ return sqrt(z.Real*z.Real+z.Imag*z.Imag); } /*----------------------------------------------------------------------*/ struct Complex C_CONJ(struct Complex z) { /* 共役複素数 */ struct Complex zr; zr.Real=z.Real; zr.Imag=-z.Imag; return zr; } /*----------------------------------------------------------------------*/ struct Complex C_SQRT(struct Complex z) { /* 平方根 */ struct Complex zr; double rr; double phi; if(z.Real==0.0&&z.Imag==0.0){ zr.Real=0.0; zr.Imag=0.0; }else{ rr=sqrt(z.Real*z.Real+z.Imag*z.Imag); phi=acos(z.Real/rr); if(z.Imag<0.0)phi=2.0*M_PI-phi; /* phiの範囲を0〜2πとする(acosの戻り値は0〜π) */ zr.Real=pow(rr,0.5)*cos(0.5*phi); zr.Imag=pow(rr,0.5)*sin(0.5*phi); } return zr; } /*----------------------------------------------------------------------*/ struct Complex C_EXP(struct Complex z) { /* EXP関数 */ struct Complex zr; zr.Real=exp(z.Real)*cos(z.Imag); zr.Imag=exp(z.Real)*sin(z.Imag); return zr; } /*----------------------------------------------------------------------*/ struct Complex C_COS(struct Complex z) { /* cos関数 */ struct Complex zr; zr.Real=0.5*(exp(-z.Imag)+exp(z.Imag))*cos(z.Real); zr.Imag=0.5*(exp(-z.Imag)-exp(z.Imag))*sin(z.Real); return zr; } /*----------------------------------------------------------------------*/ struct Complex C_SIN(struct Complex z) { /* sin関数 */ struct Complex zr; zr.Real=0.5*(exp(-z.Imag)+exp(z.Imag))*sin(z.Real); zr.Imag=-0.5*(exp(-z.Imag)-exp(z.Imag))*cos(z.Real); return zr; } /*----------------------------------------------------------------------*/ struct Complex C_COSH(struct Complex z) { /* cosh関数 */ struct Complex zr; zr.Real=0.5*(exp(z.Real)+exp(-z.Real))*cos(z.Imag); zr.Imag=0.5*(exp(z.Real)-exp(-z.Real))*sin(z.Imag); return zr; } /*----------------------------------------------------------------------*/ struct Complex C_SINH(struct Complex z) { /* sinh関数 */ struct Complex zr; zr.Real=0.5*(exp(z.Real)-exp(-z.Real))*cos(z.Imag); zr.Imag=0.5*(exp(z.Real)+exp(-z.Real))*sin(z.Imag); return zr; } /**********************************************/ /* 複素数計算のための構造体宣言と関数定義終了 */ /**********************************************/ /*----------------------------------------------------------------------*/ int main() { struct Complex z,z1,z2,z3,z4; /* 虚数計算チェック */ /* 四則演算 */ /* (1-i)/(1+i)=-i */ z1=C_DOUBLE(1,-1); z2=C_DOUBLE(1,1); z=C_DIVIDED(z1,z2); printf("01 %e %e %e %e\n",z.Real,z.Imag,0.0,-1.0); /* i/(1-i)+(1-i)/i=-3/2-1/2*i */ z1=C_DIVIDED(C_DOUBLE(0,1),C_DOUBLE(1,-1)); z2=C_DIVIDED(C_DOUBLE(1,-1),C_DOUBLE(0,1)); z=C_PLUS(z1,z2); printf("02 %e %e %e %e\n",z.Real,z.Imag,-3.0/2.0,-1.0/2.0); /* {(3+4*i)/(1-2*i)}^2=-3-4*i */ z1=C_DIVIDED(C_DOUBLE(3,4),C_DOUBLE(1,-2)); z=C_TIMES(z1,z1); printf("03 %e %e %e %e\n",z.Real,z.Imag,-3.0,-4.0); /* 平方根 */ /* sqrt(2) */ z=C_SQRT(C_DOUBLE(2,0)); printf("04 %e %e %e %e\n",z.Real,z.Imag,sqrt(2.0),0.0); /* sqrt(3) */ z=C_SQRT(C_DOUBLE(3,0)); printf("05 %e %e %e %e\n",z.Real,z.Imag,sqrt(3.0),0.0); /* sqrt(-i)=cos(3/4*pi)+i*sin(3/4*pi) */ z=C_SQRT(C_DOUBLE(0,-1)); printf("06 %e %e %e %e\n",z.Real,z.Imag,cos(3.0/4.0*M_PI),sin(3.0/4.0*M_PI)); /* exp関数 */ /* e^(i*z)=cos(z)+i*sin(z) */ z=C_DOUBLE(2.5,-7.3); z1=C_EXP(C_TIMES(C_DOUBLE(0,1),z)); z2=C_PLUS(C_COS(z),C_TIMES(C_DOUBLE(0,1),C_SIN(z))); printf("07 %e %e %e %e\n",z1.Real,z1.Imag,z2.Real,z2.Imag); /* 三角関数 */ /* sin(z)^2+cos(z)^2=1 */ z=C_DOUBLE(1.0,2.0); z1=C_PLUS(C_TIMES(C_SIN(z),C_SIN(z)),C_TIMES(C_COS(z),C_COS(z))); printf("08 %e %e %e %e\n",z1.Real,z1.Imag,1.0,0.0); /* sin(z1+z2)=sin(z1)*cos(z2)+cos(z1)*sin(z2) */ z1=C_DOUBLE(1.7,-3.6); z2=C_DOUBLE(200.0,-0.3); z3=C_SIN(C_PLUS(z1,z2)); z4=C_PLUS(C_TIMES(C_SIN(z1),C_COS(z2)),C_TIMES(C_COS(z1),C_SIN(z2))); printf("09 %e %e %e %e\n",z3.Real,z3.Imag,z4.Real,z4.Imag); /* cos(z1+z2)=cos(z1)*cos(z2)-sin(z1)*sin(z2) */ z1=C_DOUBLE(1.7,-3.6); z2=C_DOUBLE(200.0,-0.3); z3=C_COS(C_PLUS(z1,z2)); z4=C_MINUS(C_TIMES(C_COS(z1),C_COS(z2)),C_TIMES(C_SIN(z1),C_SIN(z2))); printf("10 %e %e %e %e\n",z3.Real,z3.Imag,z4.Real,z4.Imag); /* 双曲線関数 */ /* cosh(z)=1/2*(e^z+e^(-z)) */ z=C_DOUBLE(1.7,-3.6); z1=C_COSH(z); z2=C_EXP(z); z3=C_EXP(C_TIMES(C_DOUBLE(-1,0),z)); z4=C_TIMES(C_DOUBLE(0.5,0),C_PLUS(z2,z3)); printf("11 %e %e %e %e\n",z1.Real,z1.Imag,z4.Real,z4.Imag); /* sinh(z)=1/2*(e^z-e^(-z)) */ z=C_DOUBLE(1.7,-3.6); z1=C_SINH(z); z2=C_EXP(z); z3=C_EXP(C_TIMES(C_DOUBLE(-1,0),z)); z4=C_TIMES(C_DOUBLE(0.5,0),C_MINUS(z2,z3)); printf("12 %e %e %e %e\n",z1.Real,z1.Imag,z4.Real,z4.Imag); /* cosh(z)^2-sinh(z)^2=1 */ z=C_DOUBLE(1.7,-3.6); z1=C_COSH(z); z2=C_SINH(z); z3=C_MINUS(C_TIMES(z1,z1),C_TIMES(z2,z2)); printf("13 %e %e %e %e\n",z3.Real,z3.Imag,1.0,0.0); /* sinh(i*z)=i*sin(z) */ z=C_DOUBLE(1.7,-3.6); z1=C_SINH(C_TIMES(C_DOUBLE(0,1),z)); z2=C_TIMES(C_DOUBLE(0,1),C_SIN(z)); printf("14 %e %e %e %e\n",z1.Real,z1.Imag,z2.Real,z2.Imag); /* cosh(i*z)=cos(z) */ z=C_DOUBLE(1.7,-3.6); z1=C_COSH(C_TIMES(C_DOUBLE(0,1),z)); z2=C_COS(z); printf("15 %e %e %e %e\n",z1.Real,z1.Imag,z2.Real,z2.Imag); /* sin(i*z)=i*sinh(z) */ z=C_DOUBLE(1.7,-3.6); z1=C_SIN(C_TIMES(C_DOUBLE(0,1),z)); z2=C_TIMES(C_DOUBLE(0,1),C_SINH(z)); printf("16 %e %e %e %e\n",z1.Real,z1.Imag,z2.Real,z2.Imag); /* cos(i*z)=cosh(z) */ z=C_DOUBLE(1.7,-3.6); z1=C_COS(C_TIMES(C_DOUBLE(0,1),z)); z2=C_COSH(z); printf("17 %e %e %e %e\n",z1.Real,z1.Imag,z2.Real,z2.Imag); /* sinh(z1+z2)=sinh(z1)*cosh(z2)+cosh(z1)*sinh(z2) */ z1=C_DOUBLE(1.7,-3.6); z2=C_DOUBLE(2.0,-0.3); z3=C_SINH(C_PLUS(z1,z2)); z4=C_PLUS(C_TIMES(C_SINH(z1),C_COSH(z2)),C_TIMES(C_COSH(z1),C_SINH(z2))); printf("18 %e %e %e %e\n",z3.Real,z3.Imag,z4.Real,z4.Imag); /* cosh(z1+z2)=cosh(z1)*cosh(z2)+sinh(z1)*sinh(z2) */ z1=C_DOUBLE(1.7,-3.6); z2=C_DOUBLE(2.0,-0.3); z3=C_COSH(C_PLUS(z1,z2)); z4=C_PLUS(C_TIMES(C_COSH(z1),C_COSH(z2)),C_TIMES(C_SINH(z1),C_SINH(z2))); printf("19 %e %e %e %e\n",z3.Real,z3.Imag,z4.Real,z4.Imag); printf("リターンキーを押してください"); getchar(); return 0; } /*----------------------------------------------------------------------*/