Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
otchet_VMA.doc
Скачиваний:
17
Добавлен:
25.03.2015
Размер:
1.32 Mб
Скачать

Лабораторная работа №4

Постановка задачи

Решить систему линейных алгебраических уравнений методом квадратного корня. Работу выполнить на задачах лабораторной работы № 2

Теоретические сведения

Этот метод используется для решения систем линейных алгебраических уравнений с эрмитовой невырожденной матрицей . Матрицаназывается эрмитовой, если она совпадает со своей комплексно-сопряженной транспонированной матрицей, т.е.. Среди прямых методов этот метод является самым быстродействующим и особенно удобен для решения систем уравнений с ленточной матрицей, у которойпри, где.

Будем искать разложение действительной матрицы системы (4.1) в виде

, (4.14)

где

,

- диагональная матрица с элементами.

После перемножения матриц получаем

,,

,.

Потребуем, чтобы элементы были положительными числами. Тогда получим

(4.15)

Таким образом, разложение (4.14) существует и определяется формулами (2.15). Тогда решение системы (4.1) сводится к решению двух систем с треугольными матрицами

,.

Первая система имеет вид

и ее решение находится по формулам

,,.

Вторая система

дает решение исходной системы (4.1)

,,.

Если матрица является положительно определенной (все главные миноры положительны), тои. Формулы разложения имеют в этом случае вид

Код программы

Unit1.cpp :

#include <vcl.h>

#pragma hdrstop

#include "Unit1.h"

#include "math.h"

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

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

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

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

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

void __fastcall TForm1::UpDown1Click(TObject *Sender, TUDBtnType Button)

{

SG1->RowCount = StrToInt(Edit1->Text);

SG2->RowCount = StrToInt(Edit1->Text);

SG1->ColCount = StrToInt(Edit1->Text);

}

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

void __fastcall TForm1::Button1Click(TObject *Sender)

{

TSG1->RowCount = StrToInt(Edit1->Text);

TSG2->RowCount = StrToInt(Edit1->Text);

int n = StrToInt(Edit1->Text);

float **a = new float*[n];

float **S = new float*[n];

for(int i = 0; i < n; i++){

a[i] = new float[n];

S[i] = new float[n];

}

float *Y = new float[n];

float *x = new float[n];

float *b = new float[n];

float *D = new float[n];

for (int i = 0; i < n; i++)

for (int j = 0; j < n; j++)

if(SG1->Cells[i][j] != "")

a[i][j] = StrToFloat(SG1->Cells[j][i]);

else

a[i][j] = 0;

for(int i=0; i<n; i++){

for(int j=0; j<=n-1; j++)

S[i][j]=0;

D[i]=0;

}

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

for (int j = 0; j < n; j++)

if(SG1->Cells[i][j] != "")

b[j] = StrToFloat(SG2->Cells[i][j]);

else

b[j] = 0; //

//int n=0;

float sum;

for(int i=0;i<=n-1;i++){

sum=0;

for(int k=0;k<=i-1;k++)

sum+=S[i][k]*S[i][k]*D[k];

if((a[i][i]-sum)>=0) D[i]=1;

else D[i]=-1;

S[i][i]=sqrt(fabs(a[i][i]-sum));

for(int j=i+1;j<=n-1;j++)

{

sum=0;

for(int k=0;k<=i-1;k++)

sum+=S[j][k]*D[k]*S[i][k];

S[j][i]=(a[j][i]-sum)/(D[i]*S[i][i]);

}

}

Y[0]=b[0]/S[0][0];

for(int i=1;i<=n-1;i++)

{

sum=0;

for(int j=0;j<=i;j++)

sum+=S[i][j]*Y[j];

Y[i]=(b[i]-sum)/S[i][i];

}

x[n-1]=Y[n-1]/(S[n-1][n-1]*D[n-1]);

for(int i=n-2;i>=0;i--)

{

sum=0;

for(int j=i+1;j<=n-1;j++)

sum+=S[j][i]*D[i]*x[j];

x[i]=(Y[i]-sum)/(S[i][i]*D[i]);

}

float *f1 = new float[n];

for(int i=0;i<=n-1; i++)

{

f1[i]=0;

for(int j=0;j<=n-1;j++)

f1[i]+=a[i][j]*x[j];

}

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

for (int j = 0; j < n; j++){

TSG1->Cells[i][j] = FloatToStr(x[j]);

}

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

for (int j = 0; j < n; j++){

TSG2->Cells[i][j] = FloatToStr(f1[j]);

}

}

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

void __fastcall TForm1::Button2Click(TObject *Sender)

{

int n = StrToInt(Edit1->Text);

for(int i = 0; i < n; i++)

for(int j = 0; j < n; j++)

SG1->Cells[i][j] = "";

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

for(int j = 0; j < n; j++)

SG2->Cells[i][j] = "";

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

for(int j = 0; j < n; j++)

TSG2->Cells[i][j] = "";

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

for(int j = 0; j < n; j++)

TSG1->Cells[i][j] = "";

}

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

void __fastcall TForm1::Button3Click(TObject *Sender)

{

SG1->Cells[0][0] = "3,6";

SG1->Cells[1][0] = "1,8";

SG1->Cells[2][0] = "-4,7";

SG1->Cells[0][1] = "1,8";

SG1->Cells[1][1] = "-3,6";

SG1->Cells[2][1] = "1,9";

SG1->Cells[0][2] = "-4,7";

SG1->Cells[1][2] = "1,9";

SG1->Cells[2][2] = "3,3";

SG2->Cells[0][0] = "3,8";

SG2->Cells[0][1] = "0,4";

SG2->Cells[0][2] = "-1,76";

}

Результат работы программы

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]