不使用for循环的python积分计算

时间:2017-05-04 16:15:34

标签: python

我想实现一个python程序,它可以计算这个积分 Here is the integral

我知道如何使用For Loop制作它,它看起来像这样

import numpy as np;


def numint(f,alpha,beta,N,b,c):
    s = np.size(b);
    x = np.linspace(alpha,beta,N);
    h = x[1]-x[0];
    result = 0;
    result1 = 0;
    for j in range(1,N+1):
        for i in range(1,s+1):
           result1+=b[i]*f(x[j-1]+h*c[i]);
        result+=h*result1;
        result1 = 0;
    return result;

没有循环我觉得它应该是这样的:

def numint(f,alpha,beta,N,b,c):
    s = np.size(b);
    x = np.linspace(alpha,beta,N);
    h = np.ones(N,dtype=int)*(x[1] - x[0]);
    result = 0;
    result = np.sum(h[1:N+1] * np.sum(b*(f(x[0:N]+h[0]*c))));
    return result;

但结果的第二部分= np.sum ...是错的,我不知道如何解决它。有什么建议吗?

编辑:

def numint(f,alpha,beta,N,b,c):
    s = np.size(b);
    x = np.linspace(alpha,beta,N);
    h = np.ones(N,dtype=int)*(x[1] - x[0]);
    functionResult = f(x+h*c);
    dif = np.diff(functionResult);  
    result = 0;
    result = np.sum(h[1:N+1] * np.sum(b*dif.sum()));
    return result;

作为提示:向量化它们 但我不知道如何使用它

1 个答案:

答案 0 :(得分:0)

您正在寻找的是np.diff功能。

假设您正在寻找f(x)= x ^ 2的0到10的积分,其中F(x)=(x ^ 3)/ 3:

x = np.linspace(0, 10, 1000)
F = lambda x: x**3/3
b = F(x)

dif = np.diff(b)

sum = dif.sum()

print(sum)
333.33333333333326

实际结果是333.3 ......

您可以使用任何所需的函数替换F,但键是np.diff,它会将数组的大小减小一。然后,只需按照您的间隔求和差异,即可获得结果。

您可以通过简单地增加步数(在我的示例中为1000)来提高结果的精确度。