summaryrefslogtreecommitdiff
path: root/tutorials/module_2/non-linear_solvers.py
diff options
context:
space:
mode:
authorChristian Kolset <christian.kolset@gmail.com>2025-04-10 14:07:45 -0600
committerChristian Kolset <christian.kolset@gmail.com>2025-04-10 14:07:45 -0600
commit62b36d8f969d3892b406353a3f68630200b6c040 (patch)
tree53e1aa6e3f0b1dd6ad7b522b0bde5647d18b4058 /tutorials/module_2/non-linear_solvers.py
parentbb102acf02ab1c9263a95928ca53b97fb0478383 (diff)
2_debugging_code.md & non-leaner_solver.py added to repo
Diffstat (limited to 'tutorials/module_2/non-linear_solvers.py')
-rw-r--r--tutorials/module_2/non-linear_solvers.py89
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