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

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

}

}

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

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

а) методом простой итерации;

б) методом Зейделя;

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