Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Moy_otchyot2.docx
Скачиваний:
8
Добавлен:
25.03.2015
Размер:
269.22 Кб
Скачать

Лабораторная работа № 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).

б) Метод Зейделя

Метод Зейделя представляет собой некоторую модификацию метода итерации. Основная его идея заключается в том, что при вычислении (к + 1)-го приближения неизвестной xi учитываются уже вычислен­ные ранее (к + 1) - e приближения неизвестных x1, х2,….

Заметим, что указанная выше условие сходимости для про­стой итерации остается верной для итерации по методу Зейделя.

Обычно метод Зейделя дает лучшую сходимость, чем метод про­стой итерации, но, вообще говоря, он приводит к более громоздким вычислениям. Процесс Зейделя может сходиться даже в том случае, если расходится процесс итерации. Однако это бывает не всегда. Возможны случаи, когда процесс Зейделя сходится медленнее процесса итерации. Более того, могут быть случаи, когда процесс итерации сходится, а процесс Зейделя расходится.

Решение:

#include <vcl.h>

#include <math.h>

#include <stdio.h>

#include <conio.h>

void main(){

clrscr();

float a[3][3]={{9.12,2,3},{2,8.12,4},{3,4,12.12}};

float b[3]={35.36,22.12,37.24};

int n=3,m=4,k;

float a1[3][4],d,x[3],x1[3],s,B[3];

int i,j,r;

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

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

a1[i][j]=a[i][j];

printf("\n isxodnai matritha:\n");

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

{

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

if (j!=n) printf("%2.2f ",a1[i][j]);

else printf("%2.2f",b[i]);

printf("\n");

}

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

{

d=a1[i][i];

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

if (i==j) a1[i][i]=0;

else a1[i][j]/=(-1)*d;

b[i]/=d;

}

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

x1[i]=b[i];

for (k=1;k<1000;k++)

{

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

{

s=0;

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

s+=a1[i][j]*x1[j];

x[i]=b[i]+s;

}

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

x1[i]=x[i];

}

printf("\n vector X:\n");

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

printf("%2.2f ",x[i]);

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

{

B[i]=0;

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

B[i]+=a[i][j]*x[j];

}

printf("\n");

printf("\n proverka  AxX:\n");

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

printf("%2.2f ",B[i]);

getch();

}

Результат:

Введенные данные

Полученный результат

Проверка

9.12 2 3 35.36

2 8.12 4 22.12

3 4 12.12 37.24

3

1

2

35.36

22.12

37.24

2.

#include <vcl.h>

#include <math.h>

#include <stdio.h>

#include <conio.h>

void main(){

clrscr();

float a[3][3]={{9.12,2,3},{2,8.12,4},{3,4,12.12}};

float b[3]={35.36,22.12,37.24};

int n=3,m=4,k;

float a1[3][4],d,x[3],x1[3],s,B[3];

int i,j,r,kol;

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

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

a1[i][j]=a[i][j];

printf("\isxodnai matritha :\n");

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

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

if (j!=n) printf("%2.2f ",a1[i][j]);

else printf("%2.2f",b[i]);

printf("\n");

}

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

d=a1[i][i];

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

if (i==j) a1[i][i]=0;

else a1[i][j]/=(-1)*d;

b[i]/=d;

}

x1[0]=b[0];

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

x1[i]=0;

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

{

x[i]=b[i];

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

x[i]+=a1[i][k]*x[k];

for(k=i+1;k<n;k++)

x[i]+=a1[i][k]*x1[k];

}

while(1)

{

kol=0;

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

if (fabs(x[j]-x1[j])<0.000001) kol++;

if (kol!=n){

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

x1[i]=x[i];

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

{

x[i]=b[i];

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

x[i]+=a1[i][k]*x[k];

for(k=i+1;k<n;k++)

x[i]+=a1[i][k]*x1[k];

}

}

else break;

}

printf("\n vector X:\n");

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

printf("%2.2f ",x[i]);

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

{

B[i]=0;

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

B[i]+=a[i][j]*x[j];

}

printf("\n \n proverka  AxX:\n");

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

printf("%2.2f ",B[i]);

getch();

}

Результат:

Введенные данные

Полученный результат

Проверка

9.12 2 3 35.36

2 8.12 4 22.12

3 4 12.12 37.24

3

1

2

35.36

22.12

37.24

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