- •Учреждение образования
- •Лабораторная работа №1 Тема: «Прямые методы решения систем линейных алгебраических уравнений»
- •Изученные теоретические вопросы: Метод Гаусса
- •Решение:
- •Лабораторная работа №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).
б) Метод Зейделя
Метод Зейделя представляет собой некоторую модификацию метода итерации. Основная его идея заключается в том, что при вычислении (к + 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 |