diff options
Diffstat (limited to 'tutorials/module_2/non-linear_solvers.py')
| -rw-r--r-- | tutorials/module_2/non-linear_solvers.py | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/tutorials/module_2/non-linear_solvers.py b/tutorials/module_2/non-linear_solvers.py new file mode 100644 index 0000000..249cd57 --- /dev/null +++ b/tutorials/module_2/non-linear_solvers.py @@ -0,0 +1,89 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Created on Thu Apr 3 11:53:24 2025 + +@author: christian +""" + +from scipy.optimize import fsolve, root, minimize +from sympy import symbols, Eq, nsolve +import numpy as np + +### fsolve ### +def equations(vars): + x, y = vars + eq1 = x**2 + y**2 - 25 + eq2 = x**2 - y + return [eq1, eq2] + +initial_guess = [1, 1] +solution_fsolve= fsolve(equations, initial_guess) + + +### root ### +def equations(vars): + x, y = vars + eq1 = x**2 + y**2 - 25 + eq2 = x**2 - y + return [eq1, eq2] + +initial_guess = [1, 1] +solution_root = root(equations, initial_guess) + + +### minimize ### +# Define the equations +def equation1(x, y): + return x**2 + y**2 - 25 + +def equation2(x, y): + return x**2 - y + +# Define the objective function for optimization +def objective(xy): + x, y = xy + return equation1(x, y)**2 + equation2(x, y)**2 + +# Initial guess +initial_guess = [1, 1] + +# Perform optimization +result = minimize(objective, initial_guess) +solution_optimization = result.x + + +### nsolve ### +# Define the variables +x, y = symbols('x y') + +# Define the equations +eq1 = Eq(x**2 + y**2, 25) +eq2 = Eq(x - y, 0) + +# Initial guess for the solution +initial_guess = [1, 1] + +# Use nsolve to find the solution +solution_nsolve = nsolve([eq1, eq2], [x, y], initial_guess) + + +### newton_method ### +def equations(vars): + x, y = vars + eq1 = x**2 + y**2 - 25 + eq2 = x**2 - y + return np.array([eq1, eq2]) + +def newton_method(initial_guess, tolerance=1e-6, max_iter=100): + vars = np.array(initial_guess, dtype=float) + for _ in range(max_iter): + J = np.array([[2 * vars[0], 2 * vars[1]], [2 * vars[0], -1]]) + F = equations(vars) + delta = np.linalg.solve(J, -F) + vars += delta + if np.linalg.norm(delta) < tolerance: + return vars + +initial_guess = [1, 1] +solution_newton = newton_method(initial_guess)
\ No newline at end of file |
