Нахождение собственных значений и векторов

Министерство  образования Российской Федерации

Тульский государственный  университет

Кафедра прикладной математики и информатики

 

 

Утверждаю

Зав. кафедрой ПМиИ

___________________ В.И.  Иванов

«___»  _____________ 2008 г.

 

 

 

 

ПОЯСНИТЕЛЬНАЯ  ЗАПИСКА

к курсовому проекту по курсу

«ЧИСЛЕННЫЕ МЕТОДЫ»

на тему

________________________________________________________________________

________________________________________________________________________

________________________________________________________________________

 

 

 

 

 

 

 

Автор работы __________________ студент гр. _________   _____________________

                                                                (дата, подпись)                                                                                                                   (фамилия и инициалы)

Руководитель  работы __________________  _____________   ____________________

                                                                                     (дата, подпись)                                     (должность)                                     (фамилия и инициалы)

Работа защищена ___________________ с оценкой  ____________________________

                                                                                     (дата)

Члены комиссии __________________  _______________   ____________________

                                                                          (дата, подпись)                                     (должность)                                     (фамилия и инициалы)

                              __________________  _______________   ____________________

                                                                          (дата, подпись)                                     (должность)                                     (фамилия и инициалы)

                              __________________  _______________   ____________________

                                                                          (дата, подпись)                                     (должность)                                     (фамилия и инициалы)

 

 

Тула, 2008 

Утверждаю

Зав. кафедрой ПМиИ

___________________ В.И.  Иванов

«___»  _____________ 20___ г.

 

 

ЗАДАНИЕ

на курсовой проект по курсу

«ЧИСЛЕННЫЕ МЕТОДЫ»

 

студенту гр. ____________   ________________________________________________

                                                                                                                                                                (фамилия, имя, отчество)

Тема работы _____________________________________________________________

________________________________________________________________________

________________________________________________________________________

Входные данные  _________________________________________________________

________________________________________________________________________

________________________________________________________________________

________________________________________________________________________

________________________________________________________________________

Задание получил __________________            _____________________

                                                                              (подпись)                                                                               (дата)

График выполнения работы ________________________________________________

________________________________________________________________________

________________________________________________________________________

________________________________________________________________________

________________________________________________________________________

________________________________________________________________________

________________________________________________________________________

________________________________________________________________________

Замечания консультанта ___________________________________________________

________________________________________________________________________

________________________________________________________________________

________________________________________________________________________

К защите. Консультант  работы __________________            _____________________

                                                                                                                   (подпись)                                                                               (дата)

 

 

 

 

Министерство  образования Российской Федерации

Тульский государственный  университет

Кафедра прикладной математики и информатики

 

РЕЦЕНЗИЯ

на курсовой проект по курсу

«ЧИСЛЕННЫЕ МЕТОДЫ»

 

студента гр. ____________   ________________________________________________

                                                                                                                                                                (фамилия, имя, отчество)

на тему

________________________________________________________________________

________________________________________________________________________

________________________________________________________________________

Краткая характеристика теоретической части

________________________________________________________________________

________________________________________________________________________

________________________________________________________________________

________________________________________________________________________

________________________________________________________________________

________________________________________________________________________

Краткая характеристика программной реализации

________________________________________________________________________

________________________________________________________________________

________________________________________________________________________

________________________________________________________________________

________________________________________________________________________

________________________________________________________________________

Работа с  литературой

________________________________________________________________________

________________________________________________________________________

________________________________________________________________________

 

Рекомендуемая оценка ____________________________

Рецензент __________________  _______________   ____________________

                                                      (дата, подпись)                                     (должность)                                     (фамилия и инициалы)

 

 

Содержание

      Введение……………………………………………………………………….4

      Часть 1 (теоретическая)……………………………………………………….5

  1. Нахождение собственных значений…………………………………….5
  2. Нахождение собственных векторов……………………………………..6

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

      Приложение 1. Программа……………………………………………………8

      Приложение 2. Результаты  работы программы…………………………….16

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Введение.

 

Метод А. Н. Крылова нахождения собственных  значений и векторов является в основном учебным методом, т.к. количество вычислений значительно больше других методов (Данилевского, неопределенных коэффициентов и др.) и соответственно по скорости метод Крылова уступает им. Но из - за своей простоты он остается достаточно популярным учебным методом и может использоваться при решении матриц небольших порядков.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Нахождение собственных значений.

 

Метод Крылова основан на свойстве квадратной матрицы обращать в нуль свой характеристический многочлен.

Согласно тождеству Гамильтона-Кели, всякая квадратная матрица является корнем своего характеристического многочлена и, следовательно, обращает его в нуль.

Пусть

   (1)

характеристический многочлен.

Заменяя в выражении (1) величину на , получим

 (2)

Возьмем произвольный ненулевой вектор

 (3)

Умножим обе части выражения (2) на :

 (4)

Положим

 (5)

т.е.

 (6)

Учитывая (5), выражение (4) запишем в  виде

 (7)

или в виде

 

Решаем систему (7). Если эта система  имеет единственное решение, то ее корни    являются коэффициентами характеристического многочлена (1).

 

 

 

Нахождение  собственных векторов.

 

Если известны коэффициенты и корни характеристического многочлена, то метод Крылова дает возможность найти соответствующие собственные векторы по следующей формуле:

 (8)

Здесь – векторы, использованные при нахождении коэффициентов методом Крылова, а коэффициенты определяются по схеме Горнера:

 (9)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

    1. Б. П. Демидович, И. А. Марон «Основы вычислительной математики». - Издательство «Лань», 2007 – 672с .
    2. Н. Н. Калиткин «Численные методы».

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Приложение 1. Программа.

 

Unit1.h

 

#ifndef Unit1H

#define Unit1H

//---------------------------------------------------------------------------

#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

#include <Grids.hpp>

#include "math.hpp"

#include <ExtCtrls.hpp>

//---------------------------------------------------------------------------

class TForm1 : public TForm

{

__published: // IDE-managed Components

        TMemo *Memo1;

        TButton *Button1;

        TStringGrid *StringGrid1;

        TGroupBox *GroupBox1;

        TLabel *Label1;

        TLabel *Label2;

        TGroupBox *GroupBox2;

        TButton *Button2;

        TStringGrid *StringGrid2;

        TStringGrid *StringGrid3;

        TButton *Button3;

        TButton *Button4;

        TLabel *Label3;

       TEdit *Edit1;

        TLabel *Label4;

        TLabel *Label5;

        TLabel *Label6;

        TLabel *Label7;

        TStringGrid *StringGrid4;

        TCheckBox *CheckBox1;

        TLabel *Label8;

        TLabel *Label9;

        TLabel *Label10;

        TButton *Button5;

        TButton *Button6;

        TLabel *Label11;

        TMemo *Memo2;

        TLabel *Label12;

        void __fastcall Button1Click(TObject *Sender);

        void __fastcall Button2Click(TObject *Sender);

        void __fastcall Button3Click(TObject *Sender);

        void __fastcall Button4Click(TObject *Sender);

        double __fastcall Polinom(double x);

        void __fastcall Dix(double a,double b);

        void __fastcall CheckBox1Click(TObject *Sender);

        void __fastcall Button5Click(TObject *Sender);

        void __fastcall Button6Click(TObject *Sender);

        void __fastcall FormDestroy(TObject *Sender);

 

private:

public:

        double * *matrix;

        double * *vektori;

        double * *vektorg;

        double * *vek;

        double *L,*koef,*q;

        double buf;

        int i,j,k,dlstr,step;

 

        __fastcall TForm1(TComponent* Owner);

};

//---------------------------------------------------------------------------

extern PACKAGE TForm1 *Form1;

//---------------------------------------------------------------------------

#endif

 

 

Unit1.cpp

 

#include <vcl.h>

#pragma hdrstop

 

#include "Unit1.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

        : TForm(Owner)

{

}

//---------------------------------------------------------------------------

 

void __fastcall TForm1::Button1Click(TObject *Sender)

{

char bufb;

String bufs;

 

Memo1->Lines->LoadFromFile(Edit1->Text);

 

Label4->Visible=false;

Label5->Visible=true;

Button2->Visible=true;

Button5->Visible=false;

Button1->Visible=false;

Memo2->Visible=false;

 

Memo2->Text="";

 

step=Memo1->Lines->Count;

 

matrix = new double *[step];

for (i=0;i<step;i++)

  matrix[i] = new double[step];

 

vektori = new double *[step+1];

for (i=0;i<step+1;i++)

  vektori[i] = new double[step];

 

vektorg = new double *[step+1];

for (i=0;i<step+1;i++)

  vektorg[i] = new double[step];

 

vek = new double *[step];

for (i=0;i<step+1;i++)

  vek[i] = new double[step];

 

q = new double [step+1];

koef = new double [step];

L = new double [step];

                                

StringGrid2->ColCount=step;

StringGrid2->RowCount=step+1;

StringGrid2->Width=step*121+20;

 

StringGrid3->ColCount=step;

StringGrid3->Width=step*121+3;

 

StringGrid4->ColCount=step;

StringGrid4->Width=step*101+3;

 

 

StringGrid1->ColCount=step;

StringGrid1->Width=step*51+3;

StringGrid1->Visible=true;

StringGrid1->Cells[0][0]="1";

for (i=1;i<step;i++)

  StringGrid1->Cells[i][0]="0";

 

                                 

for (i=0;i<step;i++)             

  {

  dlstr=Memo1->Lines->Strings[i].Length();

  k=0;

  bufs="";

    for (j=0;j<dlstr;j++)

    {

    bufb=Memo1->Lines->Strings[i][j+1];

    if (bufb!=' ') bufs+=bufb;

    if (bufb==' ') { matrix[i][k] = StrToFloat(bufs); k++; bufs="";}

    }

  matrix[i][k] = StrToFloat(bufs); k++; bufs="";

  }

 

}

 

//---------------------------------------------------------------------------

 

 

 

 

 

 

void __fastcall TForm1::Button2Click(TObject *Sender)

{

for (i=0;i<step;i++)

vektori[0][i]=StrToFloat(StringGrid1->Cells[i][0]);

 

Label5->Visible=false;

Label6->Visible=true;

 

Button2->Visible=false;

Button3->Visible=true;

 

for (k=1;k<step+1;k++)

  for (i=0;i<step;i++)

    {

    vektori[k][i]=0;

    for (j=0;j<step;j++)

       vektori[k][i]+=matrix[i][j]*vektori[k-1][j];

    }

for (j=0;j<step;j++)

  for (i=0;i<step+1;i++)

    vektorg[i][j]=vektori[i][j];

 

 

 

for (j=0;j<step;j++)

  for (i=0;i<step+1;i++)

  StringGrid2->Cells[j][i]=FloatToStr(vektori[i][j]);

 

}

//---------------------------------------------------------------------------

 

 

void __fastcall TForm1::Button3Click(TObject *Sender)

{

double a;

 

Label6->Visible=false;

Label7->Visible=true;

Button4->Visible=true;

Button3->Visible=false;

 

for (k=1;k<step;k++) 

  for (j=k+1;j<step+1;j++)

  {

  a=vektorg[step-k][j-1]/vektorg[step-k][k-1];

 

  for (i=k;i<step+1;i++)

    vektorg[step-i][j-1]-=vektorg[step-i][k-1]*a;

 

  vektorg[step][j-1]-=vektorg[step][k-1]*a;

  }

 

for (i=0;i<step;i++)

koef[i]=0;               

                          

for (i=step-1;i>=0;i--)

  {

  buf=-vektorg[step][i];

 

  for (j=0;j<step;j++)

     buf-=koef[j]*vektorg[step-1-j][i];

 

  koef[i]=RoundTo(buf/vektorg[step-i-1][i],-10);

  }

 

for (i=0;i<step;i++)

StringGrid3->Cells[i][0]=koef[i];

 

for (j=0;j<step;j++)

  for (i=0;i<step+1;i++)

    StringGrid2->Cells[j][i]=FloatToStr(vektorg[i][j]);

 

}

//---------------------------------------------------------------------------

 

 

void __fastcall TForm1::Button4Click(TObject *Sender)

{

double c;

int vg,ng;

bool chnch;

 

Label7->Visible=false;

Label11->Visible=true;

Label8->Visible=false;

Label10->Visible=true;

StringGrid4->Visible=true;

Button6->Visible=true;

Button4->Visible=false;

 

for (i=0;i<step;i++)

L[i]=0;

 

for (j=0;;j++)                     

  {

  k=0;

  q[0]=1;

  for (i=1;i<=step;i++)

    {

    q[i]=koef[i-1]+q[i-1]*j;

    if (q[i]>0) k++;

    }

  if (k==step) {vg=j; break;  }

  }

 

for (j=0;;j++)                     

  {

  k=0;

  q[0]=1;

  chnch=true;

  for (i=1;i<=step;i++)

    {

    if (chnch) {q[i]=-koef[i-1]+q[i-1]*j; chnch=false; }

          else { q[i]=koef[i-1]+q[i-1]*j; chnch=true;  }

    if (q[i]>0) k++;

    }

  if (k==step) {ng=-j; break;  }

  }

 

j=0;

for (c=ng;c<=vg;c+=0.001) 

  if (Polinom(c)*Polinom(c+0.001)<0)

     Dix(c,c+0.001);

 

for (i=0;i<step;i++)

StringGrid4->Cells[i][0]=L[i];

 

}

//---------------------------------------------------------------------------

 

double __fastcall TForm1::Polinom(double x)

{

double stx;

 

stx=1;

buf=0;

buf+=koef[step-1];

 

for (i=1;i<step;i++)

{

stx=stx*x;

buf+=koef[step-i-1]*stx;

}

 

buf+=stx*x;

 

return buf;

}

 

                                 

 

void __fastcall TForm1::Dix(double a,double b)

{

if ((b-a>0.0000000000001)&(Polinom(a)*Polinom((a+b)/2)<0)) Dix(a,(a+b)/2);

if ((b-a>0.0000000000001)&(Polinom((a+b)/2)*Polinom(b)<0)) Dix((a+b)/2,b);

if (b-a<0.0000000000001) {L[j]=(a+b)/2; j++;    }

}

 

 

void __fastcall TForm1::CheckBox1Click(TObject *Sender)

{

if (CheckBox1->Checked)

{

Label8->Visible=true;

Label9->Visible=true;

StringGrid2->Visible=true;

StringGrid3->Visible=true;

} else

{

Label8->Visible=false;

Label9->Visible=false;

StringGrid2->Visible=false;

StringGrid3->Visible=false;

}

       

}

//---------------------------------------------------------------------------

 

void __fastcall TForm1::Button5Click(TObject *Sender)

{

Button1->Click();

Button2->Click();

Button3->Click();

Button4->Click();

Button6->Click();

}

//---------------------------------------------------------------------------

 

void __fastcall TForm1::Button6Click(TObject *Sender)

{

String bufs;

 

Memo2->Visible=true;

Memo2->Width=130*step+120;

Label11->Visible=false;

Button6->Visible=false;

Button1->Visible=true;

Button5->Visible=true;

 

for (k=0;k<step;k++)           

{

q[0]=1;

vek[0][k]=0;

 

for (i=1;i<step;i++)

   {

   q[i]=L[k]*q[i-1]+koef[i-1];

   vek[i][k]=0;

   }

 

for (i=0;i<step;i++)

   for (j=0;j<step;j++)

      vek[j][k]+=q[i]*vektori[step-i-1][j];

 

}

 

                            

bufs="";

for (i=0;i<step;i++)

bufs+=StringGrid4->Cells[i][0]+"    |    ";

Memo2->Lines->Add(bufs+"-собственные значения");

Memo2->Lines->Add("Собственные вектора:");

 

 

for (j=0;j<step;j++)

   {

   bufs="";

   for (i=0;i<step;i++)

      bufs+=FloatToStr(vek[j][i])+"    |    ";

   Memo2->Lines->Add(bufs);

   }

 

}

//---------------------------------------------------------------------------

 

 

void __fastcall TForm1::FormDestroy(TObject *Sender)

{

Memo2->Lines->SaveToFile("LastSolve.txt"); 

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Приложение 2. Результаты работы программы.

 

Матрица:

1 2 3 4

2 1 2 3

3 2 1 2

4 3 2 1

 

 

 

-3,41421356237312    |    -1,09901951359278    |    -0,585786437626896    |    9,09901951359279    |    -собственные значения

Собственные вектора:

-34,9705627484782    |    2,43529751065973    |    -1,02943725152294    |    369,564702489341    |   

-14,4852813742386    |    -2,97058540778349    |    2,48528137423868    |    302,970585407784    |   

14,485281374239    |    -2,97058540778355    |    -2,48528137423854    |    302,970585407784    |   

34,9705627484778    |    2,43529751065972    |    1,02943725152286    |    369,564702489341    |   

 

 

Матрица:

1 2 3 4 5

2 1 2 3 4

3 2 1 2 3

4 3 2 1 2

5 4 3 2 1

 

-5,23606797749978    |    -1,63523773004179    |    -0,763932022500214    |    -0,55629491531239    |    13,1915326453542    |    - собственные значения

Собственные вектора:

502,439613479969    |    -10,7459767724548    |    1,56038652002362    |    -0,441664995324075    |    13380,1876417679    |   

310,524758424984    |    5,9790301978571    |    -2,52475842498563    |    1,29343742571871    |    10948,7275323764    |   

8,66862137627322E-13    |    15,391302037353    |    -1,70530256582424E-13    |    -1,62164619706542    |    10177,2303441597    |   

-310,524758424983    |    5,97903019785804    |    2,52475842498507    |    1,29343742571916    |    10948,7275323765    |   

-502,439613479972    |    -10,7459767724548    |    -1,560386520024    |    -0,441664995324999    |    13380,1876417678    |   


Нахождение собственных значений и векторов