Python中的数值方法-无法发现问题?

时间:2018-11-22 22:46:35

标签: python python-3.x math integration numerical-methods

我正在写这个梯形规则的数值方法公式用于双积分。 enter image description here

请注意,hx =(b-a)/ nx,hy =(d-c)/ ny以获取间隔宽度,xj = a + hx j和yi = c + hy i

1 个答案:

答案 0 :(得分:4)

代码中的一些问题:

首先是的,您的缩进不正确(但是我认为这是由于不能很好地复制它,因为这会导致错误而不是错误的值)。以后请确保问题的缩进与您在自己的计算机上的缩进一致,然后再进行发布...

然后,当且仅当其在相应的总和中时,才应在for内添加一个术语...在这里,您将所有内容都放在双for循环中,这对应于将所有术语包含在两倍总和。

最后range(1,n)只在n-1停了,因此您要删除范围内的-1

最后:

def double_integral(f,a,b,c,d,nx,ny):

    hx = (b-a)/nx
    hy = (d-c)/ny 

    first_term = (f(a,c)+f(a,d)+f(b,c)+f(b,d))

    i_sum = 0
    for i in range(1,ny):
        i_sum += f(a,c+i*hy)+f(b, c+i*hy)

    j_sum = 0
    for j in range(1,nx):
        j_sum += f(a+j*hx,c)+f(a+j*hx,d)

    ij_sum = 0
    for i in range(1,ny):
        for j in range(1,nx):
            ij_sum += f(a+j*hx,c+i*hy)

    integral = (first_term/4 + i_sum/2 + j_sum/2 + ij_sum) * hx * hy

    return integral


def t(x,y):
    return x*(y**(2))

print(double_integral(t,0,2,0,1,10,10))

0.6700000000000003

选择比2/3大的步数,您将更接近10 ...

使用总和理解,您可以变得更加Python化:

def double_integral(f,a,b,c,d,nx,ny):
    hx = (b-a)/nx
    hy = (d-c)/ny 
    first_term = (f(a,c)+f(a,d)+f(b,c)+f(b,d))
    i_sum = sum(f(a,c+i*hy)+f(b, c+i*hy) for i in range (1,ny))
    j_sum = sum(f(a+j*hx,c)+f(a+j*hx,d) for j in range(1,nx))
    ij_sum = sum(f(a+j*hx,c+i*hy) for i in range (1,ny) for j in range(1,nx))
    integral = (first_term/4 + i_sum/2 + j_sum/2 + ij_sum) * hx * hy
    return integral