Последний раз редактировалось Draftsman 14.12.2014, 10:45, всего редактировалось 5 раз(а).
Доброго времени суток. Очень нужна помощь с лабой по ЧМ в Matlab. Буду рад за любые подсказки... Решить систему алгебраических уравнений методом Зейделя c точностью . Матрицу A взять в виде , где m - желаемый порядок системы, а R и E - матрица, составленная из равномерно распределенных на отрезке от −1 до 1 (включительно) случайных чисел, и единичная матрица соответственно. Правая часть в линейном уравнении - единичный вектор. По результатам вычисления построить графики зависимости точности решения и невязки от номера итерации. Для анализа использовать норму. Написал такую программу, но есть подозрение что графики не те.
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
|