Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Класс комплексных векторов

Модуль ввода данных | Форма основной программы | Модуль основной программы | Форма сведений о программе | Модуль сведений о программе | Базовый класс параметризованных векторов | Параметризованный класс матриц | Параметризованный класс полиномов | Класс полиномиальных уравнений | Класс комплексных чисел |


Читайте также:
  1. DSM — система классификации Американской психиатрической ассоциации
  2. I. Вступительное слово классного руководителя.
  3. I. Классификация факторов, формирующих ПП
  4. I. Конфликты в межличностных отношениях. Классификация конфликтов
  5. I. Понятие и классификация ощущений, их значение в теории ПП. Роль восприятия в маркетинге
  6. I.2.2) Классификация юридических норм.
  7. II. КЛАССИФИКАЦИЯ ИНСТИТУТОВ

//T_CVECTOR.PAS

 

 

unit T_CVector;

 

interface

 

uses T_Complex,// Модуль комплексных чисел

dialogs; // Стандартный модуль диалоговых окон

 

type

CVector=array of TComplex; /* Тип: динамический вектор комплексных чисел */

 

TCVector = class // Класс комплексного вектора

len:integer; // Длина вектора

Vector:CVector; // Сам вектор

procedure SetLen(l:integer);virtual; //Установка длины вектора

constructor CVCreate(l:integer); /* Создание вектора длины l*/

 

private

 

protected

 

public

// Внутренние ф-ции

function CVMultOnDig(d:TComplex): TCVector;virtual; { <-- ф-ция - Умножение вектора на комплексное число (действительное число - это комлексное число с нулевой мнимой частью: complex(dig,0)) }

 

function CVNormir:TCVector;virtual; { Нормирование вектора}

function CVModul:TComplex;virtual; {Модуль вектора}

Procedure Revers;virtual; // Реверсирование

published

 

end;

{Внешние ф-ции (директивой far избавимся от написания методов в указаном порядке) }

function CVOptimize(c:CVector):CVector;far; { Отбрасывание ведущих нулей и приведение к 0 с точностью 1е-8}

function CVSumma(v1,v2:CVector):CVector;far;

// Сумма векторов

function CVRazn(v1,v2:CVector):CVector;far;

// Разность векторов

function CVMult(v1,v2:CVector):CVector;far;

// Умножение векторов

function CVScalarMult(v1,v2:CVector): TComplex;far; // Скалярное произведение

function CVEquiv(v1,v2:cvector):boolean;far;

// Сравнение векторов

procedure MessageBox(s:string);far; {Просто сообщение}

implementation

 

 

procedure TCVector.Revers;//Реверсирование вектора

var res:Cvector;

i,j:integer;

begin

setlength(res,len);

for j:=0 to len-1 do res[j]:=vector[j];

for i:=0 to len-1 do vector[i]:=res[abs(len-i-1)];

end;

 

function CVOptimize(c:CVector):CVector; {Отбрасывание ведущих нулей и приведение к 0 с точностью 1е-8}

var i:integer;res:CVector;

begin

res:=c;

for i:=0 to high(c) do begin

if abs(res[i].re)<=1e-8 then res[i].re:=0;

if abs(res[i].im)<=1e-8 then res[i].im:=0;

end;

result:=res;

end;

 

procedure MessageBox(s:string);

begin

MessageDlg(s,mtInformation,[mbOk],1); // Без слов

end;

 

function CVEquiv(v1,v2:cvector):boolean; {Сравнение векторов}

var i:integer;

begin

result:=true;

if high(v1)<>high(v2) then begin result:=false;exit end;

for i:=0 to high(v1) do

if not CEquiv(v1[i],v2[i]) then result:=false;

end;

 

procedure TCVector.SetLen(l:integer);

begin

setlength(vector,l); {Устанавливаем вектору vector длину l}

len:=l;

end;

 

function TCVector.CVMultOnDig(d:TComplex):TCVector;

var t:TCVector;i:integer;

begin

t:=TCVector.CVCreate(len);

for i:=0 to len-1 do t.Vector[i]:=CMult(Vector[i],d);{ Вызов процедуры произведения комплексных чисел (из модуля T_Copmlex) }

result:=t;

end;

 

constructor TCVector.CVCreate(l:integer);

// Создаём вектор длины l

var i:integer;

begin

inherited Create; // Конструктор предка

setlen(l); // Наша ф-ция установки длинны

for i:=0 to len-1 do vector[i]:=Complex(0,0);

// Сразу заполняем нулями

end;

 

function TCVector.CVModul:TComplex;//Модуль вектора

var tt:TComplex;i:integer;

begin

tt:=Complex(0,0);

{Возведение каждого элемента вектора в квадрат}

for i:=0 to len-1 do tt:=CSumma(tt,CPow(vector[i],2));

{Сумма элементов вектора}

result:=CPow(tt,0.5); // SQRT(tt)

end;

 

function CVSumma(v1,v2:CVector):CVector;

//Сумма векторов

var i:integer;d:CVector;

begin

if high(v1)>high(v2) then begin

setlength(d,high(v1)+1); { Устанавливаем размер по наибольшей длине }

for i:=0 to high(v2) do

d[i]:=CSumma(v1[i],v2[i]); { Заносим в вектор-результат значения суммы }

for i:=high(v2)+1 to high(v1) do d[i]:=v1[i];

// Переписываем что осталось

end else

begin

setlength(d,high(v2)+1); { Устанавливаем размер по наибольшей длине}

for i:=0 to high(v1) do d[i]:=CSumma(v1[i],v2[i]); // Заносим в вектор-результат значения суммы

for i:=high(v1)+1 to high(v2) do d[i]:=v2[i];

// Переписываем что осталось

end;

result:=d;

end;

 

function CVRazn(v1,v2:CVector):CVector;

// Разность векторов

var i:integer;d:CVector;

begin

// Аналогичные действия

 

if high(v1)>high(v2) then begin

setlength(d,high(v1)+1);

for i:=0 to high(v2) do d[i]:=CRazn(v1[i],v2[i]);

for i:=high(v2)+1 to high(v1) do d[i]:=v1[i];

end else

begin

setlength(d,high(v2)+1);

for i:=0 to high(v1) do d[i]:=CRazn(v1[i],v2[i]);

for i:=high(v1)+1 to high(v2) do d[i]:=CMultOnDig(v2[i],-1);

end;

result:=d;

end;

 

function CVMult(v1,v2:CVector):CVector;

// Произведение векторов

var i:integer;d:CVector;

begin

setlength(d,high(v1)+1);

for i:=0 to high(v1) do d[i]:=CMult(v1[i],v2[i]);

result:=d;

end;

 

function CVScalarMult(v1,v2:CVector):TComplex;

var d:cvector;tt,n1,n2:tcomplex;i:integer;

tc:TCVector;

begin

if high(v1)=high(v2) then begin

tc:=TCVector.CVCreate(high(v1)+1);

tt:=Complex(0,0);

d:=CVMult(v1,v2);

for i:=0 to high(d) do tt:=CSumma(tt,d[i]);

tc.vector:=v1;n1:=tc.CVModul;

tc.vector:=v2;n2:=tc.CVModul;

if (((n1.re=0) and (n1.im=0)) or((n2.re=0) and (n2.im=0))) then begin

MessageBox('Один из векторов нулевой;(Модуль T_CVector)');

result:=complex(0,0);

exit;

end;

result:=CDiv(tt,CMult(n1,n2));

tc.Free;

end else result:=complex(0,0);

exit;

end;

 

function TCVector.CVNormir:TCvector;

// Нормирование вектора

var t:TCVector;tt:TComplex;i:integer;

begin

t:=TCVector.CVCreate(len);

t.vector:=vector;

tt:=t.CVModul;

for i:=0 to len-1 do

t.Vector[i]:=CDiv(t.Vector[i],tt);{ Деление каждого элемента вектора на модуль вектора}

result:=t;

end;

 

//End file.

end.


Дата добавления: 2015-07-25; просмотров: 36 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Класс действительных векторов| Класс действительных матриц

mybiblioteka.su - 2015-2024 год. (0.013 сек.)