From 62b36d8f969d3892b406353a3f68630200b6c040 Mon Sep 17 00:00:00 2001 From: Christian Kolset Date: Thu, 10 Apr 2025 14:07:45 -0600 Subject: 2_debugging_code.md & non-leaner_solver.py added to repo --- tutorials/module_2/non-linear_solvers.py | 89 ++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 tutorials/module_2/non-linear_solvers.py (limited to 'tutorials/module_2/non-linear_solvers.py') 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 -- cgit v1.2.3