从负值开始时出现列表索引错误

List Index Error when Starting from Negative Values

提问人:M11X00 提问时间:10/23/2023 最后编辑:M11X00 更新时间:10/23/2023 访问量:42

问:

该代码应该近似函数的值,只知道函数在某些任意点上的值及其在所述点上的导数。

代码如下:

class Expand:
    def __init__(self, fx: list, fy: list, dfy: list):
        self.Fx = fx
        self.Fy = fy
        self.dFy = dfy
    
    def get_value(self, x: float | int) -> float:
        index = self.Fx.index(int(x))

        if float(x).is_integer():
            return self.Fy[index]
        
        Ai = index
        Bi = index + 1

        Ax, Bx = self.Fx[Ai], self.Fx[Bi]
        Ay, By = self.Fy[Ai], self.Fy[Bi]
        dAy, dBy = self.dFy[Ai], self.dFy[Bi]

        if dAy == dBy:
            Vx = (Ax + Bx)/2
            Vy = (Ay + By)/2
        else:
            Vx = (By - Ay + dAy*Ax - dBy*Bx)/(dAy - dBy)
            Vy = Ay + dAy*(Vx - Ax)
        
        denominator = (Ax - Bx)**2
        p = (Ax - 2*Vx + Bx)/denominator
        if p != 0:
            q = 2*(Ax*Vx - 2*Ax*Bx + Vx*Bx)/denominator
            x = ((4*p*(x - Ax*Bx*p) + q*q)**0.5 - q)/(2*p)
        
        y = (Ay*((Bx - x)**2) + (Ax - x)*(Ax*By - 2*Vy*(Bx - x) - By*x))/((Ax - Bx)**2)

        return y

    def __call__(self, density: int):
        Ex, Ey = [], []
        for x in range(self.Fx[0]*density, self.Fx[-1]*density + 1):
            x /= density
            Ex.append(x)
            Ey.append(self.get_value(x))
        
        return (Ex, Ey)


if __name__ == "__main__":
    import matplotlib.pyplot as plt

    fx, fy, dfy = [-3, -2, -1, 0], [1, 1, 2, 6], [-0.577215664902, 0.422784335098, 1.8455686702, 7.53670601059]

    G = Expand(fx, fy, dfy)
    gx, gy = G(2)

    plt.plot(fx, fy, color="b")
    plt.plot(gx, gy, color="r")
    plt.show()

当初始函数点的 x 值列表从正值开始时,代码似乎可以正常工作,但是如果我将这些值移动负数(在纸面上只会将输出值向左移动),则生成的近似值在某些值附近会失真,如果它偏移了少量或弹出索引错误,否则会弹出索引错误。fx

这是错误消息:

Traceback (most recent call last):
  File "c:\Users\marco\Documents\My Programs\Personal\Expand.py", line 53, in <module>
    gx, gy = G(2)
             ^^^^
  File "c:\Users\marco\Documents\My Programs\Personal\Expand.py", line 42, in __call__
    Ey.append(self.get_value(x))
              ^^^^^^^^^^^^^^^^^
  File "c:\Users\marco\Documents\My Programs\Personal\Expand.py", line 16, in get_value
    Ax, Bx = self.Fx[Ai], self.Fx[Bi]
                          ~~~~~~~^^^^
IndexError: list index out of range

我已经检查了变量 、 、 、 、 、 和 的值,但这似乎不是问题,因为获取每个变量的公式可以正常工作。AxBxAyBydAydByVxVxdenominatorpqxy

我认为错误必须来自方法或我找到变量的方式__call__index

Python 索引OutOfboundsException

评论

0赞 John Gordon 10/23/2023
请分享完整的错误消息。
0赞 gboffi 10/23/2023
如果您花时间编辑您的问题并解释您想做什么,可能会有所帮助。
0赞 deceze 10/23/2023
该指示线之前的值是多少?它们应该是什么?self.FxBi

答:

0赞 M11X00 10/23/2023 #1

问题现在解决了,我只需要导入数学模块并替换为index = self.Fx.index(int(x))index = self.Fx.index(math.floor(x))

事实证明,函数 int(x) 对于正值和 floor(x) 一样有效,但对于负值则不然,例如:

int(2.5) = 2
楼层(2.5) = 2

int(-2.5) = -2
floor(-2.5) = -3