2 {* This unit contains functins for working with complex numbers. To use with
3 KOL library and its kolmath.pas unit instead of standard math.pas, define
4 synmbol KOL in project options, or uncomment its definition below. }
16 uses {$IFDEF KOL} kolmath
, kol
{$ELSE} math
, sysutils
{$ENDIF};
19 Complex
= record Re
, Im
: double end;
22 function CfromReIm( Re
, Im
: Double ): Complex
;
25 function Cadd( const X
, Y
: Complex
): Complex
;
28 function Cneg( const X
: Complex
): Complex
;
31 function Csub( const X
, Y
: Complex
): Complex
;
34 function Cmul( const X
, Y
: Complex
): Complex
;
37 function CmulD( const X
: Complex
; D
: Double ): Complex
;
40 function CmulI( const X
: Complex
): Complex
;
43 function Cdiv( const X
, Y
: Complex
): Complex
;
46 function Cmod( const X
: Complex
): Double;
47 {* Q( X.Re^2 + X.Im^2 ) }
49 function Carg( const X
: Complex
): Double;
50 {* arctg( X.Im / X.Re ) }
52 function CfromModArg( R
, Arg
: Double ): Complex
;
53 {* R * ( cos Arg + i * sin Arg ) }
55 function Cpow( const X
: Complex
; Pow
: Double ): Complex
;
58 function Csqrt( const X
: Complex
): Complex
;
61 function Cexp( const X
: Complex
): Complex
;
64 function Cln( const X
: Complex
): Complex
;
67 function Ccos( const X
: Complex
): Complex
;
70 function Csin( const X
: Complex
): Complex
;
73 function C2Str( const X
: Complex
): String;
76 function C2StrEx( const X
: Complex
): String;
81 function CfromReIm( Re
, Im
: Double ): Complex
;
87 function Cadd( const X
, Y
: Complex
): Complex
;
89 Result
.Re
:= X
.Re
+ Y
.Re
;
90 Result
.Im
:= X
.Im
+ Y
.Im
;
93 function Cneg( const X
: Complex
): Complex
;
99 function Csub( const X
, Y
: Complex
): Complex
;
101 Result
:= Cadd( X
, Cneg( Y
) );
104 function Cmul( const X
, Y
: Complex
): Complex
;
106 Result
.Re
:= X
.Re
* Y
.Re
- X
.Im
* Y
.Im
;
107 Result
.Im
:= X
.Re
* Y
.Im
+ X
.Im
* Y
.Re
;
110 function CmulD( const X
: Complex
; D
: Double ): Complex
;
112 Result
.Re
:= X
.Re
* D
;
113 Result
.Im
:= X
.Im
* D
;
116 function CmulI( const X
: Complex
): Complex
;
122 function Cdiv( const X
, Y
: Complex
): Complex
;
125 Z
:= 1.0 / ( Y
.Re
* Y
.Re
+ Y
.Im
* Y
.Im
);
126 Result
.Re
:= (X
.Re
* Y
.Re
+ X
.Im
* Y
.Im
) * Z
;
127 Result
.Im
:= (X
.Im
* Y
.Re
- X
.Re
* Y
.Im
) * Z
;
130 function Cmod( const X
: Complex
): Double;
132 Result
:= sqrt( X
.Re
* X
.Re
+ X
.Im
* X
.Im
);
135 function Carg( const X
: Complex
): Double;
137 Result
:= ArcTan2( X
.Im
, X
.Re
);
140 function CfromModArg( R
, Arg
: Double ): Complex
;
142 Result
.Re
:= R
* cos( Arg
);
143 Result
.Im
:= R
* sin( Arg
);
146 function Cpow( const X
: Complex
; Pow
: Double ): Complex
;
149 R
:= power( Cmod( X
), Pow
);
150 A
:= Pow
* Carg( X
);
151 Result
:= CfromModArg( R
, A
);
154 function Csqrt( const X
: Complex
): Complex
;
156 Result
:= Cpow( X
, 0.5 );
159 function Cexp( const X
: Complex
): Complex
;
163 Result
.Re
:= Z
* cos( X
.Im
);
164 Result
.Im
:= Z
* sin( X
.Im
);
167 function Cln( const X
: Complex
): Complex
;
169 Result
:= CfromModArg( ln( Cmod( X
) ), Carg( X
) );
172 function Ccos( const X
: Complex
): Complex
;
174 Result
:= CmulI( X
);
175 Result
:= CmulD( Cadd( Cexp( Result
), Cexp( Cneg( Result
) ) ),
179 function Csin( const X
: Complex
): Complex
;
181 Result
:= CmulI( X
);
182 Result
:= CmulD( Csub( Cexp(Result
), Cexp( Cneg(Result
) ) ),
187 function Abs( X
: Double ): Double;
194 function Double2Str( D
: Double ): String;
196 Result
:= DoubleToStr( D
);
200 function C2Str( const X
: Complex
): String;
202 if Abs( X
.Im
) < 1e-307 then
204 Result
:= Double2Str( X
.Re
);
209 if Abs( X
.Re
) > 1e-307 then
211 Result
:= Double2Str( X
.Re
);
213 Result
:= Result
+ ' + ';
216 Result
:= Result
+ '- i * ' + Double2Str( -X
.Im
)
218 Result
:= Result
+ 'i * ' + Double2Str( X
.Im
);
222 function C2StrEx( const X
: Complex
): String;
224 if Abs( X
.Im
) < 1e-307 then
226 Result
:= Double2StrEx( X
.Re
);
231 if Abs( X
.Re
) > 1e-307 then
233 Result
:= Double2StrEx( X
.Re
);
235 Result
:= Result
+ ' + ';
238 Result
:= Result
+ '- i * ' + Double2StrEx( -X
.Im
)
240 Result
:= Result
+ 'i * ' + Double2StrEx( X
.Im
);