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

Лабораторная работа №6

Постановка задачи

Решить систему линейных алгебраических уравнений методом вращений. Работу

выполнить на задачах лабораторной работы № 2

Теоретические сведения

Вещественные унитарные матрицы

называются элементарными матрицами вращения или матрицами простого поворота. При умножении матрицы слева на матрицуполучим матрицу, у которой изменятся в отличие от матрицытолько-я и-я строки. Изменение элементов-й и-й строк осуществляется по формулам

,. (4.17)

Всегда можно подобрать угол поворота так, чтобы элементоказался равным нулю. Для этого нужно взять

,, (4.18)

если , и,в противном случае.

Теорема 4.3. Любая действительная матрица преобразуется в верхнюю треугольную матрицу после умножения слева на конечную цепочку матриц простого поворота.

Рассмотрим систему (4.1) и построим для матрицы системы унитарную матрицутак, чтобы матрицапреобразованной системы стала верхней треугольной. Тогда система преобразуется к виду

.

Матрица представляет собой произведение унитарных матриц простого поворота. Матрицастроится так, чтобы после умножения обнулить элемент, стоящий под главной диагональю. В этом случае угол поворота выбирается по формулам (4.18).

Код программы

Unit1.cpp:

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

#include "Unit1.h"

#include <stdio.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);

SG1->ColCount = StrToInt(Edit1->Text)+1;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

TSG1->RowCount = StrToInt(Edit1->Text);

TSG2->RowCount = StrToInt(Edit1->Text);

int i,j,j1,jj,n,p,l;

float sinus,t,cosinus;

n = StrToInt(Edit1->Text);

//float A[3][4],D[3][4],D1[3][4],X[4],U[3][4],U1[3][4],sinus,t,cosinus;

float **A = new float*[n];

float **D = new float*[n];

float **D1 = new float*[n];

float **U = new float*[n];

float **U1 = 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];

U1[i] = new float[n];

}

float *X = 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];

U[i][j]=0;

}

for (i=0;i<n;i++)

U[i][i]=1;

for (i=0;i<n;i++)

for (j=0;j<=n;j++)

U1[i][j]=U[i][j];

for(i=0,p=0;i<n-1;i++,p++){

for(j=1;j<n;j++){

cosinus=D[i][p]/sqrt(D[i][p]*D[i][p]+D[j][p]*D[j][p]);

sinus=-D[j][p]/sqrt(D[i][p]*D[i][p]+D[j][p]*D[j][p]);

U1[i][i]=cosinus;

U1[i][j]=-sinus;

U1[j][i]=sinus;

U1[j][j]=cosinus;

for(l=0;l<n;l++){

for(j1=0;j1<=n;j1++){

t=0;

for(jj=0;jj<n;jj++)

t+=U1[l][jj]*D[jj][j1];

D1[l][j1]=t;

}

}

for(l=0;l<n;l++)

for(j1=0;j1<=n;j1++){

D[l][j1]=D1[l][j1];

U1[l][j1]=U[l][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]);

}

}

//---------------------------------------------------------------------------

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[j][i] = "";

for(int i = 0; i < 1; i++)

for(int j = 0; j < n; j++){

TSG2->Cells[i][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";

SG1->Cells[3][0] = "3,8";

SG1->Cells[3][1] = "0,4";

SG1->Cells[3][2] = "-1,76";

}

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

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