ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 06.04.2021
Просмотров: 161
Скачиваний: 1
6.
19
,
27
x
1
+ 3
,
42
x
2
+ 4
,
27
x
3
+ 1
,
21
x
4
+ 2
,
32
x
5
= 33
,
91
4
,
18
x
1
+ 20
,
16
x
2
+ 5
,
18
x
3
+ 2
,
01
x
4
+ 1
,
03
x
5
= 52
,
72
1
,
32
x
1
+ 4
,
78
x
2
+ 17
,
97
x
3
+ 1
,
92
x
4
+ 1
,
36
x
5
= 32
,
13
5
,
21
x
1
+ 5
,
01
x
2
+ 1
,
31
x
3
+ 15
,
03
x
4
+ 2
,
70
x
5
= 34
,
27
3
,
93
x
1
+ 4
,
81
x
2
+ 1
,
23
x
3
+ 2
,
69
x
4
+ 18
,
78
x
5
= 36
,
25
7.
21
,
23
x
1
+ 3
,
04
x
2
+ 1
,
25
x
3
+ 2
,
97
x
4
+ 4
,
15
x
5
= 31
,
39
3
,
47
x
1
+ 15
,
76
x
2
+ 2
,
04
x
3
+ 3
,
56
x
4
+ 4
,
17
x
5
= 31
,
04
1
,
32
x
1
+ 2
,
29
x
2
+ 10
,
03
x
3
+ 4
,
01
x
4
+ 1
,
03
x
5
= 28
,
71
5
,
21
x
1
+ 3
,
87
x
2
+ 1
,
39
x
3
+ 12
,
94
x
4
+ 4
,
49
x
5
= 29
,
29
2
,
07
x
1
+ 5
,
32
x
2
+ 1
,
87
x
3
+ 3
,
54
x
4
+ 13
,
56
x
5
= 28
,
23
8.
15
,
21
x
1
+ 3
,
06
x
2
+ 2
,
31
x
3
+ 1
,
74
x
4
+ 3
,
78
x
5
= 28
,
41
1
,
87
x
1
+ 12
,
97
x
2
+ 2
,
45
x
3
+ 3
,
29
x
4
+ 1
,
79
x
5
= 24
,
82
2
,
34
x
1
+ 1
,
83
x
2
+ 10
,
15
x
3
+ 1
,
35
x
4
+ 1
,
98
x
5
= 27
,
80
4
,
25
x
1
+ 3
,
67
x
2
+ 3
,
77
x
3
+ 18
,
19
x
4
+ 1
,
02
x
5
= 34
,
67
1
,
84
x
1
+ 2
,
37
x
2
+ 1
,
03
x
3
+ 3
,
04
x
4
+ 10
,
07
x
5
= 19
,
38
9.
17
,
13
x
1
+ 3
,
21
x
2
+ 4
,
17
x
3
+ 1
,
23
x
4
+ 1
,
45
x
5
= 28
,
42
3
,
18
x
1
+ 18
,
32
x
2
+ 3
,
44
x
3
+ 1
,
31
x
4
+ 4
,
01
x
5
= 31
,
57
1
,
08
x
1
+ 3
,
34
x
2
+ 20
,
04
x
3
+ 2
,
07
x
4
+ 3
,
71
x
5
= 32
,
31
3
,
15
x
1
+ 4
,
79
x
2
+ 2
,
32
x
3
+ 15
,
17
x
4
+ 1
,
11
x
5
= 41
,
71
1
,
45
x
1
+ 3
,
79
x
2
+ 4
,
21
x
3
+ 1
,
58
x
4
+ 20
,
01
x
5
= 32
,
62
10.
15
,
98
x
1
+ 2
,
32
x
2
+ 4
,
78
x
3
+ 1
,
03
x
4
+ 1
,
07
x
5
= 26
,
21
1
,
32
x
1
+ 17
,
08
x
2
+ 2
,
71
x
3
+ 1
,
58
x
4
+ 4
,
53
x
5
= 28
,
80
5
,
18
x
1
+ 1
,
48
x
2
+ 19
,
18
x
3
+ 1
,
18
x
4
+ 2
,
13
x
5
= 30
,
33
2
,
47
x
1
+ 3
,
71
x
2
+ 1
,
57
x
3
+ 9
,
91
x
4
+ 0
,
54
x
5
= 28
,
11
1
,
45
x
1
+ 2
,
81
x
2
+ 4
,
07
x
3
+ 1
,
37
x
4
+ 10
,
96
x
5
= 22
,
03
1.7.
Примеры процедур в среде Maple
1.7.1.
Метод Гаусса
> restart;
11
> GaussSystem:=proc(a,b,n)
# a — массив коэффициентов матрицы А
# b — массив коэффициентов вектора B
# n — порядок системы линейных уравнений
local k,i,j,x,c,sum;
# k,i,j — переменные циклов
# x — массив неизвестных переменных (решение системы линейных
уравнений)
# прямой ход метода Гаусса (т.е. приведение системы к треугольному
виду)
for k from 1 to n-1 do
for i from k+1 to n do
c[i-1]:=a[i,k]/a[k,k];
b[i]:=b[i]-c[i-1]*b[k];
for j from k to n do
a[i,j]:=a[i,j]-c[i-1]*a[k,j];
end do;
end do; end do;
# обратный ход метода Гаусса
x[n]:=b[n]/a[n,n]:
for i from n-1 by (-1) to 1 do
sum:=0;
for j from i+1 to n do
sum:=sum+a[i,j]*x[j]:
end do;
x[i]:=(b[i]-sum)/a[i,i]:
end do;
for i from 1 to n do # вывод результата
print(evalf(x[i])):
end do;
end proc;
# ввод коэффициентов матрицы A и вектора B
> a[1,1]:=23.81837: a[1,2]:=2.33377: a[1,3]:=-0.73872: a[1,4]:=0.85797:
a[1,5]:=-0.67457:
> a[2,1]:=-1.59171: a[2,2]:=29.48598: a[2,3]:=1.81520: a[2,4]:=3.90203:
a[2,5]:=-0.57008:
> a[3,1]:=-0.15720: a[3,2]:=1.44805: a[3,3]:=21.33172: a[3,4]:=2.64148:
a[3,5]:=3.36273:
> a[4,1]:=-3.29147: a[4,2]:=2.64912: a[4,3]:=2.16798: a[4,4]:=26.72888:
a[4,5]:=1.21258:
12
> a[5,1]:=-1.55251: a[5,2]:=2.73236: a[5,3]:=2.00201: a[5,4]:=-1.97732:
a[5,5]:=29.53347:
> b[1]:=1.77836: b[2]:=0.10234: b[3]:=3.82426: b[4]:=-2.71881:
b[5]:=0.72844:
Проверим работу процедуры
> GaussSystem(a,b,5);
0.08367486810
0.01069853036
0.1913458028
-0.1083505631
0.007848515159
1.7.2.
Метод простой итерации
> restart;
> piter:=proc(a,b,x,t,n,eps) # Решение систем линейных уравнений
(Метод простых итераций)
# a — массив коэффициентов матрицы А
# b — массив коэффициентов вектора B
# x — произвольное начальное приближение к решению системы
# t — произвольная постоянная (
t
0
)
# n — порядок системы линейных уравнений
# eps — точность с которой требуется найти решение системы
local i,j,k,c,x1,f;
# i, j, k — переменные циклов
# с — массив элементов матрицы C: С=E-t*A
# x1 — приближение к точному решению системы
# f — логическая переменная
for i from 1 to n do
for j from 1 to n do
# заполнение массива элементами матрицы C: С=E-t*A
if i=j then c[i,j]:=1-t*a[i,j]
else c[i,j]:=-t*a[i,j]: end if;
end do; end do;
for i from 1 to n do x1[i]:=0;
for j from 1 to n do
x1[i]:=x1[i]+c[i,j]*x[j]; # вычисление первого приближения
end do;
x1[i]:=x1[i]+t*b[i];
13
end do;
f:=false;
for k from 1 to n do
# проверка условия выхода
if abs(x[k]-x1[k])>eps then f:=true; end if;
end do;
for i from 1 while(f=true) do
for j from 1 to n do
# переобозначение приближения к решению системы
x[j]:=x1[j]:
end do;
for k from 1 to n do x1[k]:=0;
for j from 1 to n do
# вычисление последующих приближений
x1[k]:=x1[k]+c[k,j]*x[j];
end do;
x1[k]:=x1[k]+t*b[k];
end do;
f:=false;
for k from 1 to n do
# проверка условия выхода
if abs(x[k]-x1[k])>eps then f:=true; end if;
end do;
end do;
for i from 1 to n do
print(x1[i]);
end do;
end proc;
# ввод коэффициентов матрицы
A
, вектора
B
и начального произ-
вольного приближения к решению системы
> a[1,1]:=7: a[1,2]:=5: b[1]:=19:
> a[2,1]:=1: a[2,2]:=3: b[2]:=5:
> x[1]:=0: x[2]:=0:
Проверим работу процедуры
> piter(a,b,x,0.0001,2,0.00001);
2.049543068
0.9501628063
14
1.7.3.
Метод Гаусса – Зейделя
> restart;
> Zeidel:=proc(a,b,x,n,eps)
# a — массив коэффициентов матрицы А
# b — массив коэффициентов вектора B
# x — произвольное начальное приближение к решению системы
# n — порядок системы линейных уравнений
# eps — точность с которой требуется найти решение системы
local i,j,k,z,x0,x1,f;
# i, j, k, z — переменные циклов
# x0 — предыдущее приближение к точному решению системы
# x1 — последующее приближение к точному решению системы
# f — логическая переменная
# поиск первого и второго приближения к решению системы линей-
ных уравнений
for i from 1 to n do x0[i]:=0; x1[i]:=0;
for j from 1 to n do
if (i<j)and(i<>j) then x0[i]:=x0[i]-a[i,j]*x[j]
elif (i>j)and(i<>j) then x0[i]:=x0[i]-a[i,j]*x1[j]; end if;
end do;
x1[i]:=1/a[i,i]*(b[i]+x0[i]);
end do;
f:=false;
for i from 1 to n do
# проверка условия выхода
if abs(x1[i]-x[i])>eps then f:=true end if;
end do;
for k from 1 while (f = true) do
for j from 1 to n do
x[j]:=x1[j];
end do;
for i from 1 to n do x0[i]:=0; x1[i]:=0;
for j from 1 to n do
if (i<j) and (i<>j) then x0[i]:=x0[i]-a[i,j]*x[j]
elif (i>j) and (i<>j) then x0[i]:=x0[i]-a[i,j]*x1[j]
end if;
end do;
x1[i]:=1/a[i,i]*(b[i]+x0[i]);
end do;
15