diff options
Diffstat (limited to 'book/module2/non_linear_eqn_solver.tex')
| -rw-r--r-- | book/module2/non_linear_eqn_solver.tex | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/book/module2/non_linear_eqn_solver.tex b/book/module2/non_linear_eqn_solver.tex new file mode 100644 index 0000000..5550d12 --- /dev/null +++ b/book/module2/non_linear_eqn_solver.tex @@ -0,0 +1,129 @@ +\section{Solving non-linear +equations}\label{solving-non-linear-equations} + +\subsection{Introduction}\label{introduction} + +\subsection{Prerequisites}\label{prerequisites} + +\begin{Shaded} +\begin{Highlighting}[] +\ImportTok{import}\NormalTok{ numpy} +\ImportTok{import}\NormalTok{ scipy} +\ImportTok{import}\NormalTok{ sympy} +\end{Highlighting} +\end{Shaded} + +\subsection{fsolve from SciPy}\label{fsolve-from-scipy} + +\begin{Shaded} +\begin{Highlighting}[] +\ImportTok{from}\NormalTok{ scipy.optimize }\ImportTok{import}\NormalTok{ fsolve} + +\KeywordTok{def}\NormalTok{ equations(}\BuiltInTok{vars}\NormalTok{):} +\NormalTok{ x, y }\OperatorTok{=} \BuiltInTok{vars} +\NormalTok{ eq1 }\OperatorTok{=}\NormalTok{ x}\OperatorTok{**}\DecValTok{2} \OperatorTok{+}\NormalTok{ y}\OperatorTok{**}\DecValTok{2} \OperatorTok{{-}} \DecValTok{25} +\NormalTok{ eq2 }\OperatorTok{=}\NormalTok{ x}\OperatorTok{**}\DecValTok{2} \OperatorTok{{-}}\NormalTok{ y} + \ControlFlowTok{return}\NormalTok{ [eq1, eq2]} + +\NormalTok{initial\_guess }\OperatorTok{=}\NormalTok{ [}\DecValTok{1}\NormalTok{, }\DecValTok{1}\NormalTok{]} +\NormalTok{solution }\OperatorTok{=}\NormalTok{ fsolve(equations, initial\_guess)} +\BuiltInTok{print}\NormalTok{(}\StringTok{"Solution:"}\NormalTok{, solution)} +\end{Highlighting} +\end{Shaded} + +\subsection{root from SciPy}\label{root-from-scipy} + +\begin{Shaded} +\begin{Highlighting}[] +\ImportTok{from}\NormalTok{ scipy.optimize }\ImportTok{import}\NormalTok{ root} + +\KeywordTok{def}\NormalTok{ equations(}\BuiltInTok{vars}\NormalTok{):} +\NormalTok{ x, y }\OperatorTok{=} \BuiltInTok{vars} +\NormalTok{ eq1 }\OperatorTok{=}\NormalTok{ x}\OperatorTok{**}\DecValTok{2} \OperatorTok{+}\NormalTok{ y}\OperatorTok{**}\DecValTok{2} \OperatorTok{{-}} \DecValTok{25} +\NormalTok{ eq2 }\OperatorTok{=}\NormalTok{ x}\OperatorTok{**}\DecValTok{2} \OperatorTok{{-}}\NormalTok{ y} + \ControlFlowTok{return}\NormalTok{ [eq1, eq2]} + +\NormalTok{initial\_guess }\OperatorTok{=}\NormalTok{ [}\DecValTok{1}\NormalTok{, }\DecValTok{1}\NormalTok{]} +\NormalTok{solution }\OperatorTok{=}\NormalTok{ root(equations, initial\_guess)} +\BuiltInTok{print}\NormalTok{(}\StringTok{"Solution:"}\NormalTok{, solution.x)} +\end{Highlighting} +\end{Shaded} + +\subsection{minimize from SciPy}\label{minimize-from-scipy} + +\begin{Shaded} +\begin{Highlighting}[] +\ImportTok{from}\NormalTok{ scipy.optimize }\ImportTok{import}\NormalTok{ minimize} + +\CommentTok{\# Define the equations} +\KeywordTok{def}\NormalTok{ equation1(x, y):} + \ControlFlowTok{return}\NormalTok{ x}\OperatorTok{**}\DecValTok{2} \OperatorTok{+}\NormalTok{ y}\OperatorTok{**}\DecValTok{2} \OperatorTok{{-}} \DecValTok{25} + +\KeywordTok{def}\NormalTok{ equation2(x, y):} + \ControlFlowTok{return}\NormalTok{ x}\OperatorTok{**}\DecValTok{2} \OperatorTok{{-}}\NormalTok{ y} + +\CommentTok{\# Define the objective function for optimization} +\KeywordTok{def}\NormalTok{ objective(xy):} +\NormalTok{ x, y }\OperatorTok{=}\NormalTok{ xy} + \ControlFlowTok{return}\NormalTok{ equation1(x, y)}\OperatorTok{**}\DecValTok{2} \OperatorTok{+}\NormalTok{ equation2(x, y)}\OperatorTok{**}\DecValTok{2} + +\CommentTok{\# Initial guess} +\NormalTok{initial\_guess }\OperatorTok{=}\NormalTok{ [}\DecValTok{1}\NormalTok{, }\DecValTok{1}\NormalTok{]} + +\CommentTok{\# Perform optimization} +\NormalTok{result }\OperatorTok{=}\NormalTok{ minimize(objective, initial\_guess)} +\NormalTok{solution\_optimization }\OperatorTok{=}\NormalTok{ result.x} + +\BuiltInTok{print}\NormalTok{(}\StringTok{"Optimization Method Solution:"}\NormalTok{, solution\_optimization)} +\end{Highlighting} +\end{Shaded} + +\subsection{nsolve from SymPy}\label{nsolve-from-sympy} + +\begin{Shaded} +\begin{Highlighting}[] +\ImportTok{from}\NormalTok{ sympy }\ImportTok{import}\NormalTok{ symbols, Eq, nsolve} + +\CommentTok{\# Define the variables} +\NormalTok{x, y }\OperatorTok{=}\NormalTok{ symbols(}\StringTok{\textquotesingle{}x y\textquotesingle{}}\NormalTok{)} + +\CommentTok{\# Define the equations} +\NormalTok{eq1 }\OperatorTok{=}\NormalTok{ Eq(x}\OperatorTok{**}\DecValTok{2} \OperatorTok{+}\NormalTok{ y}\OperatorTok{**}\DecValTok{2}\NormalTok{, }\DecValTok{25}\NormalTok{)} +\NormalTok{eq2 }\OperatorTok{=}\NormalTok{ Eq(x }\OperatorTok{{-}}\NormalTok{ y, }\DecValTok{0}\NormalTok{)} + +\CommentTok{\# Initial guess for the solution} +\NormalTok{initial\_guess }\OperatorTok{=}\NormalTok{ [}\DecValTok{1}\NormalTok{, }\DecValTok{1}\NormalTok{]} + +\CommentTok{\# Use nsolve to find the solution} +\NormalTok{solution }\OperatorTok{=}\NormalTok{ nsolve([eq1, eq2], [x, y], initial\_guess)} +\BuiltInTok{print}\NormalTok{(}\StringTok{"Solution:"}\NormalTok{, solution)} +\end{Highlighting} +\end{Shaded} + +\subsection{newton\_method from NumPy}\label{newton_method-from-numpy} + +\begin{Shaded} +\begin{Highlighting}[] +\ImportTok{import}\NormalTok{ numpy }\ImportTok{as}\NormalTok{ np} + +\KeywordTok{def}\NormalTok{ equations(}\BuiltInTok{vars}\NormalTok{):} +\NormalTok{ x, y }\OperatorTok{=} \BuiltInTok{vars} +\NormalTok{ eq1 }\OperatorTok{=}\NormalTok{ x}\OperatorTok{**}\DecValTok{2} \OperatorTok{+}\NormalTok{ y}\OperatorTok{**}\DecValTok{2} \OperatorTok{{-}} \DecValTok{25} +\NormalTok{ eq2 }\OperatorTok{=}\NormalTok{ x}\OperatorTok{**}\DecValTok{2} \OperatorTok{{-}}\NormalTok{ y} + \ControlFlowTok{return}\NormalTok{ np.array([eq1, eq2])} + +\KeywordTok{def}\NormalTok{ newton\_method(initial\_guess, tolerance}\OperatorTok{=}\FloatTok{1e{-}6}\NormalTok{, max\_iter}\OperatorTok{=}\DecValTok{100}\NormalTok{):} + \BuiltInTok{vars} \OperatorTok{=}\NormalTok{ np.array(initial\_guess, dtype}\OperatorTok{=}\BuiltInTok{float}\NormalTok{)} + \ControlFlowTok{for}\NormalTok{ \_ }\KeywordTok{in} \BuiltInTok{range}\NormalTok{(max\_iter):} +\NormalTok{ J }\OperatorTok{=}\NormalTok{ np.array([[}\DecValTok{2} \OperatorTok{*} \BuiltInTok{vars}\NormalTok{[}\DecValTok{0}\NormalTok{], }\DecValTok{2} \OperatorTok{*} \BuiltInTok{vars}\NormalTok{[}\DecValTok{1}\NormalTok{]], [}\DecValTok{2} \OperatorTok{*} \BuiltInTok{vars}\NormalTok{[}\DecValTok{0}\NormalTok{], }\OperatorTok{{-}}\DecValTok{1}\NormalTok{]])} +\NormalTok{ F }\OperatorTok{=}\NormalTok{ equations(}\BuiltInTok{vars}\NormalTok{)} +\NormalTok{ delta }\OperatorTok{=}\NormalTok{ np.linalg.solve(J, }\OperatorTok{{-}}\NormalTok{F)} + \BuiltInTok{vars} \OperatorTok{+=}\NormalTok{ delta} + \ControlFlowTok{if}\NormalTok{ np.linalg.norm(delta) }\OperatorTok{\textless{}}\NormalTok{ tolerance:} + \ControlFlowTok{return} \BuiltInTok{vars} + +\NormalTok{initial\_guess }\OperatorTok{=}\NormalTok{ [}\DecValTok{1}\NormalTok{, }\DecValTok{1}\NormalTok{]} +\NormalTok{solution }\OperatorTok{=}\NormalTok{ newton\_method(initial\_guess)} +\BuiltInTok{print}\NormalTok{(}\StringTok{"Solution:"}\NormalTok{, solution)} +\end{Highlighting} +\end{Shaded} |
