Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- clc;
- clear; % Очистка командного окна
- % Строим график функций
- f1 = @(x, y) sin(y)-2.*x;
- f2 = @(x, y) cos(x+0.5)+y;
- y1=-1.5:0.05:0.5;
- x1=(sin(y1)/2)-1;
- x2=0:0.05:2;
- y2=1-cos(x2+0.5);
- % -1.5 <= x <= 0.5
- % 0 <= y <= 2
- plot(x1,y1, 'b');
- hold on;
- plot(x2,y2, 'r');
- grid on; % Включаем координатную сетку
- % Задаем символьные переменне, определяющие систему уравнений
- syms x;
- syms y;
- Vars = [x, y]; % Массив символьных выражений, определяющий переменные в функции
- F = [sin(y)-2.*x, cos(x+0.5)+y];
- % Начальное приближение
- X0 = [-1, 0]; %решение
- eps = 0.001; % Точность, с которой будем считать
- % Решение системы методом простой итерации
- % Преобразуем уравнение F(X) = 0 в X = PHI(X)
- PHI = [sin(y)/2-1, 1-cos(x+0.5)];
- disp('Решение системы cos(y+0.5)-x=2');
- disp(' sinx-2y=1');
- disp('Методом простой итерации');
- [solution1, iterCount] = SolveEquationSystem_SimpleIteration(PHI, Vars, X0, eps);
- disp(['Решение 1: ', num2str(solution1), ' Число итераций: ', num2str(iterCount)]);
- function [Solution, nIteration] = SolveEquationSystem_SimpleIteration(PHI, Vars, X0, eps)
- % Нахождение решения системы нелинейных уравнений X = PHI(X) методом простой итерации
- % Возвращает найденное решение(вектор) и число произведенных итераций
- % PHI - вектор СИМВОЛЬНЫХ переменных, задающие систему функций phi1(X),..., phiN(X)
- % Vars - вектор символьных выражений, определяющих переменные в функциях PHI (например, [x, y, z])
- % X0 - начальное приближение решения(вектор)
- % eps - точность(допустимая абсолютная погрешность корня)
- X = X0;
- n = 0; % Счетчик итераций
- % Составляем якобиан
- len = length(PHI);% присваиваем переменной len размер вектора(число уравнений и неизвестных)
- JacobiMatrix = sym(zeros(len, len));
- for i = 1:len
- for j = 1:len
- JacobiMatrix(i, j) = diff(PHI(i), Vars(j)); % заполняем элементы матрицы якоби (символьный вид)
- end
- end
- JacobianSym = det(JacobiMatrix); % Якобиан - определитель матрицы Якоби(символьный вид)
- while(true)
- % Проверка на сходимость
- JacobianNumber = double(subs(JacobianSym, Vars, X)); % Считаем Якобиан в точке X
- if (abs(JacobianNumber) >= 1) % Если он по модулю >= 0, то точка вне области сходимости метода
- disp('Метод расходится.');
- disp('Измените систему PHI и/или начальное приближение.');
- Solution = NaN; % Возвращаем NaN <=> не удалось найти корень
- nIteration = n;
- return
- end
- XPrev = X; % Сохраняем в переменной XPrev предыдущее значение X
- X = double(subs(PHI, Vars, X)); % Находим следующее значение X, подставляя в каждой функции
- % вместо набора переменных Vars числа из вектора X
- if (max(abs(X - XPrev)) < eps) % Если максимальная разница между следующией и предыдущей
- % координатой вектора меньше eps, то прервать цикл
- break;
- end
- n = n + 1;
- end
- Solution = X;
- nIteration = n;
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement