Численные методы решения систем линейных алгебраических уравнений.


Задание: Решить заданную систему III порядка:

а) Методом Гаусса (путем приведения системы к треугольному виду).
б) Эту же систему решить итерационным методом Гаусса-Зейделя с точностью .
Ход работы:
1. Решим заданную систему методом Гаусса
Для этого составим расширенную матрицу системы:
;
. Для проверки полученного решения вычислим значения невязок:
;

Ответ:
Решение системы: ; ; .
Значения последних невязок: ; ; .

2. Используя элементарные преобразования, приведем исходную систему уравнений III порядка к виду, удобному для применения метода Гаусса-Зейделя и решим систему уравнений этим методом, вычисляя на каждом шаге итерационного процесса значения невязок:
Для начала проверим сходимость итерационного процесса:

, следовательно, итерационный процесс будет сходиться.

.
Ответ: Решение системы: ; ; .

Составим программу метода Гаусса-Зейделя, выдающую значения иксов и невязок последней итерации:
#include<stdio.h>
#include<conio.h>
#include<math.h>
#define e 0.001
float a[3][3]={{5.3,3.4,0.9},
{3.8,7.5,2.5},
{3.4,4.1,10.3}},
b[3]={4.1,3.5,6.4},
x[3]={0,0,0};
float x_i(int i){
float q;
switch(i){
case 0:q=1/a[0][0]*(b[0]-a[0][1]*x[1]-a[0][2]*x[2]);break;
case 1:q=1/a[1][1]*(b[1]-a[1][0]*x[0]-a[1][2]*x[2]);break;
case 2:q=1/a[2][2]*(b[2]-a[2][0]*x[0]-a[2][1]*x[1]);break;
}
return q;
}
float b_i(int i){
return a[i][0]*x[0]+a[i][1]*x[1]+a[i][2]*x[2];
}
void main(){
clrscr();
int k=0,i,fl;
float r[3];
printf(«<<<Метод Гаусса-Зейделя>>>\n»);
for(;;){
fl=0;
for(i=0;i<3;i++)
x[i]=x_i(i);
for(i=0;i<3;i++){
r[i]=b[i]-b_i(i);
if(fabs(r[i])<e)fl++;
}
printf(«%d итерация: r1=%.7f\t\tr2=%.7f\t\tr3=%.7f\n»,k+1,fabs(r[0]),fabs(r[1]),fabs(r[2]));
if(fl==3){
printf(«\nx1=%.4f\nx2=%.4f\nx3=%.4f»,x[0],x[1],x[2]);
break;
}
k++;
}
getch();
}

Загрузка...