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