简体   繁体   中英

Why does this Python code give me the wrong answer?

I wrote a simple Python code to solve a certain Hydraulic formula (The Manning's equation ):

import math

def mannings(units,A,P,S,n):
    if units=='SI':
        k=1.0
    elif units=='US':
        k=1.49
    R=A/P
    V=(k/n)*(math.pow(R,(2/3)))*(math.sqrt(S))
    Q=A*V
    return R,V,Q

In the code above, the velocity V is calculated from the k , n , R and S . The velocity is then used to calculate the discharge Q by multiplying with Area A . The user inputs the unit convention, the A , P , S and n . k is decided on the basis of unit convention.

When I run the function using mannings('US',1.0618,2.7916,0.02,0.015) , I get (0.38035535176959456, 14.047854719572745, 14.916012141242343) . The R value matches the R calculated in a spreadsheet, but the V and Q are way off. The actual V should be 7.374638178 and the Q should be 7.830634155 .

It'd be great if someone can tell me what's going wrong here. This is a pretty straightforward formula and I was guessing it should work easily.

Your problem is that 2/3 is an integer division and therefore evaluates to 0 . You want 2.0/3 to force a floating-point division. Or else include from __future__ import division at the top of your file to use the Python 3-style division in Python 2.x.

Assuming you don't use the __future__ solution, you will also want to write your R = A / P as eg R = float(A) / P because otherwise, if A and P are both integers, R will also be an integer.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM