- •Министерство образования республики беларусь
- •Код программы
- •Результат работы программы
- •Лабораторная работа №2
- •Лабораторная работа №3
- •Лабораторная работа №4
- •Лабораторная работа №5
- •Лабораторная работа №6
- •Лабораторная работа №7
- •Лабораторная работа №8
- •Лабораторная работа №9
- •Лабораторная работа №10
Лабораторная работа №5
Постановка задачи
Решить систему линейных алгебраических уравнений методом отражений. Работу
выполнить на задачах лабораторной работы № 2
Теоретические сведения
Этот
метод основан на разложении матрицы
системы (4.1) в произведение унитарной
матрицы на верхнюю треугольную. Матрица
называется унитарной, если она
удовлетворяет уравнению
,
где
- матрица, сопряженная с
.
Вещественные унитарные матрицы называются
ортогональными.
По своей структуре метод отражений близок к методу Гаусса, но исключение проводится с помощью матриц отражения, которые являются унитарными и эрмитовыми. Достоинством метода отражений является единая схема вычислительного процесса, не зависящая от структуры матрицы.
Теорема
4.2.Пусть
и
произвольные вектор-столбцы, причем
вектор
имеет единичную длину. Тогда найдется
такой вектор
,
что построенная по нему матрица отражения
переведет вектор
в вектор, коллинеарный вектору
,
т.е.
.
Вектор
строится по правилу
,
(4.16)
где
,
,
.
Будем преобразовывать расширенную матрицу систему по правилу
,![]()
с помощью
умножения слева на последовательность
матриц отражения
.
Для построения матрицы
на первом шаге метода в качестве вектора
берется первый столбец расширенной
матрицы, а в качестве вектора
- координатный вектор
.
В силу выбора векторов
и
все координаты первого столбца расширенной
матрицы, кроме первой, после выполнения
первого шага метода будут равны нулю.
Пусть
уже построена матрица
,
у которой
,
,
.
Теперь в качестве
и
берутся вектора
,
,
где в
векторе
единица стоит на
-ом
месте. После выполнения
-го
шага метода отражений получим матрицу
,
у которой все элементы, стоящие ниже
главной диагонали, в первых
-ом
столбцах будут равны нулю. Невозможность
выполнения очередного шага связана
только с равенством нулю вектора
,
а это невозможно, так как матрица
является невырожденной.
После
-
шага получим матрицу, первые
столбцов которой образуют верхнюю
треугольную матрицу
.
Система уравнений, соответствующая
полученной расширенной матрице,
равносильна исходной системе (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::Button1Click(TObject *Sender)
{
int i,j,j1,jj,n,p;
float q,r,t,y,k;
TSG1->RowCount = StrToInt(Edit1->Text);
TSG2->RowCount = StrToInt(Edit1->Text);
n = StrToInt(Edit1->Text);
float **A = new float*[n];
float **D = new float*[n];
float **D1 = new float*[n];
float **U = new float*[n];
float **V = new float*[n];
for(int i = 0; i < n; i++){
A[i] = new float[n+1];
D[i] = new float[n];
D1[i] = new float[n];
U[i] = new float[n];
V[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;*/
for (int j = 0; j < n; j++)
//if(SG1->Cells[i][j] != "")
A[j][n] = StrToFloat(SG1->Cells[n][j]);
/* else
A[j][n] = 0; */
for (i=0;i<n;i++)
for (j=0;j<=n;j++)
D[i][j]=A[i][j];
float *S = new float[n];
float *L = new float[n];
float *X = new float[n];
float *W = new float[n];
j1=0;
while (j1<n)
{
if (j1==0)
{
for (i=0;i<n;i++)
{
S[i]=D[i][j1];
if (i!=j1) L[i]=0;
else L[i]=1;
}
}
else
{
for (i=0;i<j1;i++)
{
S[i]=0;
L[i]=0;
}
for (i=j1;i<n;i++)
{
S[i]=D[i][j1];
if (i!=j1) L[i]=0;
else L[i]=1;
}
}
r=0;
for (i=0;i<n;i++)
r+=S[i]*S[i];
q=sqrt(r);
r=0;
for (i=0;i<n;i++)
r+=S[i]*L[i];
y=r;
if (y>=0) q*=-1;
k=sqrt(2*(fabs(q))*(fabs(q))+2*fabs(q)*fabs(y));
for (i=0;i<n;i++)
W[i]=(S[i]-q*L[i])/k;
for (i=0;i<n;i++)
for (j=0;j<n;j++)
V[i][j]=2*W[i]*W[j];
for (i=0;i<n;i++)
for (j=0;j<n;j++)
if (i==j) U[i][i]=1-V[i][j];
else U[i][j]=-V[i][j];
for (i=0;i<n;i++)
{
for (j=0;j<=n;j++)
{
t=0;
for (jj=0;jj<n;jj++)
t+=U[i][jj]*D[jj][j];
D1[i][j]=t;
}
}
for (i=0;i<n;i++)
for (j=0;j<=n;j++)
D[i][j]=D1[i][j];
j1++;
}
X[n-1]=D[n-1][n]/D[n-1][n-1];
for (i=n-2;i>=0;i--)
{
t=D[i][n];
for (j=n-1;j>i;j--)
t-=D[i][j]*X[j];
X[i]=t/D[i][i];
}
float *f1 = new float[n];
for(int i=0;i<n; i++){
f1[i]=0;
for(int j=0;j<n;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]);
}
/* for (int i = 0; i < n; i++)
for (int j = 0; j < n+1; j++){
TSG1->Cells[j][i] = FloatToStr(A[i][j]); } */
}
//---------------------------------------------------------------------------
void __fastcall TForm1::UpDown1Click(TObject *Sender, TUDBtnType Button)
{
SG1->RowCount = StrToInt(Edit1->Text);
SG1->ColCount = StrToInt(Edit1->Text)+1;
}
//---------------------------------------------------------------------------
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";
SG1->Cells[3][0] = "3,8";
SG1->Cells[3][1] = "0,4";
SG1->Cells[3][2] = "-1,76";
}
Результат работы программы

