
- •Автоматика
- •1. Управление и регулирование: основные понятия и определения
- •2. О классификации систем управления
- •3. Физические основы измерительных преобразователей автоматических систем
- •3.1. Физика преобразователей температуры
- •3.2. Физика измерения усилий
- •3.3. Методы измерения параметров движения
- •3.4. Физические основы измерения состава и концентрации вещества
- •4. Основные задачи исследования автоматических систем
- •5. Операционное исчисление и его применение к исследованию динамики стационарных линейных систем
- •5.1. Общие сведения
- •5.2. Решение линейных уравнений с постоянными коэффициентами
- •6. Передаточные функции линейных динамических систем
- •7. Частотные характеристики линейных динамических систем
- •8. Введение в теорию устойчивости линейных стационарных систем авторегулирования
- •9. О качественном анализе динамических систем
- •10. О проблеме оптимального управления
- •11. Динамическое программирование как математический метод решения задач оптимального управления
- •12. Лабораторный практикум по компьютерному моделированию линейных стационарных динамических систем операторным методом
- •12.1. Введение
- •12.2. Лабораторная работа №1
- •12.3. Лабораторная работа №2
- •12.4. Лабораторная работа №3
- •12.5. Лабораторная работа №4
- •12.6. Лабораторная работа №5
- •12.7. Лабораторная работа №6
- •12.8. Лабораторная работа №7
- •13. Программная реализация операторного метода анализа динамики линейных систем
- •13.1.1. Класс линейных дифуравнений с постоянными коэффициентами
- •13.1.2. Форма основной программы
- •13.1.3. Модуль основной программы
- •13.1.4. Форма ввода данных
- •13.1.5. Заголовочный файл модуля ввода данных
- •13.1.6. Модуль ввода данных
- •13.1.7. Заголовочный файл инициализационного модуля
- •13.1.8. Инициализационный модуль
- •13.1.9. Файл проекта
- •13.2. Исходные тексты программы на языке Object Pascal, выполненной в среде Delphi 4
- •13.2.1. Форма изменения размеров пера
- •13.2.2. Модуль изменения размеров пера
- •13.2.3. Форма ввода данных
- •13.2.4. Модуль ввода данных
- •13.2.5. Форма основной программы
- •13.2.6. Модуль основной программы
- •13.2.7. Форма сведений о программе
- •13.2.8. Модуль сведений о программе
- •13.2.9. Файл конфигурации
- •13.2.10. Файл проекта
- •14. Приложения
- •14.1.1. Базовый класс параметризованных векторов
- •14.1.2. Параметризованный класс матриц
- •14.1.3. Параметризованный класс полиномов
- •14.1.4. Класс полиномиальных уравнений
- •14.2. Математические классы на объектном Паскале
- •14.2.1. Класс комплексных чисел
- •14.2.2. Класс действительных векторов
- •14.2.3. Класс комплексных векторов
- •14.2.4. Класс действительных матриц
- •14.2.5. Класс комплексных матриц
- •14.2.6. Класс полиномов
- •Литература
- •Автоматика
- •324050, Кривой Рог-50, пр. Металлургов, 28.
14.2.5. Класс комплексных матриц
//T_CMATRIX.PAS
unit T_CMatrix;
interface
uses T_CVector,T_Complex;
type
TCMatrix=class(TCVector) {<-- Класс комплексных матриц (наследник от комплексных векторов)}
Row,Col:integer; //<-- Кол-во строк и столбцов
Matrix:array of CVector; //<-- Сама матрица
procedure SetDim(m,n:integer);
//<-- Установка размерности матрицы
constructor CMCreate(m,n:integer);
//<-- Создание матрицы m x n
private
protected
public
{Внутренние ф-ции}
function CMultMatOnDig(c:TComplex):TCMatrix;virtual;
//<-- Умножение матрицы на комплексное число
function CMTransp:TCMatrix;virtual;
//<-- Транспонирование матрицы
published
end;
{Внешние ф-ции}
function CMSumma(m1,m2:TCMatrix):TCMatrix;far; //<-- Сумма матриц
function CMRazn(m1,m2:TCMatrix):TCMatrix;far; //<-- Разность матриц
function CMMult(m1,m2:TCMatrix):TCMatrix;far; //<-- Произведение матриц
function CMEquiv(m1,m2:TCMatrix):Boolean;far; //<-- Сравнение матриц
implementation
constructor TCMatrix.CMCreate(m,n:integer);
// Создание матрицы
var i,j:integer;
begin
inherited Create; // Конструктор предка
SetDim(m,n);
// Вызываем наш метод установки размерности матрицы
for i:=0 to row-1 do
for j:=0 to col-1 do matrix[i,j]:=complex(0,0); // Сразу заносим нули
end;
procedure TCMatrix.SetDim(m,n:integer);
// Метод установки размерности матрицы
var i:integer;
begin
setlength(matrix,m);
for i:=0 to m-1 do setlength(matrix[i],n);
row:=m;
col:=n;
end;
function TCMatrix.CMultMatOnDig(c:TComplex): TCMatrix; // Умножение матрицы на комплексное число
var i,j:integer;temp:TCMatrix;
begin
temp:=TCMatrix.CMCreate(row,col);
// Создаём экземпляр объекта TCMatrix
for i:=0 to row-1 do
for j:=0 to col-1 do
begin
temp.matrix[i,j]:=CMult(matrix[i,j],c);
end;
result:=temp;
end;
function TCMatrix.CMTransp:TCMatrix;
// Транспонирование
var i,j:integer;temp:TCMatrix;
begin
temp:=TCMatrix.CMCreate(row,col);
for i:=0 to row-1 do
for j:=0 to col-1 do
temp.matrix[i,j]:=matrix[j,i];
result:=temp;
end;
function CMSumma(m1,m2:TCMatrix):TCMatrix;
var i:integer;temp:TCMatrix;
begin
if (m1.row<>m2.row) or (m1.col<>m2.col) then
// Если матрицы разных размеров
begin
result:=TCMatrix.CMCreate(0,0);
// результат - матрица нулевых размеров.
exit;
end;
// иначе
temp:=TCMatrix.CMCreate(m1.row,m1.col);
for i:=0 to m1.row-1 do
temp.matrix[i]:=CVSumma(m1.matrix[i],m2.matrix[i]);
result:=temp;
end;
function CMRazn(m1,m2:TCMatrix):TCMatrix;
var i:integer;temp:TCMatrix;
begin
if (m1.row<>m2.row) or (m1.col<>m2.col) then
// Если матрицы разных размеров
begin
result:=TCMatrix.CMCreate(0,0);
// результат - матрица нулевых размеров
exit;
end;
// иначе
temp:=TCMatrix.CMCreate(m1.row,m1.col);
for i:=0 to m1.row-1 do
temp.matrix[i]:=CVRazn(m1.matrix[i],m2.matrix[i]);
result:=temp;
end;
function CMMult(m1,m2:TCMatrix):TCMatrix;
var i,j,k:integer;temp:TCMatrix;
s:TComplex;
begin
if (m1.col<>m2.row) then
// Если матрицы разных размеров
begin
result:=TCMatrix.CMCreate(0,0);
// результат - матрица нулевых размеров
exit;
end;
// иначе
temp:=TCMatrix.CMCreate(m1.row,m2.col);
for i:=0 to m1.row-1 do
for j:=0 to m2.col-1 do begin
s:=Complex(0,0);
for k:=0 to m1.col-1 do s:=CSumma(s,CMult(m1.matrix[i,k],m2.matrix[k,j]));
temp.matrix[i,j]:=s;
end;
result:=temp;
end;
function CMEquiv(m1,m2:TCMatrix):Boolean;
// Сравнение матриц
var i:integer;
begin
result:=true;
if (m1.row<>m2.row) or (m1.col<>m2.col) then begin result:=false;exit end;
for i:=0 to m1.row do
if not CVEquiv(m1.matrix[i],m2.matrix[i]) then result:=false; // Используем сравнение векторов
end;
// End File !!!!!
end.