Автор работы: Пользователь скрыл имя, 18 Января 2012 в 19:45, курсовая работа
Задачи нахождения собственных значений и соответствующих им собственных векторов возникают в самых различных научных задачах. Например, при анализе динамических систем собственные значения определяют частоты колебаний, а собственные векторы характеризуют их форму. В электро-радиотехнических устройствах собственные значения матриц определяют характеристические постоянные времени и режимы работы этих устройств.
1 Собственные значения и собственные векторы…………………………………..6
1.1 Математическое обоснование метода………………………………………6
1.2 Метод итераци..………………………………………………………………..8
1.3 Метод Леверрье-Фаддеева…………………………………………………...9
1.3.1 Основные пункты алгоритма метода Леверрье-Фаддеева.…….10
1.4 Численное решение задачи нахождения собственных значений матриц методом Леверрье-Фаддеева….…………………………………………….10
2 Приложение…………………………………………………………………………..13
2.1 Структурная схема алгоритма метода Леверрье-Фаддеев..……………13
2.2 Листинг программы…………………………………………………………16
var Ya,Yb,Yk:real;
Xk,Xn:real;
k:integer;
begin
Ya:=f(x1,i,PVec,Range);
Yb:=f(x2,i,PVec,Range);
Y:=F_deriv(x1,i,PVec,Range);{
if Ya*Y>0 then
begin
Xk:=x1;Yk:=Ya;X:=x2; Y:=Yb;
end
else
begin
Xk:=x2;Yk:=Yb; X:=x1;Y:=Ya;
end;
repeat
Xn:=X;X:=Xn-(Y/(Y-Yk))*(Xn-Xk)
Y:=f(X,i,PVec,Range);
until abs(X-Xk)>=eps;
end;
//Реализация метода уединения и уточнения коренй посредством метода хорд
procedure Root_limit(var alpha,beta:real;var LVec:TVec;var RootNum:integer;
i,Range:integer;PVec:TVec);
const step_h=0.09;
var
x1,x2,y1,y2:real;
Ya,Yb,Yk,Y:real;
Xk,Xn,X:real;
eps:real;
k:integer;
begin
k:=0;
x1:=alpha;
x2:=x1+step_h;
y1:=f(x1,i,PVec,Range);
while x2<beta do
begin
y2:=f(x2,i,PVec,Range);
if y1*y2<0 then
begin
//Корень лежит в этих пределах:x1,x2
//Процедура уточнения
корней характеристического
ChordMethood(X,Y,x1,x2,eps,i,
LVec[k]:=X;
//считаем число
корней характеристического
inc(k);
Form2.Memo1.Lines.Add('Lambda' + IntToStr(k) +
end
else
x1:=x2;
x2:=x1+step_h;
y1:=y2;
end;
RootNum:=k;//Число
действительных корней
end;
//============================
procedure TForm2.Button1Click(Sender: TObject);
var buf:string;
begin
Pn:=0;
Pk:=0;
SpEdV:=SpinEdit1.Value;
Range:=SpEdV;
//определяем размерности матриц
SetLength(AMatrix,SpEdV,SpEdV)
SetLength(BMatrix,SpEdV,SpEdV)
SetLength(CEquival,SpEdV,
SetLength(VMatrix,SpEdV,SpEdV)
//вектор коэффициентов характеристического уравнения
SetLength(PVec,SpEdV);
//считываем исходную матрицу
InputMatrix(AMatrix,Range);
{=============================
PlotSameMatrix(CEquival,
{Блок вычисления
коэффицентов
for k:=1 to Range-1 do
begin
Pk:=Trace(Range,AMatrix)/k; {Pk - коэффицент характкристич. уравнения}
PVec[k-1]:=Pk;//матрица коэффицентов характеристического уравненя
//выводим Pk
Memo1.Lines.Add('Коэффициент
Memo1.Lines.Add('Pk_'+ IntToStr(k) + '='+ FloatToStr(Pk));
//считаем промежуточную матрицу
VInter(VMatrix,BMatrix,
AConsistance(AMatrix,CEquival,
Memo1.Lines.Add('Матрица А' + IntToStr(k+1));
end;
Pn:=Trace(Range,AMatrix)/
PVec[k-1]:=Pn; //Вектор параметров P
Memo1.Lines.Add('Pk_' + IntToStr(Range) + '=' + FloatToStr(Pn));
Memo1.Lines.Add('Вектор параметров Р');
buf:='';
for i:= 1 to Range do
buf:=buf + FloatToStr(PVec[i-1]) + ' ';
Memo1.Lines.Add(buf);
//==================Блок вычисления собственных чисел матрицы===================
Label2.Visible:=true;
Label3.Visible:=true;
Edit1.Visible:=true;
Edit2.Visible:=true;
Button3.Visible:=true;
Button1.Visible:=false;
Form2.Memo1.Lines.Add('Ведите
пределы, в которых
end;
procedure TForm2.Button2Click(Sender: TObject);
begin
Form2.Close;
end;
procedure TForm2.Button3Click(Sender: TObject);
var y:TVec;//начально-свободный вектор y(k)
y2:TVec;//y(k+1)
ybuf:TVec;
nv:TVec;//собственный вектор
buf:real;
flag:boolean;
cn:integer;
begin
if (Edit1.Text<>'') and (Edit2.Text<>'') then
begin
alpha:=StrToFloat(Edit1.Text);
beta:=StrToFloat(Edit2.Text);
eps:=0.0001;
SetLength(LVec,SpEdV);
//считаем вектор собственных чисел матрицы
Root_limit(alpha,beta,LVec,
//выводим собственный вектор
StringGrid2.ColCount:=RootNum;
StringGrid2.RowCount:=0;
for k:=0 to RootNum-1 do
begin
StringGrid2.Cells[k,0]:=
end;
SetLength(y,Range);
SetLength(nv,Range);
SetLength(y2,Range);
SetLength(ybuf,Range);
//выбираем начально-свободный вектор y(0)=(1,1,1)
for i:=0 to Range - 1 do
y[i]:=1;
//заново вводим матрицу, исключая возможность работы с измененной начальной
//матрицей
InputMatrix(AMatrix,Range);
//умножаем А на y(0)
flag:=false;
cn:=1;
repeat
//Вычисляем y(1)=A * y(0)
for i:=0 to Range - 1 do
begin
buf:=0;
for j:=0 to Range - 1 do
begin
buf:=buf+AMatrix[i,j]*y[j]
end;
nv[i]:=buf;
y2[i]:=nv[i]/y[i];
end;
//проверяем равенство чисел вектора y2 с точностю до двух чисел после запятой
for cn:=0 to Range - 1 do ybuf[cn]:=trunc(y2[cn]*100);
for cn:=0
to Range-2 do if ybuf[cn]=ybuf[cn+1] then flag:=true;
if flag=False then
begin
for i:=0 to Range - 1 do y[i]:=nv[i];
end;
inc(cn);
until flag=true;
for i:=0 to Range - 1 do
StringGrid2.Cells[i,0]:=
end
else ShowMessage('Пределы
не введены!');
end;
procedure TForm2.Button4Click(Sender: TObject);
var i:integer;
begin
Memo1.Clear;
Label2.Visible:=False;
Label3.Visible:=False;
Edit1.Visible:=False;
Edit2.Visible:=False;
Button3.Visible:=False;
Button1.Visible:=True;
Edit1.Text:='';
Edit2.Text:='';
SpinEdit1.Value:=1;
StringGrid1.ColCount:=5;
StringGrid1.RowCount:=5;
StringGrid2.ColCount:=5;
StringGrid2.RowCount:=0;
for i := 0 to 4 do
for j:=0 to
4 do StringGrid1.Cells[i,j]:='';
for j:=0 to 4 do StringGrid2.Cells[j,0]:='';
end;
procedure TForm2.FormCreate(Sender: TObject);
begin
Memo1.Clear;
Label2.Visible:=False;
Label3.Visible:=False;
Edit1.Visible:=False;
Edit2.Visible:=False;
Button3.Visible:=False;
end;
procedure TForm2.SpinEdit1Change(Sender: TObject);
begin
StringGrid1.ColCount:=
StringGrid1.RowCount:=
StringGrid2.ColCount:=
StringGrid2.RowCount:=0;
end;
end.
Литература.