- •Министерство образования республики беларусь
- •Код программы
- •Результат работы программы
- •Лабораторная работа №2
- •Лабораторная работа №3
- •Лабораторная работа №4
- •Лабораторная работа №5
- •Лабораторная работа №6
- •Лабораторная работа №7
- •Лабораторная работа №8
- •Лабораторная работа №9
- •Лабораторная работа №10
Лабораторная работа №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";
}
Результат работы программы