- •Министерство образования республики беларусь
- •Код программы
- •Результат работы программы
- •Лабораторная работа №2
- •Лабораторная работа №3
- •Лабораторная работа №4
- •Лабораторная работа №5
- •Лабораторная работа №6
- •Лабораторная работа №7
- •Лабораторная работа №8
- •Лабораторная работа №9
- •Лабораторная работа №10
Лабораторная работа №9
Постановка задачи
Решить систему уравнений:
,
,n- номер варианта.
а) методом простой итерации;
б) методом Зейделя;
Теоретические сведения
а) методом простой итерации;
При большом числе неизвестных линейной системы схема метода Гаусса, дающая точное решение, становится весьма сложной. В этих условиях для нахождения корней системы иногда удобнее пользоваться приближенными численными методами. Изложим здесь один из этих методов — метод итерации.
Пусть дана линейная система
(4.26)
Введя в рассмотрение матрицы
A= x = ,b= ,
систему (4.26) коротко можно записать в виде матричного уравнения
Ах = b. Предполагая, что диагональные коэффициенты aii ≠ 0 ( i = 1, 2, .... n),
разрешим первое уравнение системы (4.26) относительно х1, второе - относительно х2 и т. д. Тогда получим эквивалентную систему
x1 = β1 + α12 x2 + α13 x3 + …+ α1n xn ,
x2 = β2 + α21 x1 + α23 x3 + …+ α2n xn , (4.27)
……………………………………..
xn = βn + αn1 x1 + αn2 x2 + …+ αn,n-1 xn-1 ,
где при i ≠ j
и αij = 0 при i = j ( i,j = 1, 2, .... n).
Введя матрицы
а =и β = ,
систему (4.27) можем записать в матричной форме
х = β + α x (4.28)
Систему (4.27) будем решать методом последовательных приближений. За нулевое приближение принимаем столбец свободных членов х (0) = β
Далее, последовательно строим матрицы-столбцы
первое приближение - х(1) = β + α x (0)
второе приближение - х(2) = β + α x (1) и т. д.
Вообще говоря, любое (k+1)-е приближение вычисляют по формуле
х(k+1) = β + α x (k) (k = 0, 1, 2, . . .). (4.29)
Если последовательность приближений x (0) , x (1) , ....., x (k) , …. имеет предел
x = lim x (k) при к → 0, то этот предел является решением системы (4.27). В самом деле, переходя к пределу в равенстве (4.29), будем иметь:
lim x (k+1) = β + lim x (k)
или х = β + α x, т. е. предельный вектор х является решением системы (4.28), а следовательно, и системы (4.26).
Заметим, что иногда выгоднее приводить систему (4.26) к виду (4.27) так, чтобы коэффициенты аи не были равны нулю.
Метод последовательных приближений, определимых формулами (4.27) или (4.29), носит название метода итерации. Процесс итерации (4.29) хорошо сходится, т. е. число приближений, необходимых для получения корней системы (4.26) с заданной точностью, невелико, если элементы матрицы α малы по абсолютной величине. Иными словами, для успешного применения процесса итерации модули диагональных коэффициентов системы (4.26) должны быть велики по сравнению с модулями недиагональных коэффициентов этой системы (свободные члены при этом роли не играют).
б) методом Зейделя;
Метод Зейделя представляет собой некоторую модификацию метода итерации. Основная его идея заключается в том, что при вычислении (к + 1)-го приближения неизвестной xi учитываются уже вычисленные ранее (к + 1) - e приближения неизвестных x1, х2,….
Заметим, что указанная выше условие сходимости для простой итерации остается верной для итерации по методу Зейделя.
Обычно метод Зейделя дает лучшую сходимость, чем метод простой итерации, но, вообще говоря, он приводит к более громоздким вычислениям. Процесс Зейделя может сходиться даже в том случае, если расходится процесс итерации. Однако это бывает не всегда. Возможны случаи, когда процесс Зейделя сходится медленнее процесса итерации. Более того, могут быть случаи, когда процесс итерации сходится, а процесс Зейделя расходится.
Решение системы х* находится как предел последовательностивычисляемой по правилу
i=l, 2, ..., п,
где aij- элементы матрицыА, bi- компоненты вектора b; диагональные элементы матрицы А предполагаются отличными от нуля. Вычисления (*) отличаются отпростой итерации методалишь тем, что на k-м шаге при вычислении i-й компоненты учитываются вычисленныеk-вприближения первых (i-1) компонент.
В матричной записи 3. м. представляется следующим образом. Если А=В+С,где
то соотношение (*) соответствует матричному соотношению x(k)=-В -1 Сх(k-1)+В -1b. З. м. равносилен методу простой итерации, примененному к системе x=-B-1Cx+B-1b,эквивалентной исходной. Для сходимости 3. м. необходимо и достаточно, чтобы все собственные значения матрицыВ -1 Спо модулю были меньше 1. Иначе, чтобы все корни уравнения det(C+Вl)=0были по модулю меньше 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,k,n;
float a[10][10],b[10],x[1001][10],A[10][10],B[10];
n = StrToInt(Edit1->Text);
for (i = 0; i < n; i++)
for(j = 0; j < n; j++)
a[i][j] = StrToFloat(SG1->Cells[j][i]) ;
for(j = 0; j < n; j++)
b[j] = StrToFloat(SG2->Cells[0][j]) ;
for(i = 0; i < n; i++) {
B[i] = b[i]/a[i][i];
for(j = 0; j < n; j++)
A[i][j]=(-1)*a[i][j]/a[i][i];
A[i][i]=0;
}
for(i = 0; i < n; i++) {
x[0][i] = B[i];
}
for(k = 1; k < 1000; k++)
for(i = 0; i < n; i++) {
float h = 0;
for(j = 0; j < n; j++)
h += A[i][j]*x[k-1][j];
x[k][i] = B[i] + h;
}
for(i = 0; i < n; i++)
TSG1->Cells[0][i] = FloatToStr(x[999][i]);
float f1[10];
for(i = 0; i < n; i++) {
f1[i] = 0;
for(j = 0; j < n; j++) {
f1[i] += a[i][j]*x[999][j];
}
TSG2->Cells[0][i] = FloatToStr(f1[i]);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::UpDown1Click(TObject *Sender, TUDBtnType Button)
{
SG1->RowCount = StrToInt(Edit1->Text);
SG2->RowCount = StrToInt(Edit1->Text);
SG1->ColCount = StrToInt(Edit1->Text);
TSG1->RowCount = StrToInt(Edit1->Text);
TSG2->RowCount = StrToInt(Edit1->Text);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
SG1->Cells[0][0] = "9,2";
SG1->Cells[1][0] = "2";
SG1->Cells[2][0] = "3";
SG1->Cells[0][1] = "2";
SG1->Cells[1][1] = "8,2";
SG1->Cells[2][1] = "4";
SG1->Cells[0][2] = "3";
SG1->Cells[1][2] = "4";
SG1->Cells[2][2] = "12,2";
SG2->Cells[0][0] = "38,2";
SG2->Cells[0][1] = "22";
SG2->Cells[0][2] = "39";
}
//---------------------------------------------------------------------------
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] = "";
SG2->Cells[i][j] = "";
}
}
//---------------------------------------------------------------------------
б) методом Зейделя;
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,k,n;
float a[10][10],b[10],x[1001][10],A[10][10],B[10];
n = StrToInt(Edit1->Text);
for (i = 0; i < n; i++)
for(j = 0; j < n; j++)
a[i][j] = StrToFloat(SG1->Cells[j][i]) ;
for(j = 0; j < n; j++)
b[j] = StrToFloat(SG2->Cells[0][j]) ;
for(i = 0; i < n; i++) {
B[i] = b[i]/a[i][i];
for(j = 0; j < n; j++)
A[i][j]=(-1)*a[i][j]/a[i][i];
A[i][i]=0;
}
for(i = 0; i < n; i++) {
x[0][i] = B[i];
}
for(k = 1; k < 1000; k++)
for(i = 0; i < n; i++) {
float h = 0;
if(k == 1)
for(j = 0; j < n; j++)
h += A[i][j]*x[k-1][j];
else
for(j = 0; j < i; j++)
h += A[i][j]*x[k][j];
for(j = i; j < n; j++)
h += A[i][j]*x[k-1][j];
x[k][i] = B[i] + h;
}
for(i = 0; i < n; i++)
TSG1->Cells[0][i] = FloatToStr(x[999][i]);
float f1[10];
for(i = 0; i < n; i++) {
f1[i] = 0;
for(j = 0; j < n; j++) {
f1[i] += a[i][j]*x[999][j];
}
TSG2->Cells[0][i] = FloatToStr(f1[i]);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::UpDown1Click(TObject *Sender, TUDBtnType Button)
{
SG1->RowCount = StrToInt(Edit1->Text);
SG2->RowCount = StrToInt(Edit1->Text);
SG1->ColCount = StrToInt(Edit1->Text);
TSG1->RowCount = StrToInt(Edit1->Text);
TSG2->RowCount = StrToInt(Edit1->Text);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
SG1->Cells[0][0] = "9,2";
SG1->Cells[1][0] = "2";
SG1->Cells[2][0] = "3";
SG1->Cells[0][1] = "2";
SG1->Cells[1][1] = "8,2";
SG1->Cells[2][1] = "4";
SG1->Cells[0][2] = "3";
SG1->Cells[1][2] = "4";
SG1->Cells[2][2] = "12,2";
SG2->Cells[0][0] = "38,2";
SG2->Cells[0][1] = "22";
SG2->Cells[0][2] = "39";
}
//---------------------------------------------------------------------------
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] = "";
SG2->Cells[i][j] = "";
}
}
//---------------------------------------------------------------------------
Результат работы программы
а) методом простой итерации;
б) методом Зейделя;