用Python实现一种数值积分方法

2024-06-16 15:43:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试编写一个数值积分计算器,作为我的第一个Python项目。该方法采用起始x值、增量x值和一组y值,并返回下限和上限。我期望数值积分的结果会随着dx变小而收敛,但它会变大

我试图将指数从0积分到1,当dx变小时,得到收敛到1/3的结果。目前,dx为0.1时,我的边界为(0.1400000000000004,0.172000000000004)。0.01的dx的边界为(0.30894500000000014,0.313747)

这是我的密码:

class Linear:
    """Creates a linear function from 2 points"""
    def __init__(self, x0, y0, x1, y1):
        self.__x0 = x0
        self.__y0 = y0
        self.__x1 = x1
        self.__y1 = y1
        self.__a = ((y1 - y0) / (x1 - x0))
        self.__b = y0 - (self.__a * x0)

    def fun(self, x):
        return self.__a * x + self.__b


def integrate(x0, dx, data):
    if len(data) < 3:
        raise ValueError("data passed to integrate doesn't have enough data")
    else:
        i, lb, ub = 2, 0, 0
        while i < len(data):
            y0, y1, y2 = data[i - 2], data[i - 1], data[i]
            lin = Linear(x0, y0, x0 + dx + dx, y2)
            lin_delta = lin.fun(x0 + dx)
            if y1 < lin_delta:
                if y0 < y1:
                    lb += (y0 * dx)
                    ub += ((((y1 - y0) * dx) / 2) + (y0 * dx))
                else:
                    lb += (y1 * dx)
                    ub += ((((y0 - y1) * dx) / 2) + (y1 * dx))
            else:
                if y0 < y1:
                    ub += (y1 * dx)
                    lb += ((((y1 - y0) * dx) / 2) + (y0 * dx))
                else:
                    ub += (y0 * dx)
                    lb += ((((y0 - y1) * dx) / 2) + (y1 * dx))
            i += 1
            x0 += dx

    return lb, ub


if __name__ == '__main__':
    j = 0
    d = []
    dxj = 0.1

    while j < (1/dxj):
        d += [(j * dxj) * (j * dxj)]
        j += 1

    print(d)
    print(integrate(0, dxj, d))

另外,避免与i等计数器发生名称冲突的最佳方法是什么


Tags: selfdataifdefelseintegratex1lb