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

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

Лабораторная работа №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";

}

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

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