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

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

}

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

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