using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace vcsCOMP { //構造体宣言 struct Complex{ public double Real; public double Imag; } public partial class Form1 : Form { public Form1() { InitializeComponent(); } //---------------------------------------------------------------------- //*********************************************************** //複素数計算のための構造体宣言とFunctionプロシージャ開始 //*********************************************************** //定義済み関数 //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)) //---------------------------------------------------------------------- private Complex C_DOUBLE(double a, double b) { //複素数実数部と虚数部への数値の代入 Complex zr; zr.Real = a; zr.Imag = b; return zr; } //---------------------------------------------------------------------- private Complex C_PLUS(Complex z1, Complex z2) { //加算 Complex zr; zr.Real = z1.Real + z2.Real; zr.Imag = z1.Imag + z2.Imag; return zr; } //---------------------------------------------------------------------- private Complex C_MINUS(Complex z1, Complex z2) { //減算 Complex zr; zr.Real = z1.Real - z2.Real; zr.Imag = z1.Imag - z2.Imag; return zr; } //---------------------------------------------------------------------- private Complex C_TIMES(Complex z1, Complex z2) { //乗算 Complex zr; zr.Real = z1.Real * z2.Real - z1.Imag * z2.Imag; zr.Imag = z1.Real * z2.Imag + z2.Real * z1.Imag; return zr; } //---------------------------------------------------------------------- private Complex C_DIVIDED(Complex z1, Complex z2) { //除算 Complex zr; zr.Real = 0.0; zr.Imag = 0.0; if (z2.Real == 0.0 && z2.Imag == 0.0) { MessageBox.Show("分母が0です!"); this.Close(); } 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; } //---------------------------------------------------------------------- private double D_ABS(Complex z) { //絶対値 return Math.Sqrt(z.Real*z.Real + z.Imag*z.Imag); } //---------------------------------------------------------------------- private Complex C_CONJ(Complex z) { //共役複素数 Complex zr; zr.Real = z.Real; zr.Imag = -z.Imag; return zr; } //---------------------------------------------------------------------- private Complex C_SQRT(Complex z) { //平方根 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 = Math.Sqrt(z.Real*z.Real + z.Imag*z.Imag); phi = Math.Acos(z.Real / rr); if (z.Imag < 0.0) phi = 2.0 * Math.PI - phi; //phiの範囲を0〜2πとする(acosの戻り値は0〜π) zr.Real = Math.Pow(rr,0.5) * Math.Cos(0.5 * phi); zr.Imag = Math.Pow(rr,0.5) * Math.Sin(0.5 * phi); } return zr; } //---------------------------------------------------------------------- private Complex C_EXP(Complex z) { //EXP関数 Complex zr; zr.Real = Math.Exp(z.Real) * Math.Cos(z.Imag); zr.Imag = Math.Exp(z.Real) * Math.Sin(z.Imag); return zr; } //---------------------------------------------------------------------- private Complex C_COS(Complex z) { //cos関数 Complex zr; zr.Real = 0.5 * (Math.Exp(-z.Imag) + Math.Exp(z.Imag)) * Math.Cos(z.Real); zr.Imag = 0.5 * (Math.Exp(-z.Imag) - Math.Exp(z.Imag)) * Math.Sin(z.Real); return zr; } //---------------------------------------------------------------------- private Complex C_SIN(Complex z) { //sin関数 Complex zr; zr.Real = 0.5 * (Math.Exp(-z.Imag) + Math.Exp(z.Imag)) * Math.Sin(z.Real); zr.Imag = -0.5 * (Math.Exp(-z.Imag) - Math.Exp(z.Imag)) * Math.Cos(z.Real); return zr; } //---------------------------------------------------------------------- private Complex C_COSH(Complex z) { //cosh関数 Complex zr; zr.Real = 0.5 * (Math.Exp(z.Real) + Math.Exp(-z.Real)) * Math.Cos(z.Imag); zr.Imag = 0.5 * (Math.Exp(z.Real) - Math.Exp(-z.Real)) * Math.Sin(z.Imag); return zr; } //---------------------------------------------------------------------- private Complex C_SINH(Complex z) { //sinh関数 Complex zr; zr.Real = 0.5 * (Math.Exp(z.Real) - Math.Exp(-z.Real)) * Math.Cos(z.Imag); zr.Imag = 0.5 * (Math.Exp(z.Real) + Math.Exp(-z.Real)) * Math.Sin(z.Imag); return zr; } //*********************************************************** //複素数計算のための構造体宣言とFunctionプロシージャ終了 //*********************************************************** //---------------------------------------------------------------------- private void button1_Click(object sender, EventArgs e) { 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); Console.WriteLine("01 "+z.Real.ToString() + " " + z.Imag.ToString()); //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); Console.WriteLine("02 " + z.Real.ToString() + " " + z.Imag.ToString()); //{(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); Console.WriteLine("03 " + z.Real.ToString() + " " + z.Imag.ToString()); //平方根 //sqrt(2) z = C_SQRT(C_DOUBLE(2, 0)); Console.WriteLine("04 " + z.Real.ToString() + " " + z.Imag.ToString()); //sqrt(3) z = C_SQRT(C_DOUBLE(3, 0)); Console.WriteLine("05 " + z.Real.ToString() + " " + z.Imag.ToString()); //sqrt(-i)=cos(3/4*pi)+i*sin(3/4*pi) z = C_SQRT(C_DOUBLE(0, -1)); Console.WriteLine("06 " + z.Real.ToString() + " " + z.Imag.ToString() + " " + Math.Cos(3.0 / 4.0 * Math.PI).ToString() + " " + Math.Sin(3.0 / 4.0 * Math.PI).ToString()); //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))); Console.WriteLine("07 " + z1.Real.ToString() + " " + z1.Imag.ToString() + " " + z2.Real.ToString() + " " + z2.Imag.ToString()); //三角関数 //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))); Console.WriteLine("08 " + z1.Real.ToString() + " " + z1.Imag.ToString()); //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))); Console.WriteLine("09 " + z3.Real.ToString() + " " + z3.Imag.ToString() + " " + z4.Real.ToString() + " " + z4.Imag.ToString()); //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))); Console.WriteLine("10 " + z3.Real.ToString() + " " + z3.Imag.ToString() + " " + z4.Real.ToString() + " " + z4.Imag.ToString()); //双曲線関数 //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)); Console.WriteLine("11 " + z1.Real.ToString() + " " + z1.Imag.ToString() + " " + z4.Real.ToString() + " " + z4.Imag.ToString()); //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)); Console.WriteLine("12 " + z1.Real.ToString() + " " + z1.Imag.ToString() + " " + z4.Real.ToString() + " " + z4.Imag.ToString()); //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)); Console.WriteLine("13 " + z3.Real.ToString() + " " + z3.Imag.ToString()); //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)); Console.WriteLine("14 " + z1.Real.ToString() + " " + z1.Imag.ToString() + " " + z2.Real.ToString() + " " + z2.Imag.ToString()); //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); Console.WriteLine("15 " + z1.Real.ToString() + " " + z1.Imag.ToString() + " " + z2.Real.ToString() + " " + z2.Imag.ToString()); //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)); Console.WriteLine("16 " + z1.Real.ToString() + " " + z1.Imag.ToString() + " " + z2.Real.ToString() + " " + z2.Imag.ToString()); //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); Console.WriteLine("17 " + z1.Real.ToString() + " " + z1.Imag.ToString() + " " + z2.Real.ToString() + " " + z2.Imag.ToString()); //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))); Console.WriteLine("18 " + z3.Real.ToString() + " " + z3.Imag.ToString() + " " + z4.Real.ToString() + " " + z4.Imag.ToString()); //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))); Console.WriteLine("19 " + z3.Real.ToString() + " " + z3.Imag.ToString() + " " + z4.Real.ToString() + " " + z4.Imag.ToString()); } //---------------------------------------------------------------------- } }