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

Автор работы: Пользователь скрыл имя, 12 Июня 2013 в 22:14, курсовая работа

Описание работы

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

Содержание работы

Введение……………………………………………………………………….4
Часть 1 (теоретическая)……………………………………………………….5
Нахождение собственных значений…………………………………….5
Нахождение собственных векторов……………………………………..6
Список литературы………………

Файлы: 1 файл

Курсач.doc

— 132.00 Кб (Скачать файл)

  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    |   


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