Добавил:
Помогу с учёбой на Прикладной информатике, пишите, найдёте сами Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

СПИНТех - Прикладная информатика / ЧМ_ЛР-3_Толстов_П-31

.docx
Скачиваний:
11
Добавлен:
01.02.2023
Размер:
208.61 Кб
Скачать

Министерство образования и науки Российской Федерации

Федеральное государственное автономное образовательное

учреждение высшего образования

Национальный исследовательский университет “МИЭТ”

Институт Системной и программной инженерии и информационных технологий

Дисциплина: Численные методы

Лабораторная работа №3

«Решение систем линейных алгебраических уравнений итерационными

методами»

Вариант 21

Выполнил:

Студент П-31

Толстов Д.В.

Преподаватель:

Лавров И.В.

Москва 2022

Задание:

  1. С помощью программы сгенерировать матрицу 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

  1. Проверить условия сходимости итерационных методов для матрицы 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

  1. Вычислить решения с помощью метода простой итерации и Зейделя, количество итерации 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)

  1. Получить точное решение СЛАУ, вычислить вектор погрешности решений по методам простой итерации Зейделя и их нормы.

x=inv(A)*b

disp('Погрешность итерационного метода');

pi=x-xi

disp('Норма погрешности итерационного метода');

ni=norm(pi)

disp('Погрешность метода Зейделя');

pz=x-xz

disp('Норма погрешности метода Зейделя');

nz=norm(pz)

  1. Оценить относительную погрешность решения СЛАУ, если ∆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

Вывод: в ходе данной лабораторной работы мы научились использовать метод простых итераций и метод Зейделя для решения СЛАУ. Метод Зейделя обеспечивает лучшую сходимость, его погрешности и невязки оказались меньше, чем при использовании метода простых итераций.