Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么减小np.linspace的范围会提高数值积分的精度?_Python_Numpy_Numerical Integration - Fatal编程技术网

Python 为什么减小np.linspace的范围会提高数值积分的精度?

Python 为什么减小np.linspace的范围会提高数值积分的精度?,python,numpy,numerical-integration,Python,Numpy,Numerical Integration,阅读关于简单数值积分()的教程,它似乎建议减少函数中使用的x值的范围,返回更精确的数值答案。使用的代码是 def integrate(f, a, b, N): x = np.linspace(a, b, N) fx = f(x) area = np.sum(fx)*(b-a)/N return area integrate(np.sin, 0, np.pi/2, 100) 这将返回值0.99783321217729803 但是,当他们将集成方法修改为: def

阅读关于简单数值积分()的教程,它似乎建议减少函数中使用的x值的范围,返回更精确的数值答案。使用的代码是

def integrate(f, a, b, N):
    x = np.linspace(a, b, N)
    fx = f(x)
    area = np.sum(fx)*(b-a)/N
    return area

integrate(np.sin, 0, np.pi/2, 100)
这将返回值0.99783321217729803

但是,当他们将集成方法修改为:

def integrate(f, a, b, N):
    x = np.linspace(a+(b-a)/(2*N), b-(b-a)/(2*N), N)
    fx = f(x)
    area = np.sum(fx)*(b-a)/N
    return area

integrate(np.sin, 0, np.pi/2, 100)
这将返回更准确的值1.0000102809119051。为什么会这样?

有两件事:

  • 第一个
    集成中的步长不是
    (b-a)/N
    ,而是
    (b-a)/(N-1)

  • 在第一种方法中,误差主要由左右两侧的半条超调控制,即
    (b-a)/(N-1)/2*f(a)
    (b-a)/(N-1)/2*f(b)
    。如果你把这两种方法相减,你会得到与第二种方法相当的准确度


也许我读错了,但看起来步数保持不变,因此减小范围实际上会减小步长->更精确,但改变积分范围不会改变答案吗?积分sin(x)从0到pi/2=1,但是从0+k到pi/2-k<1,不是吗?你改变了采样点的范围,而不是积分范围:在你的
区域
计算中,你仍然使用
(b-a)
,但是在第二种情况下,你的间隔中有更多的点采样范围与积分范围有何不同?我认为它们的意思是一样的。在第一种情况下,样本相对于集成箱的位置发生了变化。它从最左边的箱子的左端开始,以小步向右边移动。当到达最右边的箱子时,它将移动到最右边的箱子端。第二种情况是在每个箱子的中心取样。(这是二元线性被积函数的最佳位置。)