Смекни!
smekni.com

Прямой метод вращения векового определителя (стр. 2 из 2)

Теорема. Характеристический определитель исходной и подобной матрицы совпадают .

Доказательство.

Идея метода Данилевского состоит в том, что матрица А подобным преобразованиям приводится, к так называемой нормальной форме Фробениуса

.

Теорема. Пусть

є есть собственное значение , а
есть соответствующий собственный вектор матрицы Р , которая подобна матрице А ,т.е.

Тогда

есть собственный вектор матрицы А , соответствующий собственному значению

Доказательство.Тривиально следует из того, что

Домножая левую и правую часть этого равенства слева на S , имеем

А это и означает, что
-собственный вектор матрицы А , отвечающий собственному значению

Описание входных и выходных данных

Входные параметры:

Квадратная матрица порядка n*n. Рекомендуется, чтобы она была хорошо обусловлена.

Выходные параметры:

Получаем коэффициенты при степенях

характеристического полинома. Решая данное уравнение получаем собственные значения исходной матрицы. Следующим шагом является определение собственных векторов.

.

Заключение

Обозначим некоторые выводы по проделанной работе:

Во время освоения данного метода мы не могли пропустить некоторые минусы метода Данилевского:

- Погрешность накапливается со скоростью геометрической прогрессии.

- Приходится решать достаточно сложное уравнение порядка n (если решать с помощью приближенных метод, снова получаем некоторую погрешность)

- В программном варианте используются достаточно большие объемы оперативной памяти, к примеру, приходится хранить до 4 матриц порядка n*n.

Но так же нельзя не остановиться на очевидных плюсах метода:

- Метод удобен для нахождения собственных векторов практически любой матрицы. Рекомендуется рассматривать матрицы меньше порядка нескольких десятков.

- Данный метод очень удобен в программировании (на этапе разработки ПО проблем практически не возникало).

В целом метод все-таки не рекомендуется для решения задач, требующих высоких точностей. Но из-за своей простоты, и высокой скорости, подходит для больших массивов, не требующих отсутствие погрешности.

Список литературы

1. Основы численных методов: Учебник для вузов/ В.М. Вержбицкий. – М.: Высш. Шк., 2002. – 840 с.: ил.

2. Высшая математика для экономистов: Учебник для вузов/ Н.Ш. Кремер, Б.А. Путко, И.М. Тришин, М.Н. Фридман; Под ред. проф. Н.Ш. Кремера. – 2-е изд., перераб. и доп. – М.: ЮНИТИ, 2004. – 471 с.

3. Интернет.

4. Библия Delphi/ М.Е. Фленов – СПб.: БХВ-Петербург, 2005. – 880 с.: ил.

Приложение А

unit MainUnit;

interface

uses

Windows, …, Buttons;

type

Matrix = array of array of real;

TForm1 = class(TForm)

private

{ Private declarations }

// Процедура "перестановки" матрицы, возвращает true если все хорошо

function Remove(Var rez: Matrix; i: integer): boolean;

// Умножение 2-х матриц

procedure Multiple(a,b:Matrix; Var rez: Matrix);

// Возвращение решений

function FindDet(Var a:Matrix):string;

// Обнуление матриц

procedure Zero(Var a:Matrix);

public

{ Public declarations }

end;

var Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.FindDet(Var a: Matrix):string;

Var i,j : integer;

M,Mob,bac : Matrix;

flag : boolean;

begin

SetLength(M,Length(a[1]),Length(a[1]));

SetLength(Mob,Length(a[1]),Length(a[1]));

SetLength(bac,Length(a[1]),Length(a[1]));

flag:=true;

for i:=Length(a[1])-2 downto 0 do

// Построение матриц

BEGIN

// Обработка случая 2.1

if (a[i+1,i]=0) and (not Remove(a,i)) then

begin

// Если ничего не помогло

flag:=false;

Break;

end;

// Обнуление всех матриц

Zero(M); Zero(Mob); Zero(bac);

// Построение матриц М

for j:=0 to Length(a[i])-1 do

begin

Mob[j,j]:=1;

Mob[i,j]:=a[i+1,j];

M[j,j]:=1;

M[i,j]:=-Mob[i,j]/a[i+1,i];

if i=j then M[i,j]:=1/a[i+1,i];

end;

// Умножение матрицы А на М

Multiple(a,M,bac); // A*M

Multiple(Mob,bac,a); // M^(-1)*(A*M)

END;

// Обработка случая 2.2, если надо

if not flag then

begin

M:=nil;

Mob:=nil;

// Находим матрицу С и выводим ее коэффициенты

SetLength(bac,1,length(a)-i-1);

for j:=i+1 to length(a)-1 do bac[0,j-i-1]:=a[i,j]; // Матрица C

Result:='('+FloatToStrF(bac[0,0],ffFixed,10,3);

for i:=1 to Length(bac)-1 do

Result:=Result+','+FloatToStrF(bac[0,i],ffFixed,10,3);

Result:=Result+'),';

// "Урезаем" матрицу А до состояния B, см. 2.2 пункт алгоритма

SetLength(a,i+1,i+1);

// Вызываем рекурсивно процедуру

Result:=Result+FindDet(a);

end

else begin

Result:='('+FloatToStrF(a[0,0],ffFixed,10,3);

for i:=1 to Length(a)-1 do

Result:=Result+','+FloatToStrF(a[0,i],ffFixed,10,3);

Result:=Result+')';

end;

bac:=nil;

end;

procedure TForm1.bbPlusClick(Sender: TObject);

begin

sgInData.ColCount:=sgInData.ColCount+1;

sgInData.RowCount:=sgInData.RowCount+1;

if sgInData.ColCount=11 then ShowMessage('Attention!!! Полученные результаты имеют малую точность');

end;

procedure TForm1.bbMinusClick(Sender: TObject);

begin

if sgInData.ColCount<3 then Exit;

sgInData.ColCount:=sgInData.ColCount-1;

sgInData.RowCount:=sgInData.RowCount-1;

end;

procedure TForm1.bbOpenClick(Sender: TObject);

Var k : real;

f : textfile;

a,i,j : integer;

begin

OpenDialog1.Filter:='Все файлы (*.*)|*.*| Файлы .txt (*.txt)|*.TXT';

OpenDialog1.Title:='Выбор файла для этой проги';

OpenDialog1.FilterIndex:=2;

if OpenDialog1.Execute then

begin

AssignFile(f,OpenDialog1.FileName);

Reset(f);

end

else Exit;

ReadLn(f,a);

sgInData.ColCount:=a;

sgIndata.RowCount:=a;

for i:=0 to a-1 do

begin

for j:=0 to a-1 do

begin

Read(f,k);

sgIndata.Cells[j,i]:=FloattoStr(k);

end;

ReadLn(f);

end;

CloseFile(f);

end;

procedure TForm1.bbFindClick(Sender: TObject);

Var a :matrix;

i,j :integer;

begin

try

SetLength(a,sgInData.ColCount,sgInData.RowCount);

for i:=0 to sgInData.RowCount-1 do

for j:=0 to sgInData.RowCount-1 do a[i,j]:=StrToFloat(sgInData.Cells[j,i]);

except

begin

a:=nil;

ShowMessage('STOP! Неправильный ввод, проверьте входные данные');

Exit;

end;

end;

OutData.Clear;

OutData.Lines.Add('Коэффициенты характеристического уравнения');

OutData.Lines.Add(FindDet(a));

a:=nil;

end;

procedure TForm1.Multiple(a, b: Matrix; var rez: Matrix);

var i,k,j : word;

Begin

for i:=0 to Length(a[1])-1 do

for k:=0 to Length(a[1])-1 do

begin

// Обновление занятых матриц

rez[i,k]:=0;

for j:=0 to Length(a[1])-1 do rez[i,k]:=rez[i,k]+a[i,j]*b[j,k];

end;

end;

function TForm1.Remove(var rez: Matrix; i: integer): boolean;

Var j,k : integer;

E,bac : Matrix;

begin

Result:=false;

for k:=0 to i-1 do // Ищем ненулевой элемент слева

if rez[i+1,k]<>0 then

begin

Result:=true;

Break;

end;

if not Result then Exit;

SetLength(E,Length(rez[1]),Length(rez[1]));

SetLength(bac,Length(rez[1]),Length(rez[1]));

for j:=0 to Length(rez[1])-1 do E[j,j]:=1;

for j:=0 to Length(rez[1])-1 do

begin

// Меняем две строки местами в матрице E

E[i,j]:=-E[i,j]-E[k,j];

E[k,j]:=-E[i,j]-E[k,j];

E[i,j]:=-E[i,j]-E[k,j];

end;

Multiple(rez,E,bac); // A*M

Multiple(E,bac,rez); // M^(-1)*(A*M)

E:=nil;

bac:=nil;

end;

procedure TForm1.Zero(var a: Matrix);

Var i,j: integer;

begin

for i:=0 to Length(a)-1 do

for j:=0 to Length(a[0])-1 do a[i,j]:=0;

end;

end.

Приложение Б

Результаты работы программы с теми же входными данными:

Рис 1.

Приложение Б

(продолжение)

Результаты работы программы с теми же входными данными:

Рис 2.