СПИНТех - Прикладная информатика / ЧМ_ЛР-3_Толстов_П-31
.docxМинистерство образования и науки Российской Федерации
Федеральное государственное автономное образовательное
учреждение высшего образования
Национальный исследовательский университет “МИЭТ”
Институт Системной и программной инженерии и информационных технологий
Дисциплина: Численные методы
Лабораторная работа №3
«Решение систем линейных алгебраических уравнений итерационными
методами»
Вариант 21
Выполнил:
Студент П-31
Толстов Д.В.
Преподаватель:
Лавров И.В.
Москва 2022
Задание:
С помощью программы сгенерировать матрицу A и вектор правых частей b для СЛАУ вида Ax=b.
n1=input('Введите номер группы: '); n2=input('Введите ваш номер в списке группы: '); n=n1+n2; rand('seed',n); A=rand(7); b=10*rand(7,1); Au=triu(A); Al=tril(A); Ad=diag(diag(A)); su=sum(sum(abs(Au))); sl=sum(sum(abs(Al))); Su=sum(abs(Au)); Sl=sum(abs(Al)); sigma=5; O=ones(7); Ou=triu(O); S6=diag(sigma*(Su./Sl)); At=sigma*((Al+Ou)./(Au'+Ou)); neo=rem(n2,2); mode=rem(n2,3); if (mode==0) Al=(sigma*su/sl)*Al; end if (mode==1) Al=S6*Al; end if (mode==2) Al=At.*Al; end A=Al+Ad+Au; ma=max(max(abs(A))); if (ma>1000) A=0.08*A; end |
Проверить условия сходимости итерационных методов для матрицы A. При необходимости преобразовать матрицу A к виду, позволяющему вычислить решения.
-
count=0;
for i=1:7
s=0;
for j=1:7
if i~=j
s=s+abs(A(i,j));
else s=s+0;
endif
endfor
if abs(A(i,i))<s
count=count+1;
A(i,i)=s+1;
endif
endfor
if count>0
disp('Не было выполнено условие сходимости, матрица изменена')
A
else
disp('Условие сходимости выполнено')
endif
count
Вычислить решения с помощью метода простой итерации и Зейделя, количество итерации n = 20. Построить графики зависимости xi от n. Вычислить вектор невязки решения и ее норму.
Метод простой итерации:
Теория:
Метод простой итерации решения СЛАУ Для использования этого метода исходное уравнение Ax = b преобразуется к виду х = Bx + c. Процесс вычисления решения начинается с выбора начального приближения. Подставляя его в правую часть системы и вычисляя полученное выражение, находим первое приближение x^(1), подставляя его аналогичным образом в уравнение, получаем второе приближение x^(2). Продолжая этот процесс, получаем последовательность приближений { x^(0), x^(1), … , x^(k), … } , вычисляемых по формуле х^(k+1) = Bx^(k) + c. Сходимость метода простой итерации определяется следующими утверждениями. При выполнении условия ||B|| < 1 справедливо: 1) решение системы существует и единственно; 2) при произвольном начальном приближении x^(0) метод простой итерации сходится и справедлива оценка погрешности ||x^(n) -x*|| ≤ ||B||^n * ||x^(0) -x*||, где x* - точное решение. Для сходимости метода простой итерации достаточно, чтобы матрица A была близка к матрице с преобладанием диагональных элементов. Из оценки погрешности следует, что при выполнении условия ||B|| < 1 метод простой итерации сходится со скоростью геометрической прогрессии, знаменатель которой q = ||B|| . Скорость сходимости тем выше, чем меньше величина ||B||. Критерием окончания итерационного процесса выбирают условие ||B|| / (1 - ||B||) * ||x^(n) -x^(n-1)|| ≤ ε. |
||
|
B=[]; C=[]; for i=1:7 for j=1:7 if i~=j B(i,j)=-A(i,j)/A(i,i); else B(i,j)=0; endif endfor C(i)=b(i)/A(i,i); end; C=C' B xi=[1;1;1;1;1;1;1]; xii=xi; for cl=1:20 xi=B*xi+C; xii=[xii xi]; end n=[0:20]; hold on for i=1:7 plot(n,xii(i,:)) end disp('Решение'); xi disp('Невязка'); nev=A*xi-b disp('Норма невязки'); nevN=norm(nev) |
|
|
|
Метод Зейделя:
Теория:
Метод Зейделя Основная идея метода состоит в том, что при вычислении очередного (k+1)-го приближения к неизвестному xi, при i >1 используются уже найденные (k+1)-е приближения к неизвестным x1, x2, … , xi, а не k -е приближение, как в методе простой итерации. Как и для любого итерационного процесса при использовании метода Зейделя возникают два вопроса: каковы достаточные условия сходимости и каков критерий окончания итерационного процесса. При выполнении условия ||Bl|| + ||Bu|| < 1 метод Зейделя сходится при любом выборе начального приближения и верна оценка погрешности ||x^(n) -x*|| ≤ q^n * ||x(0) – x*|| , где q = ||Bu|| / (1 - ||Bl||) < 1. Если требуется найти решение системы с точностью ε , то итерации по методу Зейделя следует вести до выполнения неравенства ||x^(n) -x^(n-1)|| * ||Bu|| / (1 - ||Bl||) ≤ ε , что является критерием окончания итерационного процесса.
|
Скрипт и результат:
Bl=tril(B); Bu=triu(B); xz=[1;1;1;1;1;1;1]; xzz=xz; E=eye(size(A)); M=(E-Bl)^-1; for i=1:20 xz=M*(Bu*xz+C); xzz=[xzz xz]; end figure hold on for i=1:7 plot(n,xzz(i,:)) end disp('Решение'); xz disp('Невязка'); nevz=A*xz-b disp('Норма невязки'); nevNz=norm(nevz) |
|
|
Получить точное решение СЛАУ, вычислить вектор погрешности решений по методам простой итерации Зейделя и их нормы.
x=inv(A)*b disp('Погрешность итерационного метода'); pi=x-xi disp('Норма погрешности итерационного метода'); ni=norm(pi) disp('Погрешность метода Зейделя'); pz=x-xz disp('Норма погрешности метода Зейделя'); nz=norm(pz) |
Оценить относительную погрешность решения СЛАУ, если ∆A определяется десятипроцентным увеличением диагональных элементов, а ∆b таким же уменьшением всех элементов.
db=-b*0.1 Ap=A; for i=1:7 for j=1:7 if i=j Ap(i,j)=Ap(i,j)*1.1; endif endfor end dA=Ap-A disp('Относительная погрешность'); op=cond(A)/(1-cond(A)*norm(dA)/norm(A))*(norm(dA)/norm(A)+norm(db)/norm(b)) disp('Относительная погрешность итерационного метода'); opi=norm(xi-x)/norm(x) disp('Относительная погрешность метода Зейделя'); opz=norm(xz-x)/norm(x) |
Результат |
Х |
Погрешность |
Невязка |
Метод |
|||
Простые итерации |
0.915265 0.364558 0.290662 -0.259667 0.688857 -0.074731 -0.144049 |
-1.2033e-02 -8.3778e-03 -1.2976e-02 -1.3795e-02 -1.3425e-02 -1.4616e-02 -1.4570e-02 |
0.1001 0.1029 0.2658 0.2927 0.2873 0.5336 0.3872 |
Зейделя |
0.903231 0.356180 0.277686 -0.273462 0.675432 -0.089347 -0.158619 |
-1.1102e-16 0 -1.1102e-16 0 -1.1102e-16 6.9389e-17 -1.3878e-16 |
8.8818e-16 -4.4409e-16 0 4.4409e-16 0 0 0 |
Точное решение |
0.903231 0.356180 0.277686 -0.273462 0.675432 -0.089347 -0.158619 |
0 |
0 |
Вывод: в ходе данной лабораторной работы мы научились использовать метод простых итераций и метод Зейделя для решения СЛАУ. Метод Зейделя обеспечивает лучшую сходимость, его погрешности и невязки оказались меньше, чем при использовании метода простых итераций.