2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 [Matlab] Решение СЛАУ методом Зейделя
Сообщение28.10.2014, 07:52 
Доброго времени суток. Очень нужна помощь с лабой по ЧМ в Matlab. Буду рад за любые подсказки...
Решить систему алгебраических уравнений $A\vec{x}=\vec{b}$ методом Зейделя c точностью $\xi=10^{-12}$. Матрицу A взять в виде $A=m^{(-1)} R-E$, где m - желаемый порядок системы, а R и E - матрица, составленная из равномерно распределенных на отрезке от −1 до 1 (включительно) случайных чисел, и единичная матрица соответственно. Правая часть $\vec{b}$ в линейном уравнении - единичный вектор. По результатам вычисления построить графики зависимости точности решения и невязки от номера итерации. Для анализа использовать $\infty$ норму.

Написал такую программу, но есть подозрение что графики не те.
код: [ скачать ] [ спрятать ]
Используется синтаксис Matlab M
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


код: [ скачать ] [ спрятать ]
Используется синтаксис Matlab M
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

 
 
 
 Re: [Matlab] Лабы по Числ. Методам в Matlab HELP
Сообщение28.10.2014, 16:45 
Аватара пользователя
 i  Тема перемещена в Карантин.

1. Приведите условия задач непосредственно в теме.

2. Приведите свои попытки решения каждой задачи и объясните, что конкретно вызывает затруднения.

После того как исправите сообщение, сообщите об этом в теме Сообщение в карантине исправлено.

 
 
 
 Posted automatically
Сообщение14.12.2014, 10:53 
 i  Тема перемещена из форума «Карантин» в форум «Околонаучный софт»

 
 
 [ Сообщений: 3 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group