Advertisement
nicuvlad76

Untitled

Jan 18th, 2024
565
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.03 KB | None | 0 0
  1. import numpy as np
  2.  
  3. def newton(F, dF, x0, delta=1e-4, epsilon=1e-4, maxIter=100):
  4.     """
  5.    Algoritmul lui Newton pentru găsirea rădăcinilor funcției F: R^n -> R^n.
  6.  
  7.    Parametri:
  8.    - F: Funcția pentru care căutăm rădăcina.
  9.    - dF: Derivata primei funcții (jacobianul) a funcției F.
  10.    - x0: Valoarea de pornire (punctul inițial).
  11.    - delta: Exactitatea pentru criteriul de întrerupere ||F(x^k)||_2 < delta.
  12.    - epsilon: Exactitatea pentru criteriul de întrerupere ||x^(k+1) - x^k||_2 < epsilon.
  13.    - maxIter: Numărul maxim de iterații.
  14.  
  15.    Returnează:
  16.    - x: Aproximarea rădăcinii găsite.
  17.    - iter_count: Numărul de iterații efectuate.
  18.    """
  19.     x = x0
  20.     iter_count = 0
  21.  
  22.     while iter_count < maxIter:
  23.         F_value = F(x)
  24.         JF_value = dF(x)
  25.  
  26.         # Verificăm criteriul de întrerupere
  27.         if np.linalg.norm(F_value, 2) < delta:
  28.             print(f"Convergență atinsă: ||F(x^{iter_count})||_2 < {delta}")
  29.             return x, iter_count
  30.  
  31.         # Calculăm direcția de ajustare folosind formula lui Newton-Raphson
  32.         delta_x = np.linalg.solve(JF_value, -F_value)
  33.  
  34.         # Actualizăm valoarea aproximativă
  35.         x = x + delta_x
  36.  
  37.         # Verificăm criteriul de întrerupere pentru diferența dintre două iterații consecutive
  38.         if np.linalg.norm(delta_x, 2) < epsilon:
  39.             print(f"Convergență atinsă: ||x^{iter_count+1} - x^{iter_count}||_2 < {epsilon}")
  40.             return x, iter_count + 1
  41.  
  42.         iter_count += 1
  43.     print(f"Număr maxim de iterații atins: {maxIter}")
  44.     return x, iter_count
  45.  
  46. # Exemplu de utilizare:
  47. # Definim funcția și derivata primei funcții (jacobianul)
  48. def F(x):
  49.     return np.array([x[0]**2 + x[1]**2 - 1, x[0] - x[1]])
  50.  
  51. def dF(x):
  52.     return np.array([[2*x[0], 2*x[1]], [1, -1]])
  53.  
  54. # Setăm valoarea de pornire
  55. x0 = np.array([1.0, 1.0])
  56.  
  57. # Apelăm funcția newton
  58. result, iterations = newton(F, dF, x0)
  59.  
  60. print(f"\nRezultatul final: {result}")
  61. print(f"Numărul de iterații: {iterations}")
  62.  
  63.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement