- •Министерство образования республики беларусь
- •Код программы
- •Результат работы программы
- •Лабораторная работа №2
- •Лабораторная работа №3
- •Лабораторная работа №4
- •Лабораторная работа №5
- •Лабораторная работа №6
- •Лабораторная работа №7
- •Лабораторная работа №8
- •Лабораторная работа №9
- •Лабораторная работа №10
Лабораторная работа №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";
}
Результат работы программы

