【问题标题】:for-loops in Python modulesPython 模块中的 for 循环
【发布时间】:2012-05-23 10:02:43
【问题描述】:

我正在为求解特定微分方程的隐式方案编写函数。函数如下所示:

import numpy as np

def scheme(N,T):
    y = np.zeros(N+1)          # Array for implicit scheme
    h = T/N                    # Step length
    for i in range(N):
        y[i+1] = y[i] + h*(1+4*y[i])

    print y

我保存文件,然后以通常的方式导入它,但是当我运行方案功能时,y = [0 ... 0] 其中...N-1 零。似乎这些值在 for 循环的范围内丢失了。

如果我改为在解释器(在我的例子中是 Spyder)中编写整个函数,一切都会正常运行。

从模块中导入函数为什么不起作用?

【问题讨论】:

  • y 在每次调用scheme 时都会被初始化;这完全在意料之中。
  • @lime,values are lost in the scope of the for-loop 是什么意思?

标签: python function module for-loop numpy


【解决方案1】:
h = T/N 

TN 是否可能既是整数又是 T < N?在那种情况下,h = 0(并且y 保持全零),因为它是整数除法(1/2 == 0)。

尝试将这一行替换为

h = 1. * T / N 

并查看结果。

y[i+1] = y[i] + h*(1+4*y[i])

可以改写为

y[i+1] = y[i] + h + 4 * h * y[i]
               ^^^

这意味着对于y[i] = 0,新的y[i+1] 将是h。如果整数除法T/N 使其为零,那么这就是你得到的。

【讨论】:

    【解决方案2】:

    通常,如果你在 python 中将两个整数相除,你也会将整数四舍五入到负无穷大。 所以

    1/3 == 0
    

    在你的例子中,如果 TN 是整数并且 T N, h 将为 0。 如果 h 为 0,则 y 的所有元素也将为 0。 这可以通过将值转换为浮动来解决,即

    float(1)/3 == 0.333
    

    在你的情况下:

    h = float(T)/N 
    

    不熟悉 Spyder,但快速查看文档显示,它是为科学家准备的。 也许这个解释器总是使用浮点除法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-03
      • 1970-01-01
      • 2022-10-20
      相关资源
      最近更新 更多