1

我正在尝试获取以下代码来执行更多操作:

    class App(Frame):
        def __init__(self, master):
            Frame.__init__(self, master)
            self.grid()
            self.create_widgets()

        def create_widgets(self):

            self.answerLabel = Label(self, text="Output List:")
            self.answerLabel.grid(row=2, column=1, sticky=W)

        def psiFunction(self):
            j = int(self.indexEntry.get())
            valueList = list(self.listEntry.get())
            x = map(int, valueList)
            if x[0] != 0:
                x.insert(0, 0)
            rtn = []
            for n2 in range(0, len(x) * j - 2):
                n = n2 / j
                r = n2 - n * j
                rtn.append(j * x[n] + r * (x[n + 1] - x[n]))
            self.answer = Label(self, text=rtn)
            self.answer.grid(row=2, column=2, sticky=W)


    if __name__ == "__main__":
        root = Tk()

特别是,我试图让它计算 len(x) * j - 1 项,并适用于各种参数值。如果您尝试运行它,您应该会发现较大的参数值会出现错误。例如,对于列表 0,1,2,3,4 和参数 j=3,我们应该运行程序并获得 0123456789101112。但是,如果我尝试执行最后一个值“超出范围”,则会收到错误消息计算它。

我相信这是我定义的功能的问题。似乎参数的问题与将参数与 n 值联系起来的方式有关。考虑 0123。如果我使用 2 作为我的参数(在函数中称为索引),它会很好用,但如果我使用 3,它会失败。

编辑:

def psi_j(x, j):
      rtn = []
      for n2 in range(0, len(x) * j - 2):
        n = n2 / j
        r = n2 - n * j
      if r == 0:
        rtn.append(j * x[n])
       else:
        rtn.append(j * x[n] + r * (x[n + 1] - x[n]))
        print 'n2 =', n2, ': n =', n, ' r =' , r, ' rtn =', rtn
      return rtn 

例如,如果我们有 x = [0,1,2,3,4] 的 psi_j(x,2),我们将能够得到 [0,1,2,3,4,5,6,7,8, 9,10,11],在 12 上出现错误。

不过,我们的想法是我们应该能够计算最后一项。这是我们输出序列的第 12 项,并且 12 = 3*4+0 => 3*x[4] + 0*(x[n+1]-x[n])。现在,没有要计算的第 5 项,所以这绝对是一个问题,但我们不需要该项,因为等式的第二部分为零。有没有办法把它写进方程?

4

2 回答 2

2

如果我们考虑示例数据[0, 1, 2, 3]和 a j3问题是我们试图x[4在最后一次迭代中获得 ]`。

  • len(x) * j - 2因为这个数据是10
  • range(0, 10)是 0 到 9。

手动处理我们的最后一次迭代,允许我们将代码解析为这个。

n = 3 # or 9 / 3
r = 0 # or 9 - 3 * 3
rtn.append(3 * x[3] + 0 * (x[3 + 1] - x[3]))

我们有代码试图达到x[3 + 1],当我们只有索引 0 到 3 时不存在。

为了解决这个问题,我们可以像这样重写代码。

n = n2 / j
r = n2 - n * j
if r == 0:
    rtn.append(j * x[n])
else:
    rtn.append(j * x[n] + r * (x[n + 1] - x[n]))

如果r为0,则(x[n + 1] - x[n])无关紧要。

如果我的数学是错误的,请纠正我。我看不到 and 的情况n >= len(x)r != 0但是如果可能的话,那么我的解决方案无效。

于 2013-07-26T14:16:38.307 回答
1

在不了解该函数的目的是(它是一种过滤器?还是平滑函数?)的情况下,我将它从 GUI suff 中取出并单独测试:

def psiFunction(j, valueList):
    x = map(int, valueList)
    if x[0] != 0:
        x.insert(0, 0)
    rtn = []
    for n2 in range(0, len(x) * j - 2):
        n = n2 / j
        r = n2 - n * j
        print "n =", n, "max_n2 =", len(x) * j - 2, "n2 =", n2, "lx =", len(x), "r =", r
        val = j * x[n] + r * (x[n + 1] - x[n])
        rtn.append(val)
        print  j * x[n], r * (x[n + 1] - x[n]), val
    return rtn

if __name__ == '__main__':
    print psiFunction(3, [0, 1, 2, 3, 4])

调用这个模块会导致一些调试输出,最后是提到的错误消息。

显然,您的x[n + 1]访问失败,就像n那里4一样,n + 15 也是如此,对于访问长度为 5 的数组来说太多了x,因此索引从 0 到 4。

编辑:你psi_j()给了我同样的行为。

让我继续猜测:无论我们想要做什么,我们都必须确保n + 1保持在len(x). 所以也许一个

for n2 in range(0, (len(x) - 1) * j):

会有帮助的。它只产生数字 0..11,但我认为这是唯一可以预期的:最后的项目只能是

3*3 + 0*(4-3)
3*3 + 1*(4-3)
3*3 + 2*(4-3)

并停下来。这是通过我在这里提到的限制来实现的。

于 2013-07-26T14:15:54.723 回答