- •Министерство образования республики беларусь
- •Код программы
- •Результат работы программы
- •Лабораторная работа №2
- •Лабораторная работа №3
- •Лабораторная работа №4
- •Лабораторная работа №5
- •Лабораторная работа №6
- •Лабораторная работа №7
- •Лабораторная работа №8
- •Лабораторная работа №9
- •Лабораторная работа №10
Результат работы программы
Лабораторная работа №2
Постановка задачи
Решить систему линейных алгебраических уравнений по схеме Холецкого
Теоретические сведения
Используем для решения системы (4.1) теорему о разложении невырожденной квадратной матрицы в произведение нижней и верхней треугольных матриц.
Теорема 4.1. Если главные миноры матрицыотличны от нуля:
,, …, ,
то матрица представима в виде
, (4.11)
где и- соответственно нижняя и верхняя треугольные матрицы.
Разложение (4.11) не может быть единственным. Если взять произвольную диагональную матрицу , с элементами, отличными от нуля, то вместе с равенствомсправедливо также равенство. Поэтому диагональные элементы одной из матрициможно задавать произвольными, отличными от нуля.
Зафиксируем элементы главной диагонали матрицы , положив,. В этом случае разложение имеет вид
(4.12)
Учитывая разложение (4.11), система (4.1) принимает вид . Тогда вектор неизвестныхможно найти из цепочки матричных уравнений
,(4.13)
Вектор находится из системы с нижней треугольной матрицей
по формулам ,,. Определив вектор, находим
вектор неизвестных из системы с верхней треугольной матрицей
Вычисление проводится по формулам, аналогичным формулам для обратного хода схемы единственного деления Гаусса
,,.
Описанный метод решения систем линейных алгебраических уравнений называется схемой Холецкого.
Код программы
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::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 **b = new float*[n];
float **c = new float*[n];
for(int i = 0; i < n; i++){
a[i] = new float[n];
b[i] = new float[n];
c[i] = 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;
float *y = new float[n];
float *x = new float[n];
float *f1 = new float[n];
float *d = new float[n];
for (int i = 0; i < 1; i++)
for (int j = 0; j < n; j++)
if(SG1->Cells[i][j] != "")
d[j] = StrToFloat(SG2->Cells[i][j]);
else
d[j] = 0;
float sum; //решение СЛАУ методом Холецкого
for (int i=0; i<n; i++){
c[i][i]=1;
for (int j=i; j<n; j++){
sum=0;
for (int k=0; k<=(i-1);k++)
sum+=b[j][k]*c[k][i];
b[j][i]=a[j][i]-sum; //нахождение эл-ов массива b
sum=0;
for (int p=0; p<=(i-1); p++)
sum+=b[i][p]*c[p][j];
c[i][j]=(a[i][j]-sum)/b[i][i]; //нахождение эл-ов массива c
}
}
y[0]=d[0]/b[0][0];
for (int i=1; i<=(n-1); i++){
sum=0;
for (int j=0; j<=i; j++)
sum+=b[i][j]*y[j];
y[i]=(d[i]-sum)/b[i][i]; //нахождение эл-ов массива y
}
x[n-1]=y[n-1];
for (int i=n-2; i>-1; i--){
float sum=0;
for (int j=i+1; j<n; j++)
sum+=c[i][j]*x[j];
x[i]=y[i]-sum; //нахождение эл-ов массива x
}
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++) //вывод массива x
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::BitBtn2Click(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";
}
Результат работы программы