Программная реализация численных методов нахождения собственных векторов и собственных значений

Автор работы: Пользователь скрыл имя, 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

Работа состоит из  1 файл

report.docx

— 220.48 Кб (Скачать документ)

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,Range,PVec);

             LVec[k]:=X;

//считаем число  корней характеристического уравнения

             inc(k);

             Form2.Memo1.Lines.Add('Lambda' + IntToStr(k) +

                                              '=' + FloatToStr(LVec[k-1]));

         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,SpEdV);

       SetLength(VMatrix,SpEdV,SpEdV);

//вектор коэффициентов  характеристического уравнения

        SetLength(PVec,SpEdV);

//считываем исходную  матрицу

    InputMatrix(AMatrix,Range);

{==============================================================================}

    PlotSameMatrix(CEquival,AMatrix,Range);

{Блок вычисления  коэффицентов характеристического  уравнения матрицы}

    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,AMatrix,Range,Pk);

       AConsistance(AMatrix,CEquival,VMatrix,Range);

       Memo1.Lines.Add('Матрица А' + IntToStr(k+1));

     end;

     Pn:=Trace(Range,AMatrix)/Range;

     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,RootNum,i,Range,PVec);

//выводим собственный  вектор

StringGrid2.ColCount:=RootNum;

StringGrid2.RowCount:=0;

      for k:=0 to RootNum-1 do

      begin

       StringGrid2.Cells[k,0]:=FloatToStr(LVec[k]);

      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]:=FloatToStr(nv[i]); 
 

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:=SpinEdit1.Value;

  StringGrid1.RowCount:=SpinEdit1.Value;

   StringGrid2.ColCount:=SpinEdit1.Value;

    StringGrid2.RowCount:=0;

end; 

end.

Литература. 

  1. Воробьева Г.Н., Данилова А.Н. Практикум по вычислительной математике: Учеб. Пособие для техникумов. - М.: Высш. Школа, 1990.
 
  1. Гловацкая А.П. Методы и алгоритмы вычислительной математики. Учеб. Пособие для вузов. - М.: Радио и связь, 1999.
 
 
  1. Численные методы. Учебник для техникумов и  вузов. М.: Высшая школа, 1976.
 
  1. Бахвалов  Н.С. Численные методы (анализ, алгебра, обыкновенные дифференциальные уравнения). М.: «Наука», 1975 г.

Информация о работе Программная реализация численных методов нахождения собственных векторов и собственных значений