Advertisement
sashachca

5

Apr 17th, 2018
207
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Octave 2.34 KB | None | 0 0
  1. function full_solveNonlinearSys
  2. % Решение систем нелинейных уравнений
  3. printf('Systema Uravneniy:\n x1 - cos(x2) = 3\n x2 - sin(x1) = 3\n\n-----------\n');
  4.  
  5. printf('\nMetod prostyh iteraciy:\n');
  6. X = simpleIterations;
  7. Y = round(F(X));
  8. printf('\nF(%i, %i) = (%i, %i)\n-----------\n', X(1), X(2), Y(1), Y(2));
  9. %
  10. printf('\nMetod Zeidelya:\n');
  11. X = seidel;
  12. Y = round(F(X));
  13. printf('\nF(%i, %i) = (%i, %i)\n-----------\n', X(1), X(2), Y(1), Y(2));
  14.  
  15. printf('\nMetod Newtona:\n');
  16. X = newton;
  17. Y = round(F(X));
  18. printf('\nF(%i, %i) = (%i, %i)\n-----------\n', X(1), X(2), Y(1), Y(2));
  19.  
  20.   fprintf('\n\nOtvet:\n');
  21.   for i = 1:length(X)
  22.     fprintf('x%i = %i\n', i, X(i));
  23.   end
  24.  
  25.  
  26. endfunction
  27.  
  28. function X = simpleIterations
  29. % метод простых итераций
  30.  
  31.   X = X_old = [];
  32.   error = 1;
  33.   e = 0.0001;
  34.   q = 0;
  35.  
  36.   X = zeros(2, 1);
  37.   while error > e
  38.     X_old = X;
  39.    
  40.     X = G(X, ' ');
  41.     q = q+1;
  42.    
  43.     error = max(abs(X - X_old));
  44.   endwhile
  45.   X
  46.   printf('Iteracii: %i\n', q);
  47.  
  48. endfunction
  49.  
  50. function X = seidel
  51. % метод Зейделя
  52.  
  53.   X = X_old = [];
  54.   error = 1;
  55.   e = 0.0001;
  56.   q = 0;
  57.  
  58.   X = zeros(2, 1);
  59.   while error > e
  60.     X_old = X;
  61.    
  62.     X = G(X, 'seidel');
  63.     q = q+1;
  64.    
  65.     error = max(abs(X - X_old));
  66.   endwhile
  67.   X
  68.   printf('Iteracii: %i\n', q);
  69.  
  70. endfunction
  71.  
  72. function X = newton
  73. %метод Ньютона
  74.  
  75. error = 1;
  76. e = 0.0001;
  77. q = 0;
  78. X = [0; 0];
  79. while (error > e)
  80.   X_old = X;
  81.  
  82.   X = X.-inv(W(X))*F(X);
  83.  
  84.   q += 1;
  85.   error = abs(X - X_old);
  86. endwhile
  87. X
  88. printf('Iteracii: %i\n', q);
  89.  
  90. endfunction
  91.  
  92.  
  93. function W = W(X)
  94. W = [];
  95. W(1, 1) = 1;
  96. W(1, 2) = sin(X(2));
  97. W(2, 1) = -cos(X(1));
  98. W(2, 2) = 1;
  99.  
  100.  
  101. endfunction
  102.  
  103. function F = F(X)
  104.  
  105.   f1 = X(1) - cos(X(2)) - 3;
  106.   f2 = X(2) - sin(X(1)) - 3;
  107.   F = [f1; f2];
  108.  
  109. endfunction
  110.  
  111. function G = G(X, method)
  112. %преобразованные части системы функций F(X) для метода простых итераций и Зейделя
  113.    
  114.   g1 = cos(X(2)) + 3;
  115.  
  116.   if method == 'seidel'
  117.     t = g1; %сразу используем найденный x1, это уменьшает количество итераций
  118.   else t = X(1); %используем старый x1
  119.   endif
  120.  
  121.   g2 = sin(t) + 3;
  122.  
  123.   G = [g1; g2];
  124.  
  125. endfunction
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement