Нахождение собственных значений и векторов
Министерство образования Российской Федерации
Тульский государственный университет
Кафедра прикладной математики и информатики
Утверждаю
Зав. кафедрой ПМиИ
___________________ В.И. Иванов
«___» _____________ 2008 г.
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
к курсовому проекту по курсу
«ЧИСЛЕННЫЕ МЕТОДЫ»
на тему
______________________________
______________________________
______________________________
Автор работы __________________ студент гр. _________ _____________________
Руководитель работы __________________ _____________ ____________________
Работа защищена ___________________ с оценкой ____________________________
Члены комиссии __________________ _______________ ____________________
__________________ _______________ ____________________
__________________ _______________ ____________________
Тула, 2008
Утверждаю
Зав. кафедрой ПМиИ
___________________ В.И. Иванов
«___» _____________ 20___ г.
ЗАДАНИЕ
на курсовой проект по курсу
«ЧИСЛЕННЫЕ МЕТОДЫ»
студенту гр.
____________ ______________________________
Тема работы
______________________________
______________________________
______________________________
Входные данные
______________________________
______________________________
______________________________
______________________________
______________________________
Задание получил __________________ _____________________
График выполнения
работы ______________________________
______________________________
______________________________
______________________________
______________________________
______________________________
______________________________
______________________________
Замечания консультанта
______________________________
______________________________
______________________________
______________________________
К защите. Консультант работы __________________ _____________________
Министерство образования Российской Федерации
Тульский государственный университет
Кафедра прикладной математики и информатики
РЕЦЕНЗИЯ
на курсовой проект по курсу
«ЧИСЛЕННЫЕ МЕТОДЫ»
студента гр. ____________
______________________________
на тему
______________________________
______________________________
______________________________
Краткая характеристика теоретической части
______________________________
______________________________
______________________________
______________________________
______________________________
______________________________
Краткая характеристика программной реализации
______________________________
______________________________
______________________________
______________________________
______________________________
______________________________
Работа с литературой
______________________________
______________________________
______________________________
Рекомендуемая оценка ____________________________
Рецензент __________________ _______________ ____________________
Содержание
Введение…………………………………………………………
Часть 1 (теоретическая)………………………………………
- Нахождение собственных значений…………………………………….5
- Нахождение собственных векторов……………………………………..6
Список литературы…………………………………
Приложение 1. Программа……………………………………………………8
Приложение 2. Результаты работы программы…………………………….16
Введение.
Метод А. Н. Крылова нахождения собственных значений и векторов является в основном учебным методом, т.к. количество вычислений значительно больше других методов (Данилевского, неопределенных коэффициентов и др.) и соответственно по скорости метод Крылова уступает им. Но из - за своей простоты он остается достаточно популярным учебным методом и может использоваться при решении матриц небольших порядков.
Нахождение собственных значений.
Метод Крылова основан на свойстве квадратной матрицы обращать в нуль свой характеристический многочлен.
Согласно тождеству Гамильтона-Кели, всякая квадратная матрица является корнем своего характеристического многочлена и, следовательно, обращает его в нуль.
Пусть
(1)
характеристический многочлен.
Заменяя в выражении (1) величину на , получим
(2)
Возьмем произвольный ненулевой вектор
(3)
Умножим обе части выражения (2) на :
Положим
(5)
т.е.
(6)
Учитывая (5), выражение (4) запишем в виде
(7)
или в виде
Решаем систему (7). Если эта система имеет единственное решение, то ее корни являются коэффициентами характеристического многочлена (1).
Нахождение собственных векторов.
Если известны коэффициенты и корни характеристического многочлена, то метод Крылова дает возможность найти соответствующие собственные векторы по следующей формуле:
(8)
Здесь – векторы, использованные при нахождении коэффициентов методом Крылова, а коэффициенты определяются по схеме Горнера:
(9)
Список литературы:
- Б. П. Демидович, И. А. Марон «Основы вычислительной математики». - Издательство «Лань», 2007 – 672с .
- Н. Н. Калиткин «Численные методы».
Приложение 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(
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+
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]
k=0;
bufs="";
for (j=0;j<dlstr;j++)
{
bufb=Memo1->Lines->Strings[i][
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(
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]*
}
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]=
}
//----------------------------
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]/
for (i=k;i<step+1;i++)
vektorg[step-i][j-1]-=vektorg[
vektorg[step][j-1]-=vektorg[
}
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]
koef[i]=RoundTo(buf/vektorg[
}
for (i=0;i<step;i++)
StringGrid3->Cells[i][0]=koef[
for (j=0;j<step;j++)
for (i=0;i<step+1;i++)
StringGrid2->Cells[j][i]=
}
//----------------------------
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)<
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)&(
if ((b-a>0.0000000000001)&(
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-
}
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("
}
Приложение 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 |

- Нахождение собственных значений методом Леверрье
- Нахождение статистических оценок неизвестных параметров распределения при случайном числе независимых наблюдений
- Нацизм и неонацизм
- Нации и народы, борющиеся за свою независимость, как субъекты современного международного права
- Нации и народы, борющиеся за свою независимость, как субъекты современного международного права
- Национализация и приватизация собственности. Проблемы, этапы и последствия приватизации государственной собственности в России
- Национализм в России - идеология и практика
- Нахождение минимума унимодальной функции методами Дихотомии и Золотого сечения
- Нахождение оптимального места расположения склада для предприятия сеть киосков «Табакерка»
- Нахождение оптимального плана вложения денежных средств в депозиты
- Нахождение оптимального плана транспортной задачи
- Нахождение погрешности показания среднесуточной температуры термометра
- Нахождение полиноминальной аппроксимации методом наименьших квадратов
- Нахождение произведения квадратной матрицы через функцию