Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методичка только 2 cem си++l.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
265.22 Кб
Скачать

Лабораторная работа №2 Решение систем линейных уравнений. Прямые и итерационные методы.

Постановка задачи: Дана система линейных уравнений

A11*x1+A12*x2+A13*x3+A14*x4=B1

A21*x1+A22*x2+A23*x3+A24*x4=B2

A31*x1+A32*x2+A33*x3+A34*x4=B3

A41*x1+A42*x2+A43*x3+A44*x4=B4

  • найти точное решение методом Гаусса

  • найти приближённое решение методом простой итерации с точностью ε

  • найти приближённое решение методом Зейделя с точностью ε

Название метода

Начальное приближение

Итерационная формула

Остановка процесса вычисления

Метод Гаусса

Определитель матрицы не равен нулю

Прямой ход – приведение матрицы к треугольному виду

Обратный ход – вычисление неизвестных, начиная с последнего уравнения

Получение значений всех неизвестных

Метод простой итерации

Проверка условия сходимости

|A11|>|A12|+|A13|+|A14|

|A22|>|A21|+|A23|+|A24|

|A33|>|A31|+|A32|+|A34|

|A44|>|A41|+|A42|+|A43|

Выбор начального приближения

x10=0 x20=0 x30=0 x40=0

x1i+1=(B1-( A12*x2i+A13*x3i+A14*x4i))/ A11

x2i+1=(B2-( A21*x1i+A23*x3i+A24*x4i))/ A22

x3i+1=(B3-( A31*x1i+A32*x2i+A34*x4i))/ A33

x4i+1=(B4-( A41*x1i+A42*x2i+A43*x3i))/ A44

|x1i+1-x1i|<ε

|x2i+1-x2i|<ε

|x3i+1-x3i|<ε

|x4i+1-x4i|<ε

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

Проверка условия сходимости

|A11|>|A12|+|A13|+|A14|

|A22|>|A21|+|A23|+|A24|

|A33|>|A31|+|A32|+|A34|

|A44|>|A41|+|A42|+|A43|

Выбор начального приближения

x10=0 x20=0 x30=0 x40=0

x1i+1=(B1-( A12*x2i+A13*x3i+A14*x4i))/ A11

x2i+1=(B2-( A21*x1i+1+A23*x3i+A24*x4i))/ A22

x3i+1=(B3-( A31*x1i+1+A32*x2i+1+A34*x4i))/ A33

x4i+1=(B4-( A41*x1i+1+A42*x2i+1+A43*x3i+1))/ A44

|x1i+1-x1i|<ε

|x2i+1-x2i|<ε

|x3i+1-x3i|<ε

|x4i+1-x4i|<ε

Метод Гаусса

Постановка задачи: Дана система линейных уравнений

A11*x1+A12*x2+A13*x3+A14*x4=B1

A21*x1+A22*x2+A23*x3+A24*x4=B2

A31*x1+A32*x2+A33*x3+A34*x4=B3

A41*x1+A42*x2+A43*x3+A44*x4=B4

найти точное решение методом Гаусса.

Запись системы линейных уравнений в матричном виде

Программа на языке CИ

#include <iostream>

#include <cmath>

#include <iomanip>

using namespace std;

int main()

{ double a[4][4]={{5,1,1,1},{1,7,1,1},{1,1,6,1},{1,1,1,4}};

double b[4]={8,10,9,7};

double x[4];

int n,k,i,j;

n=4;

double c,s;

for(k=0;k<n-1;k++)

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

{

c=a[i][k]/a[k][k];

a[i][k]=0;

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

a[i][j]=a[i][j]-c*a[k][j];

b[i]=b[i]-c*b[k];

}

x[n-1]=b[n-1]/a[n-1][n-1];

for (i=n-1;i>=0;i--)

{

s=0;

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

{s=s+a[i][j]*x[j];

x[i]=(b[i]-s)/a[i][i];

}

}

cout<<"reshenie"<<endl;

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

cout<<x[i];

return 0;}

Метод простой итерации.

Постановка задачи: Дана система линейных уравнений. Найти приближённое решение с точностью е.

Программа на языке CИ

#include <iostream>

#include <cmath>

#include <iomanip>

using namespace std;

int main()

{ double

A[4][4]={{5,1,1,1},{1,7,1,1},{1,1,6,1},{1,1,1,4}};

double B[4]={8,10,9,7};

double X0[4],X1[4];

double eps,tochnost,max_tochnost,s;

int k,kmax,i,j;

cout<<"Vvedite tochnost"<<endl;

cin>>eps;

cout<<"Vvedite max chislo iter"<<endl;

cin>>kmax;

cout.precision(5);

cout.setf(ios::left);

for(i=0;i<4;i++) X0[i]=0;

k=0;

while(fabs(max_tochnost)>eps)

{

if(k>=kmax) break;

k=k+1;

cout<<setw(5)<<k;

max_tochnost=-100;

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

{s=0;

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

if(i!=j) s=s+A[i][j]*X0[j];

X1[i]=(B[i]-s)/A[i][i];

cout<<setw(10)<<X1[i];

tochnost=fabs(X1[i]-X0[i]);

if(tochnost>max_tochnost)

max_tochnost=tochnost;

}

cout<<endl;

for(i=0;i<4;i++) X0[i]=X1[i];

}

cout<<endl;

cout<<"Otvet"<<endl;

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

cout<<setw(10)<<X1[i];

cout<<endl;

cout<<"Chislo iter="<<k;

return 0;}

Метод Зейделя.

Постановка задачи: Дана система линейных уравнений. Найти приближённое решение с точностью е.

Программа на языке CИ

#include <iostream>

#include <cmath>

#include <iomanip>

using namespace std;

int main()

{ double A[4][4]={{5,1,1,1},{1,7,1,1},{1,1,6,1},{1,1,1,4}};

double B[4]={8,10,9,7};

double X0[4],X1[4];

double eps,tochnost,max_tochnost,s;

int k,kmax,i,j;

cout<<"Vvedite tochnost"<<endl;

cin>>eps;

cout<<"Vvedite max chislo iter"<<endl;

cin>>kmax;

cout.precision(5);

cout.setf(ios::left);

for(i=0;i<4;i++) X0[i]=0;

k=0;

while(fabs(max_tochnost)>eps)

{

if(k>=kmax) break;

k=k+1;

cout<<setw(5)<<k;

max_tochnost=-100;

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

{s=0;

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

if(i!=j) s=s+A[i][j]*X0[j];

X1[i]=(B[i]-s)/A[i][i];

cout<<setw(10)<<X1[i];

tochnost=fabs(X1[i]-X0[i]);

if(tochnost>max_tochnost)

max_tochnost=tochnost;

X0[i]=X1[i];

}

cout<<endl;

}

cout<<endl;

cout<<"Otvet"<<endl;

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

cout<<setw(10)<<X1[i];

cout<<endl;

cout<<"Chislo iter="<<k;

return 0;}