Solve Equations in Python
Main.PythonSolveEquations History
Show minor edits - Show changes to output
Changed line 151 from:
The [[https://apmonitor.com|APMonitor Modeling Language]] with a Python interface is optimization software for mixed-integer and differential algebraic equations. It is coupled with large-scale solvers for linear, quadratic, nonlinear, and mixed integer programming (LP, QP, NLP, MILP, MINLP). Modes of operation include data reconciliation, real-time optimization, dynamic simulation, and nonlinear predictive control. It is freely available through MATLAB, Python, Julia, or from a [[https://apmonitor.com/online/view_pass.php|web browser interface]].
to:
The [[https://gekko.readthedocs.io/en/latest/|Gekko Optimization Suite]] with a Python interface is optimization software for mixed-integer and differential algebraic equations. It is coupled with large-scale solvers for linear, quadratic, nonlinear, and mixed integer programming (LP, QP, NLP, MILP, MINLP). Modes of operation include data reconciliation, real-time optimization, dynamic simulation, and nonlinear predictive control.
Changed line 110 from:
where ''T'' is the temperature, ''V'' is the molar volume, {`R_g`} is the universal gas constant, and ''a'' and ''b'' are compound-specific constants. The solution for the molar volume of ethane for each phase at ''T = 77°C'' and ''P = 1 bar'' is shown below with [[https://youtu.be/EIgP6Q20xm8|Scipy fsolve]] and [[https://apmonitor.com/wiki/index.php/Main/GekkoPythonOptimization|Gekko]]. For ethane, ''a = 2.877e8 cm^6 K^0.5 bar / mol^2 and ''b = 60.211 cm^3 / mol''. The ideal gas law is a guess of the vapor volume and ''1.1*b'' is a guess of the liquid volume.
to:
where ''T'' is the temperature, ''V'' is the molar volume, {`R_g`} is the universal gas constant, and ''a'' and ''b'' are compound-specific constants. The solution for the molar volume of ethane for each phase at ''T = 77°C'' and ''P = 1 bar'' is shown below with [[https://youtu.be/EIgP6Q20xm8|Scipy fsolve]] and [[https://apmonitor.com/wiki/index.php/Main/GekkoPythonOptimization|Gekko]]. For ethane, ''a = 2.877e8 cm^6 K^0.5 bar / mol^2'' and ''b = 60.211 cm^3 / mol''. The ideal gas law is a guess of the vapor volume and ''1.1*b'' is a guess of the liquid volume.
Changed line 110 from:
where ''T'' is the temperature, ''V'' is the molar volume, {`R_g`} is the universal gas constant, and ''a'' and ''b'' are compound-specific constants. The solution for the molar volume of ethane for each phase at ''T = 77°C'' and ''P = 1 bar'' is shown below with [[https://youtu.be/EIgP6Q20xm8|Scipy fsolve]] and [[https://apmonitor.com/wiki/index.php/Main/GekkoPythonOptimization|Gekko]]. For ethane, ''a = 2.877e8'' {`\frac{cm^6 K^{0.5} bar}{mol^2}`} and ''b = 60.211'' {`\frac{cm^3}{mol}`}. The ideal gas law is a guess of the vapor volume and ''1.1*b'' is a guess of the liquid volume.
to:
where ''T'' is the temperature, ''V'' is the molar volume, {`R_g`} is the universal gas constant, and ''a'' and ''b'' are compound-specific constants. The solution for the molar volume of ethane for each phase at ''T = 77°C'' and ''P = 1 bar'' is shown below with [[https://youtu.be/EIgP6Q20xm8|Scipy fsolve]] and [[https://apmonitor.com/wiki/index.php/Main/GekkoPythonOptimization|Gekko]]. For ethane, ''a = 2.877e8 cm^6 K^0.5 bar / mol^2 and ''b = 60.211 cm^3 / mol''. The ideal gas law is a guess of the vapor volume and ''1.1*b'' is a guess of the liquid volume.
Changed line 110 from:
where ''T'' is the temperature, ''V'' is the molar volume, {`R_g`} is the universal gas constant, and ''a'' and ''b'' are compound-specific constants. The solution for the molar volume of ethane for each phase at ''T = 77°C'' and ''P = 1 bar'' is shown below with [[https://youtu.be/EIgP6Q20xm8|Scipy fsolve]] and [[https://apmonitor.com/wiki/index.php/Main/GekkoPythonOptimization|Gekko]]. For ethane, ''a = 2.877e8'' {`\frac{cm^6-bar-K^{0.5}}{mol^2}`} and ''b = 60.211'' {`\frac{cm^3}{mol}`}. The ideal gas law is a guess of the vapor volume and ''1.1*b'' is a guess of the liquid volume.
to:
where ''T'' is the temperature, ''V'' is the molar volume, {`R_g`} is the universal gas constant, and ''a'' and ''b'' are compound-specific constants. The solution for the molar volume of ethane for each phase at ''T = 77°C'' and ''P = 1 bar'' is shown below with [[https://youtu.be/EIgP6Q20xm8|Scipy fsolve]] and [[https://apmonitor.com/wiki/index.php/Main/GekkoPythonOptimization|Gekko]]. For ethane, ''a = 2.877e8'' {`\frac{cm^6 K^{0.5} bar}{mol^2}`} and ''b = 60.211'' {`\frac{cm^3}{mol}`}. The ideal gas law is a guess of the vapor volume and ''1.1*b'' is a guess of the liquid volume.
Changed line 110 from:
where ''T'' is the temperature, ''V'' is the molar volume, {`R_g`} is the universal gas constant, and ''a'' and ''b'' are compound-specific constants. The solution for the molar volume of ethane for each phase at ''T = 77°C'' and ''P = 1 bar'' is shown below with Scipy fsolve and [[https://apmonitor.com/wiki/index.php/Main/GekkoPythonOptimization|Gekko]]. For ethane, ''a = 2.877×10^8'' {`\frac{cm^6 bar K^{0.5}}{mol^2}`} and ''b = 60.211'' {`\frac{cm^3}{mol}`}. The ideal gas law is used to obtain the guess of the vapor volume and ''1.1*b'' is used to obtain the guess for the liquid volume.
to:
where ''T'' is the temperature, ''V'' is the molar volume, {`R_g`} is the universal gas constant, and ''a'' and ''b'' are compound-specific constants. The solution for the molar volume of ethane for each phase at ''T = 77°C'' and ''P = 1 bar'' is shown below with [[https://youtu.be/EIgP6Q20xm8|Scipy fsolve]] and [[https://apmonitor.com/wiki/index.php/Main/GekkoPythonOptimization|Gekko]]. For ethane, ''a = 2.877e8'' {`\frac{cm^6-bar-K^{0.5}}{mol^2}`} and ''b = 60.211'' {`\frac{cm^3}{mol}`}. The ideal gas law is a guess of the vapor volume and ''1.1*b'' is a guess of the liquid volume.
Added lines 103-145:
!!!!Equations with Multiple Solutions (Roots)
Nonlinear equations may have multiple solutions. An example from engineering is the Redlich/Kwong Equation of State (EOS) that has 3 roots (solutions) that are the liquid volume, the vapor volume, and an extra root that isn't physically meaningful.
{$P = \frac{R_g \, T}{V-b} - \frac{a}{T^{1/2} \, V \, \left(V+b\right)}$}
where ''T'' is the temperature, ''V'' is the molar volume, {`R_g`} is the universal gas constant, and ''a'' and ''b'' are compound-specific constants. The solution for the molar volume of ethane for each phase at ''T = 77°C'' and ''P = 1 bar'' is shown below with Scipy fsolve and [[https://apmonitor.com/wiki/index.php/Main/GekkoPythonOptimization|Gekko]]. For ethane, ''a = 2.877×10^8'' {`\frac{cm^6 bar K^{0.5}}{mol^2}`} and ''b = 60.211'' {`\frac{cm^3}{mol}`}. The ideal gas law is used to obtain the guess of the vapor volume and ''1.1*b'' is used to obtain the guess for the liquid volume.
(:source lang=python:)
import numpy as np
from scipy.optimize import fsolve
# constants
TC = 77 # degC
P = 1.0 # bar
a = 2.877e8 # cm^6 bar K^0.5 / mol^2
b = 60.211 # cm^3 / mol
Rg = 83.144598 # cm^3 bar / K-mol
# derived quantities
TK = TC+273.15 # K
Vg = Rg*TK/P # ideal gas guess
# Scipy fsolve solution
def f(V):
return P-Rg*TK/(V-b) + a/(np.sqrt(TK)*V*(V+b))
V = fsolve(f,Vg)
print(f'Scipy Vapor Solution: {V[0]:0.1f} cm^3/mol')
V = fsolve(f,b*1.1)
print(f'Scipy Liquid Solution: {V[0]:0.1f} cm^3/mol')
# Gekko solutions
from gekko import GEKKO
m = GEKKO(remote=False)
V = m.Var(value=Vg,lb=1e4)
m.Equation(P == Rg*TK/(V-b) - a/(np.sqrt(TK)*V*(V+b)))
m.options.SOLVER=1; m.solve(disp=False)
print(f'Gekko Vapor Solution: {V.value[0]:0.1f} cm^3/mol')
# update bounds and initial guess
V.lower=b*0.5; V.upper = b*2; V.value=b*1.1
m.options.SOLVER=1; m.solve(disp=False)
print(f'Gekko Liquid Solution: {V.value[0]:0.1f} cm^3/mol')
(:sourceend:)
Deleted lines 108-126:
----
(:html:)
<div id="disqus_thread"></div>
<script type="text/javascript">
/* * * CONFIGURATION VARIABLES: EDIT BEFORE PASTING INTO YOUR WEBPAGE * * */
var disqus_shortname = 'apmonitor'; // required: replace example with your forum shortname
/* * * DON'T EDIT BELOW THIS LINE * * */
(function() {
var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
dsq.src = 'https://' + disqus_shortname + '.disqus.com/embed.js';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
})();
</script>
<noscript>Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
<a href="https://disqus.com" class="dsq-brlink">comments powered by <span class="logo-disqus">Disqus</span></a>
(:htmlend:)
Changed line 15 from:
(:source lang=python:)
to:
(:source lang=python -inline:)
Changed lines 35-36 from:
!!!!Source Code for Nonlinear Solution
to:
!!!!Source Code for Nonlinear Solution (fsolve)
Changed lines 38-40 from:
from scipy.optimize import
to:
import numpy as np
from scipy.optimize import fsolve
from scipy.optimize import fsolve
Changed lines 45-48 from:
F[0] =
F[1] = y -
to:
F = np.empty((3))
F[0] = x**2+y**2-20
F[1] = y - x**2
Changed line 52 from:
zGuess = array([1,1,1])
to:
zGuess = np.array([1,1,1])
Changed lines 57-70 from:
!!!! Symbolic Solutions
to:
!!!!Source Code for Nonlinear Solution (gekko)
(:source lang=python:)
from gekko import GEKKO
m = GEKKO()
x,y,w = [m.Var(1) for i in range(3)]
m.Equations([x**2+y**2==20,\
y-x**2==0,\
w+5-x*y==0])
m.solve(disp=False)
print(x.value,y.value,w.value)
(:sourceend:)
!!!! Symbolic Solution with Sympy
(:source lang=python:)
from gekko import GEKKO
m = GEKKO()
x,y,w = [m.Var(1) for i in range(3)]
m.Equations([x**2+y**2==20,\
y-x**2==0,\
w+5-x*y==0])
m.solve(disp=False)
print(x.value,y.value,w.value)
(:sourceend:)
!!!! Symbolic Solution with Sympy
Changed line 72 from:
h = sym.Eq(-2*x+y,-z)sourceend:)
to:
h = sym.Eq(-2*x+y,-z)
Changed lines 81-82 from:
{$z=c_1 - \frac{5}{2} +\frac{5 \sqrt{3}}{2}$}
to:
{$z=-c_1 - \frac{5}{2} +\frac{5 \sqrt{3}}{2}$}
Changed lines 87-89 from:
{$z=c_1 - \frac{5}{2} -\frac{5 \sqrt{3}}{2}$}
to:
{$z=-c_1 - \frac{5}{2} -\frac{5 \sqrt{3}}{2}$}
The same approach applies to linear or nonlinear equations.
The same approach applies to linear or nonlinear equations.
Changed lines 79-87 from:
{$-\frac{1}{2}+\frac{\sqrt{3}}{2}$}
to:
{$x=-\frac{1}{2}+\frac{\sqrt{3}}{2}$}
{$y=c_1 - \frac{3 \sqrt{3}}{2} +\frac{3}{2}$}
{$z=c_1 - \frac{5}{2} +\frac{5 \sqrt{3}}{2}$}
and a second solution:
{$x=-\frac{1}{2}-\frac{\sqrt{3}}{2}$}
{$y=c_1 + \frac{3 \sqrt{3}}{2} +\frac{3}{2}$}
{$z=c_1 - \frac{5}{2} -\frac{5 \sqrt{3}}{2}$}
{$y=c_1 - \frac{3 \sqrt{3}}{2} +\frac{3}{2}$}
{$z=c_1 - \frac{5}{2} +\frac{5 \sqrt{3}}{2}$}
and a second solution:
{$x=-\frac{1}{2}-\frac{\sqrt{3}}{2}$}
{$y=c_1 + \frac{3 \sqrt{3}}{2} +\frac{3}{2}$}
{$z=c_1 - \frac{5}{2} -\frac{5 \sqrt{3}}{2}$}
Changed line 79 from:
{$-\frac{1}{2}+\frac{\sqrt(3)}{2}$}
to:
{$-\frac{1}{2}+\frac{\sqrt{3}}{2}$}
Added lines 56-79:
!!!! Symbolic Solutions
Sympy is a package for symbolic solutions in Python that can be used to solve systems of equations.
{$2x^2+y+z=1$}
{$x+2y+z=c_1$}
{$-2*x+y=-z$}
(:source lang=python:)
import sympy as sym
sym.init_printing()
x,y,z = sym.symbols('x,y,z')
c1 = sym.Symbol('c1')
f = sym.Eq(2*x**2+y+z,1)
g = sym.Eq(x+2*y+z,c1)
h = sym.Eq(-2*x+y,-z)sourceend:)
sym.solve([f,g,h],(x,y,z))
(:sourceend:)
When solved in an IPython environment such as a Jupyter notebook, the result is displayed as:
{$-\frac{1}{2}+\frac{\sqrt(3)}{2}$}
Changed line 61 from:
The [[https://apmonitor.com|APMonitor Modeling Language]] is optimization software for mixed-integer and differential algebraic equations. It is coupled with large-scale solvers for linear, quadratic, nonlinear, and mixed integer programming (LP, QP, NLP, MILP, MINLP). Modes of operation include data reconciliation, real-time optimization, dynamic simulation, and nonlinear predictive control. It is freely available through MATLAB, Python, Julia, or from a [[https://apmonitor.com/online/view_pass.php|web browser interface]].
to:
The [[https://apmonitor.com|APMonitor Modeling Language]] with a Python interface is optimization software for mixed-integer and differential algebraic equations. It is coupled with large-scale solvers for linear, quadratic, nonlinear, and mixed integer programming (LP, QP, NLP, MILP, MINLP). Modes of operation include data reconciliation, real-time optimization, dynamic simulation, and nonlinear predictive control. It is freely available through MATLAB, Python, Julia, or from a [[https://apmonitor.com/online/view_pass.php|web browser interface]].
Added lines 60-61:
The [[https://apmonitor.com|APMonitor Modeling Language]] is optimization software for mixed-integer and differential algebraic equations. It is coupled with large-scale solvers for linear, quadratic, nonlinear, and mixed integer programming (LP, QP, NLP, MILP, MINLP). Modes of operation include data reconciliation, real-time optimization, dynamic simulation, and nonlinear predictive control. It is freely available through MATLAB, Python, Julia, or from a [[https://apmonitor.com/online/view_pass.php|web browser interface]].
Changed lines 15-26 from:
import numpy as np
A = np.array([ [3,-9], [2,4] ])
b = np.array([-42,2])
z = np.linalg.solve(A,b)
print(z)
M = np.array([ [1,-2,-1], [2,2,-1], [-1,-1,2] ])
c = np.array([6,1,1])
y = np.linalg.solve(M,c)
print(y)
to:
(:source lang=python:)
import numpy as np
A = np.array([ [3,-9], [2,4] ])
b = np.array([-42,2])
z = np.linalg.solve(A,b)
print(z)
M = np.array([ [1,-2,-1], [2,2,-1], [-1,-1,2] ])
c = np.array([6,1,1])
y = np.linalg.solve(M,c)
print(y)
(:sourceend:)
import numpy as np
A = np.array([ [3,-9], [2,4] ])
b = np.array([-42,2])
z = np.linalg.solve(A,b)
print(z)
M = np.array([ [1,-2,-1], [2,2,-1], [-1,-1,2] ])
c = np.array([6,1,1])
y = np.linalg.solve(M,c)
print(y)
(:sourceend:)
Changed lines 37-43 from:
from numpy import *
from scipy.optimize import *
def myFunction(z):
x = z[0]
y = z[1]
w = z[2]
to:
(:source lang=python:)
from numpy import *
from scipy.optimize import *
def myFunction(z):
x = z[0]
y = z[1]
w = z[2]
from numpy import *
from scipy.optimize import *
def myFunction(z):
x = z[0]
y = z[1]
w = z[2]
Changed lines 46-54 from:
to:
F = empty((3))
F[0] = pow(x,2)+pow(y,2)-20
F[1] = y - pow(x,2)
F[2] = w + 5 - x*y
return F
zGuess = array([1,1,1])
z = fsolve(myFunction,zGuess)
print(z)
(:sourceend:)
F[0] = pow(x,2)+pow(y,2)-20
F[1] = y - pow(x,2)
F[2] = w + 5 - x*y
return F
zGuess = array([1,1,1])
z = fsolve(myFunction,zGuess)
print(z)
(:sourceend:)
Changed line 55 from:
Linear and nonlinear equations can also be solved with [[Main/ExcelSolveEquations|Excel]] and [[Main/PythonSolveEquations|Python]]. Click on the appropriate link for additional information and source code.
to:
Linear and nonlinear equations can also be solved with [[Main/ExcelSolveEquations|Excel]] and [[Main/MatlabSolveEquations|MATLAB]]. Click on the appropriate link for additional information and source code.
Changed line 17 from:
A = np.array([[3,-9],[2,4]])
to:
A = np.array([ [3,-9], [2,4] ])
Changed line 22 from:
M = np.array([[1,-2,-1],[2,2,-1],[-1,-1,2]])
to:
M = np.array([ [1,-2,-1], [2,2,-1], [-1,-1,2] ])
Added lines 13-26:
!!!!Source Code for Linear Solutions
import numpy as np
A = np.array([[3,-9],[2,4]])
b = np.array([-42,2])
z = np.linalg.solve(A,b)
print(z)
M = np.array([[1,-2,-1],[2,2,-1],[-1,-1,2]])
c = np.array([6,1,1])
y = np.linalg.solve(M,c)
print(y)
import numpy as np
A = np.array([[3,-9],[2,4]])
b = np.array([-42,2])
z = np.linalg.solve(A,b)
print(z)
M = np.array([[1,-2,-1],[2,2,-1],[-1,-1,2]])
c = np.array([6,1,1])
y = np.linalg.solve(M,c)
print(y)
Changed line 33 from:
!!!!Source Code
to:
!!!!Source Code for Nonlinear Solution
Added lines 1-60:
(:title Solve Equations in Python:)
(:keywords Python, solve equations, linear, nonlinear:)
(:description Python tutorial on solving linear and nonlinear equations with matrix operations (linear) or fsolve NumPy(nonlinear):)
The following tutorials are an introduction to solving linear and nonlinear equations with Python. The solution to linear equations is through matrix operations while sets of nonlinear equations require a solver to numerically find a solution.
!!!!Solve Linear Equations with Python
(:html:)
<iframe width="560" height="315" src="https://www.youtube.com/embed/44pAWI7v5Zk" frameborder="0" allowfullscreen></iframe>
(:htmlend:)
!!!!Solve Nonlinear Equations with Python
(:html:)
<iframe width="560" height="315" src="https://www.youtube.com/embed/S4Qg2CsiIj8" frameborder="0" allowfullscreen></iframe>
(:htmlend:)
!!!!Source Code
from numpy import *
from scipy.optimize import *
def myFunction(z):
x = z[0]
y = z[1]
w = z[2]
F = empty((3))
F[0] = pow(x,2)+pow(y,2)-20
F[1] = y - pow(x,2)
F[2] = w + 5 - x*y
return F
zGuess = array([1,1,1])
z = fsolve(myFunction,zGuess)
print(z)
!!!!Additional Tutorials
Linear and nonlinear equations can also be solved with [[Main/ExcelSolveEquations|Excel]] and [[Main/PythonSolveEquations|Python]]. Click on the appropriate link for additional information and source code.
----
(:html:)
<div id="disqus_thread"></div>
<script type="text/javascript">
/* * * CONFIGURATION VARIABLES: EDIT BEFORE PASTING INTO YOUR WEBPAGE * * */
var disqus_shortname = 'apmonitor'; // required: replace example with your forum shortname
/* * * DON'T EDIT BELOW THIS LINE * * */
(function() {
var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
dsq.src = 'https://' + disqus_shortname + '.disqus.com/embed.js';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
})();
</script>
<noscript>Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
<a href="https://disqus.com" class="dsq-brlink">comments powered by <span class="logo-disqus">Disqus</span></a>
(:htmlend:)
(:keywords Python, solve equations, linear, nonlinear:)
(:description Python tutorial on solving linear and nonlinear equations with matrix operations (linear) or fsolve NumPy(nonlinear):)
The following tutorials are an introduction to solving linear and nonlinear equations with Python. The solution to linear equations is through matrix operations while sets of nonlinear equations require a solver to numerically find a solution.
!!!!Solve Linear Equations with Python
(:html:)
<iframe width="560" height="315" src="https://www.youtube.com/embed/44pAWI7v5Zk" frameborder="0" allowfullscreen></iframe>
(:htmlend:)
!!!!Solve Nonlinear Equations with Python
(:html:)
<iframe width="560" height="315" src="https://www.youtube.com/embed/S4Qg2CsiIj8" frameborder="0" allowfullscreen></iframe>
(:htmlend:)
!!!!Source Code
from numpy import *
from scipy.optimize import *
def myFunction(z):
x = z[0]
y = z[1]
w = z[2]
F = empty((3))
F[0] = pow(x,2)+pow(y,2)-20
F[1] = y - pow(x,2)
F[2] = w + 5 - x*y
return F
zGuess = array([1,1,1])
z = fsolve(myFunction,zGuess)
print(z)
!!!!Additional Tutorials
Linear and nonlinear equations can also be solved with [[Main/ExcelSolveEquations|Excel]] and [[Main/PythonSolveEquations|Python]]. Click on the appropriate link for additional information and source code.
----
(:html:)
<div id="disqus_thread"></div>
<script type="text/javascript">
/* * * CONFIGURATION VARIABLES: EDIT BEFORE PASTING INTO YOUR WEBPAGE * * */
var disqus_shortname = 'apmonitor'; // required: replace example with your forum shortname
/* * * DON'T EDIT BELOW THIS LINE * * */
(function() {
var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
dsq.src = 'https://' + disqus_shortname + '.disqus.com/embed.js';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
})();
</script>
<noscript>Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
<a href="https://disqus.com" class="dsq-brlink">comments powered by <span class="logo-disqus">Disqus</span></a>
(:htmlend:)