Последний раз редактировалось Draftsman 14.12.2014, 10:45, всего редактировалось 5 раз(а).
Доброго времени суток. Очень нужна помощь с лабой по ЧМ в Matlab. Буду рад за любые подсказки... Решить систему алгебраических уравнений ![$A\vec{x}=\vec{b}$ $A\vec{x}=\vec{b}$](https://dxdy-04.korotkov.co.uk/f/7/4/5/745ae5a99dedc57cbdfdbf0b176f642682.png) методом Зейделя c точностью ![$\xi=10^{-12}$ $\xi=10^{-12}$](https://dxdy-02.korotkov.co.uk/f/d/2/e/d2e4a984a4872c9c202c0a0211076b9282.png) . Матрицу A взять в виде ![$A=m^{(-1)} R-E$ $A=m^{(-1)} R-E$](https://dxdy-03.korotkov.co.uk/f/e/5/e/e5e9ebfd54555908292b2748769dd48e82.png) , где m - желаемый порядок системы, а R и E - матрица, составленная из равномерно распределенных на отрезке от −1 до 1 (включительно) случайных чисел, и единичная матрица соответственно. Правая часть ![$\vec{b}$ $\vec{b}$](https://dxdy-04.korotkov.co.uk/f/7/2/d/72dfde2d31e141084b736c9a435ad64d82.png) в линейном уравнении - единичный вектор. По результатам вычисления построить графики зависимости точности решения и невязки от номера итерации. Для анализа использовать ![$\infty$ $\infty$](https://dxdy-04.korotkov.co.uk/f/f/7/a/f7a0f24dc1f54ce82fecccbbf48fca9382.png) норму. Написал такую программу, но есть подозрение что графики не те.
clc
clear all
m=8;
E = eye(m) %единичная матрица м*м
n=2;
R =randi([-1,1]*10^n,m)/10^n %случайные значения от -1 до 1 в матрице
disp('Original Matrix')
A = m^-1*R-E % согласно условию
v=randn(1,m,'double');%произвольный вектор
disp('Normal Array B')
b=v/norm(v) %нормированный вектор по условию
eps = 10^-12; %значение точности
disp('Mistake threshold: ')
sprintf('%14.12f',eps)
[x,ct,Rn,Eps]=zeid(A,b,eps); %метод Зейделя
disp ('Result')
x
disp('Iterations')
ct
disp ('Residual:')
Rn
disp ('Mistake:')
Eps
disp('Validating the result...')
r=A*x; %проверяем правильность полученного решения. В положительном случае результат A*x будет равен b
Comparing=[r,b'] %оператор ' транспонирует матрицу
figure('Name','AnalysisD')
hold on
plot(ct,Rn,'-.','Color',[.9 .1 .1],'LineWidth',2), grid on;
xlabel ('Итерация'), ylabel ('Невязка')
title ('Анализ')
figure('Name','AnalysisE')
plot(ct,Eps,'Color',[.1 .1 .9],'LineWidth',2), grid on;
xlabel ('Итерация'), ylabel ('Точность')
title ('Анализ')
pause
close all
function [U,counts,Rn,E] = zeid(A,b,eps)
N = length(b) % длина вектора б
ct = 0;% Счетчик итераций
U = ones(1,N);% Вектор начальных значений
V = ones(1,N);% Вектор начальных значений
h = 1;% критерий остановки = norm(U(k+1)-U(k))/norm(U(k)
counts = [0 0]; %массив с номерами итераций (нужен для графиков)
Rn = [0 0]; %массив со значениями невязки по итерациям (нужен для графиков)
E = [0 0]; %массив со значениями точности по итерациям (нужен для графиков)
while h > eps %пока значение ошибки больше заданной точности
for i = 1:N
Prov = U;% Вектор для проверки h, хранит значение вектора на предыдущем шаге
if i == 1
V(1) = (b(1)-dot(A(1,2:N),U(1,2:N)))/A(1,1); %dot(а,b) - скалярное произведение векторов a и b
U(1) = V(1);
else
if i == N
V(N) = (b(N)-dot(A(N,1:N-1),U(1,1:N-1)))/A(N,N);
U(N) = V(N);
else
V(i) = (b(i)-dot(A(i,1:i-1),U(1,1:i-1))-dot(A(i,i+1:N),U(1,i+1:N)))/A(i,i);
U(i) = V(i);
end
end
end
ct=ct+1; %наращиваем счетчик итераций
Rn(ct)=norm((A*U')'-b,inf); %рассчитываем невязку по l-норме
counts(ct)=ct;%заносим в массив итераций текущую
%if ct > 2
h = norm(U-Prov)/norm(Prov);
%else
%h = 1;
%end
E(ct)=h;%заносим в массив точность
if ct == 2000
error('Zeid','Зацикливание метода')
end
end
U = U';
end
|