Option Explicit On Option Strict On Public Class Form1 '*********************************************************** '複素数計算のための構造体宣言と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 Structure Complex '構造体宣言 Dim Real As Double Dim Imag As Double End Structure Private Function C_DOUBLE(ByVal a As Double, ByVal b As Double) As Complex '複素数実数部と虚数部への数値の代入 C_DOUBLE.Real = a C_DOUBLE.Imag = b End Function Private Function C_PLUS(ByVal z1 As Complex, ByVal z2 As Complex) As Complex '加算 C_PLUS.Real = z1.Real + z2.Real C_PLUS.Imag = z1.Imag + z2.Imag End Function Private Function C_MINUS(ByVal z1 As Complex, ByVal z2 As Complex) As Complex '減算 C_MINUS.Real = z1.Real - z2.Real C_MINUS.Imag = z1.Imag - z2.Imag End Function Private Function C_TIMES(ByVal z1 As Complex, ByVal z2 As Complex) As Complex '乗算 C_TIMES.Real = z1.Real * z2.Real - z1.Imag * z2.Imag C_TIMES.Imag = z1.Real * z2.Imag + z2.Real * z1.Imag End Function Private Function C_DIVIDED(ByVal z1 As Complex, ByVal z2 As Complex) As Complex '除算 If z2.Real = 0.0 And z2.Imag = 0.0 Then MessageBox.Show("分母が0です!") Me.Close() Else C_DIVIDED.Real = (z1.Real * z2.Real + z1.Imag * z2.Imag) / (z2.Real ^ 2 + z2.Imag ^ 2) C_DIVIDED.Imag = (z2.Real * z1.Imag - z1.Real * z2.Imag) / (z2.Real ^ 2 + z2.Imag ^ 2) End If End Function Private Function D_ABS(ByVal z As Complex) As Double '絶対値 D_ABS = Math.Sqrt(z.Real ^ 2 + z.Imag ^ 2) End Function Private Function C_CONJ(ByVal z As Complex) As Complex '共役複素数 C_CONJ.Real = z.Real C_CONJ.Imag = -z.Imag End Function Private Function C_SQRT(ByVal z As Complex) As Complex '平方根 If z.Real = 0.0 And z.Imag = 0.0 Then C_SQRT.Real = 0.0 C_SQRT.Imag = 0.0 Else Dim rr As Double Dim phi As Double rr = Math.Sqrt(z.Real ^ 2 + z.Imag ^ 2) phi = Math.Acos(z.Real / rr) If z.Imag < 0.0 Then phi = 2.0 * Math.PI - phi 'phiの範囲を0〜2πとする(acosの戻り値は0〜π) C_SQRT.Real = rr ^ (0.5) * Math.Cos(0.5 * phi) C_SQRT.Imag = rr ^ (0.5) * Math.Sin(0.5 * phi) End If End Function Private Function C_EXP(ByVal z As Complex) As Complex 'EXP関数 C_EXP.Real = Math.Exp(z.Real) * Math.Cos(z.Imag) C_EXP.Imag = Math.Exp(z.Real) * Math.Sin(z.Imag) End Function Private Function C_COS(ByVal z As Complex) As Complex 'cos関数 C_COS.Real = 0.5 * (Math.Exp(-z.Imag) + Math.Exp(z.Imag)) * Math.Cos(z.Real) C_COS.Imag = 0.5 * (Math.Exp(-z.Imag) - Math.Exp(z.Imag)) * Math.Sin(z.Real) End Function Private Function C_SIN(ByVal z As Complex) As Complex 'sin関数 C_SIN.Real = 0.5 * (Math.Exp(-z.Imag) + Math.Exp(z.Imag)) * Math.Sin(z.Real) C_SIN.Imag = -0.5 * (Math.Exp(-z.Imag) - Math.Exp(z.Imag)) * Math.Cos(z.Real) End Function Private Function C_COSH(ByVal z As Complex) As Complex 'cosh関数 C_COSH.Real = 0.5 * (Math.Exp(z.Real) + Math.Exp(-z.Real)) * Math.Cos(z.Imag) C_COSH.Imag = 0.5 * (Math.Exp(z.Real) - Math.Exp(-z.Real)) * Math.Sin(z.Imag) End Function Private Function C_SINH(ByVal z As Complex) As Complex 'sinh関数 C_SINH.Real = 0.5 * (Math.Exp(z.Real) - Math.Exp(-z.Real)) * Math.Cos(z.Imag) C_SINH.Imag = 0.5 * (Math.Exp(z.Real) + Math.Exp(-z.Real)) * Math.Sin(z.Imag) End Function '*********************************************************** '複素数計算のための構造体宣言とFunctionプロシージャ終了 '*********************************************************** Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim z As Complex Dim z1 As Complex Dim z2 As Complex Dim z3 As Complex Dim z4 As Complex '虚数計算チェック '四則演算 '(1-i)/(1+i)=-i z1 = C_DOUBLE(1, -1) z2 = C_DOUBLE(1, 1) z = C_DIVIDED(z1, z2) Console.WriteLine(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(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(z.Real.ToString & " " & z.Imag.ToString) '平方根 'sqrt(2) z = C_SQRT(C_DOUBLE(2, 0)) Console.WriteLine(z.Real.ToString & " " & z.Imag.ToString) 'sqrt(3) z = C_SQRT(C_DOUBLE(3, 0)) Console.WriteLine(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(z.Real.ToString & " " & z.Imag.ToString & " " & Math.Cos(3 / 4 * Math.PI).ToString & " " & Math.Sin(3 / 4 * 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(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(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(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(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(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(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(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(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(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(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(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(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(z3.Real.ToString & " " & z3.Imag.ToString & " " & z4.Real.ToString & " " & z4.Imag.ToString) End Sub End Class