Advertisement
Guest User

Untitled

a guest
Dec 18th, 2017
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 4.19 KB | None | 0 0
  1. clc;
  2. clear; % Очистка командного окна
  3.  
  4. % Строим график функций
  5. f1 = @(x, y) sin(y)-2.*x;
  6. f2 = @(x, y) cos(x+0.5)+y;
  7.  
  8. y1=-1.5:0.05:0.5;
  9. x1=(sin(y1)/2)-1;
  10.  
  11. x2=0:0.05:2;
  12. y2=1-cos(x2+0.5);
  13.  
  14. % -1.5 <= x <= 0.5
  15. % 0 <= y <= 2
  16.  
  17.  
  18.  plot(x1,y1, 'b');
  19. hold on;
  20.   plot(x2,y2, 'r');
  21.  
  22.  
  23.  
  24.  
  25.  
  26. grid on; % Включаем координатную сетку
  27.  
  28. % Задаем символьные переменне, определяющие систему уравнений
  29. syms x;
  30. syms y;
  31. Vars = [x, y]; % Массив символьных выражений, определяющий переменные в функции
  32. F = [sin(y)-2.*x, cos(x+0.5)+y];
  33.  
  34.  
  35. % Начальное приближение
  36. X0 = [-1, 0]; %решение
  37.  
  38.  
  39. eps = 0.001; % Точность, с которой будем считать
  40.  
  41. % Решение системы методом простой итерации
  42. % Преобразуем уравнение F(X) = 0 в X = PHI(X)
  43. PHI = [sin(y)/2-1, 1-cos(x+0.5)];
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52. disp('Решение системы  cos(y+0.5)-x=2');
  53. disp('                sinx-2y=1');
  54. disp('Методом простой итерации');
  55. [solution1, iterCount] = SolveEquationSystem_SimpleIteration(PHI, Vars, X0, eps);
  56. disp(['Решение 1: ', num2str(solution1), '        Число итераций: ', num2str(iterCount)]);
  57.  
  58. function [Solution, nIteration] = SolveEquationSystem_SimpleIteration(PHI, Vars, X0, eps)
  59. % Нахождение решения системы нелинейных уравнений X = PHI(X) методом простой итерации
  60. % Возвращает найденное решение(вектор) и число произведенных итераций
  61. % PHI - вектор СИМВОЛЬНЫХ переменных, задающие систему функций phi1(X),..., phiN(X)
  62. % Vars - вектор символьных выражений, определяющих переменные в функциях PHI (например, [x, y, z])
  63. % X0 - начальное приближение решения(вектор)
  64. % eps - точность(допустимая абсолютная погрешность корня)
  65.  
  66.  
  67.  
  68.  
  69.  
  70. X = X0;
  71. n = 0; % Счетчик итераций
  72.  
  73. % Составляем якобиан
  74. len = length(PHI);% присваиваем переменной len размер вектора(число уравнений и неизвестных)
  75. JacobiMatrix = sym(zeros(len, len));
  76.  
  77. for i = 1:len
  78.      for j = 1:len
  79.          JacobiMatrix(i, j) = diff(PHI(i), Vars(j)); % заполняем элементы матрицы якоби (символьный вид)
  80.      end
  81. end
  82. JacobianSym = det(JacobiMatrix); % Якобиан - определитель матрицы Якоби(символьный вид)
  83.  
  84. while(true)
  85.     % Проверка на сходимость
  86.     JacobianNumber = double(subs(JacobianSym, Vars, X)); % Считаем Якобиан в точке X
  87.    
  88.     if (abs(JacobianNumber) >= 1) % Если он по модулю >= 0, то точка вне области сходимости метода
  89.         disp('Метод расходится.');
  90.         disp('Измените систему PHI и/или начальное приближение.');
  91.         Solution = NaN; % Возвращаем NaN <=> не удалось найти корень
  92.         nIteration = n;
  93.         return
  94.     end
  95.    
  96.    
  97.     XPrev = X; % Сохраняем в переменной XPrev предыдущее значение X
  98.     X = double(subs(PHI, Vars, X)); % Находим следующее значение X, подставляя в каждой функции
  99.                                     % вместо набора переменных Vars числа из вектора X
  100.     if (max(abs(X - XPrev)) < eps) % Если максимальная разница между следующией и предыдущей
  101.                                    % координатой вектора меньше eps, то прервать цикл
  102.         break;
  103.     end
  104.    
  105.     n = n + 1;
  106. end
  107.  
  108. Solution = X;
  109. nIteration = n;
  110.  
  111. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement