Manning's equation is a very common formula used in hydraulic engineering. It is an empirical formula that estimates the average velocity of open channel flow, based on a roughness coefficient.
The problem of solving Manning's formula is that it is an implicit formula - the water depth variable (independent variable) is inside R (Hydraulic Radius) and A (flow area) - becoming dificult to isolate the independent variable.
A common approach for solving this equation is to use numerical methods, as the Newton-Raphson method.
In this case, we try different water depths until the function
- a manipulation of the original manning formula, became equal to zero.
An implementation for the resolution of the above, for open channels and using the Newton-Raphson approximation, is shown below.
If you found this code of this explanation useful, please let me know.
def manningC(lam, args): Q,base,alt,talE,talD,nMann,decl = args area = ((((lam*talE)+(lam*talD)+base)+base)/2)*lam perM = base+(lam*(talE*talE+1)**0.5)+(lam*(talD*talD+1)**0.5) raio = area/ perM mannR = (Q*nMann/decl**0.5)-(area*raio**(2.0/3.0)) return mannR def solve(f, x0, h, args): lastX = x0 nextX = lastX + 10* h # "different than lastX so loop starts OK while (abs(lastX - nextX) > h): # this is how you terminate the loop - note use of abs() newY = f(nextX,args) # just for debug... see what happens # print out progress... again just debug print lastX," -> f(", nextX, ") = ", newY lastX = nextX nextX = lastX - newY / derivative(f, lastX, h, args) # update estimate using N-R return nextX def derivative(f, x, h, args): return (f(x+h,args) - f(x-h,args)) / (2.0*h) if __name__=='__main__': # arguments in this case are - flow, bottom width, height, # Left side slope, rigth side slope, manning, longitudinal slope args0 = [2.5,1,.5,1.0,1.0,.015,.005] initD = .01 # call the solver with a precision of 0.001 xFound = solve(manningC, initD, 0.001, args0) print 'Solution Found - Water depth = %.3f' %xFound
No comments:
Post a Comment