【问题标题】:None value in python numerical integration functionpython数值积分函数中的无值
【发布时间】:2017-03-22 04:12:40
【问题描述】:

我正在尝试编写一个使用矩形规则计算积分的代码,并且还允许用户输入积分限制和除数(矩形)的数量。我已经编写了该函数,但对于某些值,它只返回“无”。知道为什么吗?

到目前为止,这是我的代码:

def integral(f, a, b, N):
h = int((b-a)/N)
result = 0
result += h * f(a)
for i in range(1, N-1):
    result += h * f(a + i*h)
    return result

def f(x):          
return x**3

string_input1 = input("Please enter value for a: ") 
a = int(string_input1)


string_input2 = input("Please enter value for b: ")
b = int(string_input2)

while True: 
string_input3 = input("Please enter integer positive value for N: ") 
N = int(string_input3)
if N>0:       
    break


print(integral(f, a, b, N))

返回“无”的值的示例是 a=0 b=1 N=2

【问题讨论】:

  • hint?
  • @WillemVanOnsem 你确定return result 的缩进吗?如果N=2,它可能会解释None
  • @DeepSpace:这个程序一开始就不是故意的。我有修复它的想法,但我不能确定。根据旧的缩进,它在循环中,但谁能确定呢?
  • @Eve: return 语句是 inside 还是 outside for 循环?
  • @WillemVanOnsem 返回应该在 for 循环之外,我试过了,现在我得到 0 而不是仍然不正确的 None

标签: python numerical-integration


【解决方案1】:
for i in range(1, N-1):
    result += h * f(a + i*h)
    return result

如果N = 2for i in range(1, 1) 不会执行,因此integral 返回None

但即使N > 2,在for 循环中包含return 也没有任何意义,因为它只会运行第一次迭代,然后返回result 的任何内容。

【讨论】:

  • 道歉。有时很难猜测代码可能是如何看待另一面的。 +1。
【解决方案2】:

第一个问题是变量hint,然后循环到N-1,然后是循环内的return

def integral(f,a,b,N):
    h = float(b-a)/float(N)
    result = 0.
    result += h*f(a)
    for i in range(1,N):
        result += h*f(a+i*h)
    return result

【讨论】:

    【解决方案3】:

    你已经有了一个很好的答案,但是你的代码可以稍微改进一下:

    没有理由将最左边的端点与其他样本点区别对待。由于a = a + 0,如果您以i=0 开始循环,则在第一次通过循环时会选择a

    def integral(f,a,b,N):
        h = (b-a)/float(N)
        result = 0.0
        for i in range(N):
            result += h*f(a+i*h)
        return result
    

    此外,通过直接将sum 应用于推导式来替换显式循环会更加 Pythonic:

    def integral(f,a,b,N):
        h = (b-a)/float(N)
        return h*sum(f(a + i*h) for i in range(N))
    

    这在功能上与第一个定义相同。例如:

    >>> integral(lambda x: x**2,0,1,100)
    0.32835000000000003
    

    最后,如果您使用的是 Python 2,则应更改上述内容,使其使用 xrange() 而不是 range()

    【讨论】:

    • 非常感谢!如果您不介意,还有一个问题,您将如何重写 N 的循环,以便在用户输入浮点值时不会出现错误,而是强制用户输入有效输入?
    • @Eve 你可以使用N = int(float(input("Enter number of subintervals: ")))
    • 这解决了错误问题,但它不会让用户重新输入一个有效的数字
    • @Eve 如果你真的想强制用户输入一个 int:看这个:stackoverflow.com/q/23294658/4996248
    • 我设法做到了,但是除了尝试之外还有其他选择吗?我试图使用 if-else 编写一个简单的 while 循环,但无法做到正确。这可能是因为我试图检查数字是否为整数并且做错了:if string_input == int.即使我输入一个整数,循环也不会中断。有没有办法正确地做到这一点?
    猜你喜欢
    • 2022-10-05
    • 2021-12-13
    • 2017-02-02
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 2016-01-12
    • 1970-01-01
    • 2014-07-19
    相关资源
    最近更新 更多