МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
Національний університет Львівська політехніка
Кафедра ПЗ
До лабораторної роботи № 2
З курсу “Чисельні методи”
На тему:
“ Розв’язування системи лінійних рівнянь ”.
Виконав:
Студент групи КН-3
Львів – 2008
Тема:
Розв’язування системи лінійних рівнянь.
Мета:
Оволодіти засобами розв’язування системи лінійних рівнянь за допомогою різних методів .
Знайти розв’язок системи лінійних рівнянь з точністю до 10-3 методом Гаусса та методом LU-розкладу, порівняти результати, а також обчислити детермінант матриці коефіцієнтів та обернену до неї матрицю.
Варіанти завдань:
В процесі розроблення лабораторної роботи було розроблено наступний програмний продукт:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
float *Gaus(float[3][4]);
float *LU(float[3][3]);
float *Iter(float[3][4], float);
float det(float[3][3]);
float *matr(float[3][4]);
float A[3][3] = {{0.34, 0.71, 0.63},
{0.71, -0.65, -0.18},
{1.17, -2.35, 0.75} };
float B[] = {2.08,
0.17,
1.28 };
float AB[3][4] = {0.34, 0.71, 0.63, 2.08,
0.71, -0.65, -0.18, 0.17,
1.17, -2.35, 0.75, 1.28 };
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
/*float *Gaus(float AB[3][4])
{
float result[3], t1, t2;
int i, j;
t1 = AB[0][0];
for(i=0; i<4; i++)
AB[0][i] = AB[0][i]/t1;
t1 = AB[1][0];
t2 = AB[2][0];
for(i=0; i<4; i++)
{
AB[1][i] = AB[1][i] - AB[0][i]*t1;
AB[2][i] = AB[2][i] - AB[0][i]*t2;
}
t1 = AB[1][1];
for(i=0; i<4; i++)
AB[1][i] = AB[1][i]/t1;
t1 = AB[2][1];
for(i=0; i<4; i++)
AB[2][i] = AB[2][i] - AB[1][i]*t1;
result[2] = AB[2][3]/AB[2][2];
result[1] = AB[1][3] - AB[1][2]*result[2];
result[0] = AB[0][3] - AB[0][2]*result[2] - AB[0][1]*result[1];
return result;
} */
float *Gaus(float a[3][4])
{
const n = 3;
int l, i, k;
float c, s;
// float a[n][m];
float x[n];
/* for(i=0; i<n; i++)
for(k=0; k<m; k++)
scanf("%f", &a[i][k]);*/
for(l=0; l<n-1; l++)
{
c = a[l][l];
for(k=l+1; k<n+1; k++)
{
a[l][k] = -a[l][k]/c;
for(i=l+1; i<n; i++) a[i][k] = a[i][k] + a[i][l]*a[l][k];
}
}
x[n-1] = a[n-1][n]/a[n-1][n-1];
for(i=n-2; i>=0; i--)
{
s =- a[i][n];
for(k=i+1; k<n; k++) s = s + a[i][k]*x[k];
x[i] = s;
}
return x;
}
float *LU(float A[3][3])
{
const N=3;
float L[N][N];
float U[N][N];
int i, j, k;
float temp;
float result[3];
for(i=0; i<N; i++) U[0][i] = A[0][i];
if(U[0][0] == 0) return NULL;
for(i=1; i<N; i++) L[i][0] = A[i][0] / A[0][0];
for(i=1; i<N; i++)
{
for(j=0; j<N; j++)
{
if(j < i)U[i][j] = 0.0;
else
{
temp = 0.0;
for(k = 0; k < i; k++) temp += L[i][k] * U[k][j];
U[i][j] = A[i][j] - temp;
}
}
for(j = 0; j < N; j++)
{
if(j < i + 1)
{
if(j == i)
{
L[j][i] = 1.0;
}
else
{
L[j][i] = 0.0;
}
}
else
{
temp = 0.0;
for(k = 0; k < i; k++)
{
temp += L[j][k] * U[k][i];
}
if(U[i][i] != 0)
{
L[j][i] = (1 / U[i][i]) * (A[j][i] - temp);
}
else return NULL;
}
}
}
L[0][0] = 1.0;
result[0] = A[0][3];
result[1] = A[1][3] - L[1][0] * result[0];
result[2] = A[2][3] - L[2][0] * result[0] - L[2][1] * result[1];
if(U[2][2] == 0 || U[1][1] == 0 || U[0][0] == 0) return NULL;
result[2] = result[2] / U[2][2];
result[1] = (result[1] - result[2] * U[1][2]) / U[1][1];
result[0] = (result[0] - result[1] * U[0][1] - result[2] * U[0][2]) / U[0][0];
return result;
}
float *Iter(float a[3][4], float eps)
{
const N = 3;
int i,j;
float norma;
double xn[N]={0};
float x[N];
float M[3][3];
float E[3][3] = {{1,0,0}, {0,1,0}, {0,0,1}};
for(i=0; i<3; i++)
for(j=0; j<3; j++)
M[i][j] = E[i][j] - a[i][j];
if(det(M) > 1.0) return NULL;
do{
norma = 0.0;
for(i=0; i<N; i++)
{
xn[i] = -B[i];
for(j=0; j<N; j++)
{
if(i!=j) xn[i] += a[i][j]*x[j];
}
xn[i] /= -a[i][i];
}
for(i=0; i<N; i++)
{
if(fabs(x[i]-xn[i]) > 1) return NULL;
if(fabs(x[i]-xn[i]) > norma) norma = fabs(x[i] - xn[i]);
x[i] = xn[i];
}
}
while(norma > eps);
return x;
}
float det(float A[3][3])
{
float det;
det = A[0][0]*(A[1][1]*A[2][2] - A[2][1]*A[1][2]) -
A[0][1]*(A[1][0]*A[2][2] - A[2][0]*A[1][2]) +
A[0][2]*(A[1][0]*A[2][1] - A[2][0]*A[1][1]);
return det;
};
float *matr(float AB[3][4])
{
float AA[4][3];
int i, j;
for(i=0; i<3; i++)
for(j=0; j<4; j++)
AA[j][i] = AB[i][j];
return AA[0];
}
void __fastcall TForm1::FormShow(TObject *Sender)
{
Form1->Label1->Caption = "0.34*x1 + 0.71*x2 + 0.63*x3 = 2.08\n"
"0.71*x1 - 0.65*x2 - 0.18*x3 = 0.17\n"
"1.17*x1 - 2.35*x2 + 0.75*x3 = 1.28\n";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Label2->Caption = "";
ListBox1->Clear();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
float result[3], *temp;
float tmp;
int i, j;
if(Form1->RadioButton1->Checked)
{
temp = new float[3];
temp = Gaus(AB);
for(i=0; i<3; i++) result[i] = *(temp+i);
delete temp;
Label2->Caption = RadioButton1->Caption;
for(i=0; i<3; i++)
{
Form1->ListBox1->AddItem("x" + IntToStr(i+1) + " = " + FloatToStr(result[i]), Form1->ListBox1);
Application->ProcessMessages();
}
return;
}
if(Form1->RadioButton2->Checked)
{
temp = new float[3];
temp = LU(A);
for(i=0; i<3; i++) result[i] = *(temp+i);
delete temp;
Label2->Caption = RadioButton2->Caption;
for(i=0; i<3; i++)
{
Form1->ListBox1->AddItem("x" + IntToStr(i+1) + " = " + FloatToStr(result[i]), Form1->ListBox1);
Application->ProcessMessages();
}
return;
}
if(Form1->RadioButton3->Checked)
{
temp = new float[3];
temp = Iter(AB, 0.001);
Label2->Caption = RadioButton3->Caption;
if(temp == NULL)
{
// ShowMessage("Процес рожбіжний!");
ListBox1->AddItem("Процес рожбіжний!", ListBox1);
delete temp;
return;
}
for(i=0; i<3; i++) result[i] = *(temp+i);
delete temp;
for(i=0; i<3; i++)
{
Form1->ListBox1->AddItem("x" + IntToStr(i+1) + " = " + FloatToStr(result[i]), Form1->ListBox1);
Application->ProcessMessages();
}
return;
}
if(Form1->RadioButton4->Checked)
{
Label2->Caption = RadioButton4->Caption;
ListBox1->AddItem(FloatToStr(det(A)), ListBox1);
return;
}
if(Form1->RadioButton5->Checked)
{
temp = new float[3];
for(i=0; i<4; i++)
{
temp = matr(AB);
for(j=0; j<3; j++) result[i] = *(temp+i);
for(j=0; j<3; j++)
{
Form1->ListBox1->AddItem(FloatToStr(result[i]) + " ", ListBox1);
Application->ProcessMessages();
}
Form1->ListBox1->AddItem("\n", ListBox1);
Application->ProcessMessages();
}
}
}
//---------------------------------------------------------------------------
Висновок:
На цих лабораторній роботі я оволодів засобами розв’язування систем лінійних рівнянь за допомогою різних методів .