Комплексные числа в Delphi 7
автор evteev, Дек.29, 2009, рубрики Delphi/Pascal
Комплексные числа в Delphi 7 имеют два представления: rectanglar: Z = a + i * b, a является действительной частью, и b мнимой частью: Z = r * exp(i * phi), r является абсолютной ценностью, и phi является аргументом (угол). Вот это подразделение, которое приближается к сложным, как запись. Использовать запись двойного назначения, либо прямоугольные или полярные.
Комплексные числа в Delphi 7. Код программы
{ единицы для комплексных чисел основан на C_reords
----------------------------------------- они являются эффективными с массивами
}
unit ComplexRec;
interface
type
float = extended;
ComplexPtr = ^Complex;
Complex = record
a, b: float;
end;
function C_Copy(a: ComplexPtr): ComplexPtr; // result:=a
function C_One: ComplexPtr; // result:=1 Оба
function C_I: ComplexPtr; // result:=i Прямоугольные
function C_IP: ComplexPtr; // result:=i Поляризованные
procedure C_P2R(a: ComplexPtr); // поляризованный в прямоугольный
procedure C_R2P(a: ComplexPtr); // прямоугольный в поляризованный
function C_abs(a: ComplexPtr): float; // Прямоугольные
function C_arg(a: ComplexPtr): float; // Прямоугольные
function C_re(a: ComplexPtr): float; // Поляризованные
function C_im(a: ComplexPtr): float; // Поляризованные
procedure C_Inv(a: ComplexPtr); // a:=-a Прямоугольные
procedure C_InvP(a: ComplexPtr); // a:=-a Поляризованные
procedure C_Conj(a: ComplexPtr); // a:=konjug(a) Оба
function C_ConjN(a: ComplexPtr): ComplexPtr; //result:=konjug(a) Оба
procedure C_Scale(a: ComplexPtr; u: float); // a:=a*u;
procedure C_ScaleP(a: ComplexPtr; u: float); // a:=a*u;
procedure C_Add(a, b: ComplexPtr); //a:=a+b Прямоугольный
function C_AddN(a, b: ComplexPtr): ComplexPtr; //result:=a+b Прямоугольный
procedure C_Sub(a, b: ComplexPtr); //a:=a-b Прямоугольный
function C_SubN(a, b: ComplexPtr): ComplexPtr; //result:=a-b Прямоугольный
procedure C_Mul(a, b: ComplexPtr); //a:=a*b Прямоугольный
function C_MulN(a, b: ComplexPtr): ComplexPtr; //result:=a*b Прямоугольный
procedure C_MulP(a, b: ComplexPtr); //a:=a*b Поляризованный
function C_MulNP(a, b: ComplexPtr): ComplexPtr; //result:=a*b Поляризованный
procedure C_DivP(a, b: ComplexPtr); //a:=a/b Поляризованный
function C_DivNP(a, b: ComplexPtr): ComplexPtr; //result:=a/b Поляризованный
procedure C_Div(a, b: ComplexPtr); //a:=a/b Поляризованный
function C_DivN(a, b: ComplexPtr): ComplexPtr; //result:=a/b Поляризованный
function C_ExpN(a: ComplexPtr): ComplexPtr; // Прямоугольный
function C_LogN(a: ComplexPtr): ComplexPtr; // Поляризованный
function C_SinN(a: ComplexPtr): ComplexPtr;
function C_CosN(a: ComplexPtr): ComplexPtr;
function C_TanN(a: ComplexPtr): ComplexPtr;
function C_SinhN(a: ComplexPtr): ComplexPtr;
function C_CoshN(a: ComplexPtr): ComplexPtr;
function C_TanhN(a: ComplexPtr): ComplexPtr;
function C_IntPowerN(a: ComplexPtr; n: integer): ComplexPtr; // Прямоугольный
function C_IntPowerNP(a: ComplexPtr; n: integer): ComplexPtr; // Поляризованный
function C_ParallelN(a, b: ComplexPtr): ComplexPtr;
// result:=a//b =(a*b)/(a+b) Прямоугольный
implementation
uses math;
const
AlmostZero = 1E-30;
function C_Copy(a: ComplexPtr): ComplexPtr; // result:=a
begin
result := new(ComplexPtr);
result.a := a.a;
result.b := a.b;
end;
function C_One: ComplexPtr; // result:=1
begin
result := new(ComplexPtr);
result.a := 1;
result.b := 0;
end;
function C_I: ComplexPtr; // result:=i Прямоугольный
begin
result := new(ComplexPtr);
result.a := 0;
result.b := 1;
end;
function C_IP: ComplexPtr; // result:=i Поляризованный
begin
result := new(ComplexPtr);
result.a := 1;
result.b := pi / 2;
end;
procedure C_P2R(a: ComplexPtr);
var
t, u, v: float;
begin
t := a.a;
sincos(a.b, u, v);
a.a := t * v;
a.b := t * u;
end;
procedure C_R2P(a: ComplexPtr);
var
t: float;
begin
t := a.a;
a.a := sqrt(sqr(a.a) + sqr(a.b));
if (abs(t)0 then a.b := pi / 2
else
a.b := -pi / 2;
end
else
begin
a.b := arctan(a.b / t);
if (t < 0) then
a.b := a.b + pi;
end;
end;
function C_abs(a: ComplexPtr): float;
begin
result := sqrt(sqr(a.a) + sqr(a.b));
end;
function C_arg(a: ComplexPtr): float;
begin
if (abs(a.a)0 then result := pi / 2
else
result := -pi / 2;
end
else
begin
result := arctan(a.b / a.a);
if (a.a < 0) then
result := result + pi;
end;
end;
function C_re(a: ComplexPtr): float; // ПОЛЯРИЗОВАННЫЙ
begin
result := a.a * cos(a.b);
end;
function C_im(a: ComplexPtr): float; // ПОЛЯРИЗОВАННЫЙ
begin
result := a.a * sin(a.b);
end;
procedure C_Inv(a: ComplexPtr); // a:=-a Прямоугольный
begin
a.a := -a.a;
a.b := -a.b;
end;
procedure C_InvP(a: ComplexPtr); // a:=-a ПОЛЯРИЗОВАННЫЙ
begin
a.b := a.b + pi;
end;
procedure C_Conj(a: ComplexPtr); // a:=konjug(a) Оба
begin
a.b := -a.b;
end;
function C_ConjN(a: ComplexPtr): ComplexPtr; //result:=konjug(a) Оба
begin
result := new(ComplexPtr);
result.a := a.a;
result.b := -a.b;
end;
procedure C_Scale(a: ComplexPtr; u: float); // a:=a*u;
begin
a.a := a.a * u;
a.b := a.b * u;
end;
procedure C_ScaleP(a: ComplexPtr; u: float); // a:=a*u;
begin
a.a := a.a * u;
end;
procedure C_Add(a, b: ComplexPtr); //a:=a+b ПРЯМОУГОЛЬНЫЙ
begin
a.a := a.a + b.a;
a.b := a.b + b.b;
end;
function C_AddN(a, b: ComplexPtr): ComplexPtr; //result:=a+b ПРЯМОУГОЛЬНЫЙ
begin
result := new(ComplexPtr);
result.a := a.a + b.a;
result.b := a.b + b.b;
end;
procedure C_Sub(a, b: ComplexPtr); //a:=a-b ПРЯМОУГОЛЬНЫЙ
begin
a.a := a.a – b.a;
a.b := a.b – b.b;
end;
function C_SubN(a, b: ComplexPtr): ComplexPtr; //result:=a-b ПРЯМОУГОЛЬНЫЙ
begin
result := new(ComplexPtr);
result.a := a.a – b.a;
result.b := a.b – b.b;
end;
procedure C_Mul(a, b: ComplexPtr); //a:=a*b ПРЯМОУГОЛЬНЫЙ
var
u, v: float;
begin
u := a.a * b.a – a.b * b.b;
v := a.a * b.b + a.b * b.a;
a.a := u;
a.b := v;
end;
function C_MulN(a, b: ComplexPtr): ComplexPtr; //result:=a*b ПРЯМОУГОЛЬНЫЙ
begin
result := new(ComplexPtr);
result.a := a.a * b.a – a.b * b.b;
result.b := a.a * b.b + a.b * b.a;
end;
procedure C_MulP(a, b: ComplexPtr); //a:=a*b ПОЛЯРИЗОВАННЫЙ
begin
a.a := a.a * b.a;
a.b := a.b + b.b;
end;
function C_MulNP(a, b: ComplexPtr): ComplexPtr; //result:=a*b ПОЛЯРИЗОВАННЫЙ
begin
result := new(ComplexPtr);
result.a := a.a * b.a;
result.b := a.b + b.b;
end;
procedure C_Div(a, b: ComplexPtr); //a:=a/b ПРЯМОУГОЛЬНЫЙ
var
t: float;
begin
t := a.a / b.a + a.b / b.b;
a.b := -a.a / b.b + a.b / b.a;
a.a := t;
end;
function C_DivN(a, b: ComplexPtr): ComplexPtr; //result:=a/b ПРЯМОУГОЛЬНЫЙ
begin
result := new(ComplexPtr);
result.a := a.a / b.a + a.b / b.b;
result.b := -a.a / b.b + a.b / b.a;
end;
procedure C_DivP(a, b: ComplexPtr); //a:=a/b ПОЛЯРИЗОВАННЫЙ
begin
a.a := a.a / b.a;
a.b := a.b – b.b;
end;
function C_DivNP(a, b: ComplexPtr): ComplexPtr; //result:=a/b ПОЛЯРИЗОВАННЫЙ
begin
result := new(ComplexPtr);
result.a := a.a / b.a;
result.b := a.b – b.b;
end;
function C_ExpN(a: ComplexPtr): ComplexPtr; // RECTANGLE
begin
result := new(ComplexPtr);
result.a := exp(a.a);
result.b := a.b;
C_P2R(result);
end;
function C_LogN(a: ComplexPtr): ComplexPtr; // ПОЛЯРИЗОВАННЫЙ
begin
result := new(ComplexPtr);
result.a := ln(a.a);
result.b := a.b;
C_R2P(result);
end;
function C_SinN(a: ComplexPtr): ComplexPtr;
var
z, n, v, t: ComplexPtr;
begin
t := C_I;
v := C_MulN(a, t); // i*a
z := C_expN(a); // exp(i*a)
t := C_Copy(v);
C_Inv(t); // -i*a
t := C_ExpN(v); // exp(-i*a)
C_Sub(z, t);
n := C_I;
C_Scale(n, 2);
result := C_DivN(z, n);
dispose(z);
dispose(n);
dispose(v);
dispose(t);
end;
function C_CosN(a: ComplexPtr): ComplexPtr;
var
z, n, v, t: ComplexPtr;
begin
t := C_I;
v := C_MulN(a, t); // i*a
z := C_expN(a); // exp(i*a)
t := C_Copy(v);
C_Inv(t); // -i*a
t := C_ExpN(v); // exp(-i*a)
C_Add(z, t);
n := C_One;
C_Scale(n, 2);
result := C_DivN(z, n);
dispose(z);
dispose(n);
dispose(v);
dispose(t);
end;
function C_TanN(a: ComplexPtr): ComplexPtr;
begin
end;
function C_SinhN(a: ComplexPtr): ComplexPtr;
var
u, v, t: ComplexPtr;
begin
u := C_ExpN(a);
t := C_Copy(a);
C_inv(t);
v := C_ExpN(t);
result := C_SubN(u, v);
C_Scale(result, 1 / 2);
dispose(u);
dispose(v);
dispose(t);
end;
function C_CoshN(a: ComplexPtr): ComplexPtr;
var
u, v, t: ComplexPtr;
begin
u := C_ExpN(a);
t := C_Copy(a);
C_inv(t);
v := C_ExpN(t);
result := C_AddN(u, v);
C_Scale(result, 1 / 2);
dispose(u);
dispose(v);
dispose(t);
end;
function C_TanhN(a: ComplexPtr): ComplexPtr;
begin
end;
function C_IntPowerN(a: ComplexPtr; n: integer): ComplexPtr;
var
j: integer;
u, v: float;
begin
if n = 0 then
result := C_One
else
begin
result := C_Copy(a);
if n > 1 then
begin
C_R2P(result);
u := result.a;
v := result.b;
for j := 2 to n do
begin
u := u * result.a;
v := v + result.b;
end;
result.a := u;
result.b := v;
C_P2R(result);
end;
if n < 0 then
begin
end;
end;
end;
function C_IntPowerNP(a: ComplexPtr; n: integer): ComplexPtr;
var
j: integer;
u, v: float;
begin
result := C_Copy(a);
u := result.a;
v := result.b;
for j := 2 to n do
begin
u := u * result.a;
v := v + result.b;
end;
result.a := u;
result.b := v;
end;
function C_ParallelN(a, b: ComplexPtr): ComplexPtr;
// result:=a//b = (a*b)/(a+b)
var
z, n: ComplexPtr;
begin
z := C_MulN(a, b);
n := C_AddN(a, b);
C_R2P(n);
C_R2P(z);
result := C_DivNP(z, n);
C_P2R(result);
dispose(n);
dispose(z);
end;
end.
Мой блог о программировании находят по следующим фразам