[SciPy-User] SCIPY FSOLVE
Etrade Griffiths
etrade.griffiths at dsl.pipex.com
Mon Oct 12 07:55:18 EDT 2009
Hi
I am trying to solve directly a series of equations describing flow
in a network using FSOLVE but have not had much success so far. A
small example is given below.
I have a feeling that the problem may be ill-conditioned because
there are two sources of small numbers in the equations: one
associated with small coefficients and the other associated with
small differences in pressure between adjacent nodes. The main
problem seems to be that FSOLVE ends up with estimates of the
variables that result in raising a negative number to a power, so
that some of the residuals become -1.#IND in value. I tried trapping
this type of error but FSOLVE does not appear to be able to move
towards the solution. I would be grateful for any suggestions on how
to "encourage" FSOLVE.
Thanks in advance
Alun Griffiths
# =========================
#
# Simple model of gathering network
# Uses SCIPY FSOLVE to solve for network pressures directly
#
import math
import scipy.optimize
# Set up the system of network equations
def NetworkEquations(x):
# Transfer current guess to variables
p2 = x[0]
q1 = x[1]
q2 = x[2]
q3 = x[3]
# Define constants
c = [300.0, 2.00E-5, 1.50E-5]
n = [0.50, 0.75, 0.70]
p1 = 200.0
p3 = 2000.0
# Define the residuals
residuals = []
# ... Kirchoff
residuals.append( q1 - q2 - q3 )
# ... pressure drop along pipeline
curr_err = q1 - ( c[0] * ( p2 ** 2 - p1 ** 2 ) ) ** n[0]
residuals.append(curr_err)
# ... pressure drop over well 1
curr_err = q2 - c[1] * ( p3 ** 2 - p2 ** 2 ) ** n[1]
residuals.append(curr_err)
# ... pressure drop over well 2
curr_err = q3 - c[2] * ( p3 ** 2 - p2 ** 2 ) ** n[2]
residuals.append(curr_err)
# All equations evaluated so return residuals
return residuals
# Solve equations using Broyden's method
x0 = [250.0, 2.0, 1.0, 1.0]
x1 = scipy.optimize.fsolve(NetworkEquations,x0)
print x1
More information about the SciPy-User
mailing list