使用 for 循环的辛普森法则(数值积分)
Simpson's Rule using for loops (numerical integration)
我正在尝试使用 for 循环在 python 中编写辛普森法则,但我一直收到断言错误并且无法找出原因。
def integrate_numeric(xmin, xmax, N):
xsum = 0
msum = 0
h = (xmax-xmin)//N
for i in range(0, N):
xsum += f(xmin + i*h)
print (xsum)
for i in range(0,N-1):
msum += f(xmin + (h/2) + i*h)
print (msum)
I = (h/6) * (f(xmin) + 4*(msum) + 2*(xsum) + f(xmax))
return I
f:
def f(x):
return (x**2) * numpy.sin(x)
示例:
assert numpy.isclose(integrate_numeric(xmin=0, xmax=4, N=50), 1.096591)
这是您的代码的固定版本:
import numpy
def integrate_numeric(xmin, xmax, N):
'''
Numerical integral of f from xmin to xmax using Simpson's rule with
N panels.
'''
xsum = 0
msum = 0
h = (xmax-xmin)/N
for i in range(1, N):
xsum += f(xmin + i*h)
print(xsum)
for i in range(0, N):
msum += f(xmin + (h/2) + i*h)
print(msum)
I = (h/6) * (f(xmin) + 4*msum + 2*xsum + f(xmax))
return I
def f(x):
'''Function equivalent to x^2 sin(x).'''
return (x**2) * numpy.sin(x)
assert numpy.isclose(integrate_numeric(xmin=0, xmax=4, N=50), 1.096591)
备注:
- 两个
for
循环中的范围已更改:我们希望第一个 for
循环从 xmin + h
到 xmin + (N-1)*h
,步长为 [=15] =](所以 N-1
总值),第二个 for 循环从 xmin + h/2
到 xmin + (N-1)*h + h/2
,步长为 h
(N
总值)。
- 在最终计算中,无需将
f
应用于 msum
和 xsum
:这些值已经是 f
值的总和。我们仍然需要评估 f
的唯一地方是 xmin
和 xmax
。 (注意:这已经在对问题的编辑中得到修复。)
- 第
h = (xmax-xmin)//N
行需要 h = (xmax-xmin)/N
。您只需要在这里进行常规划分,而不是地面划分。这可能是您最初得到零的原因:h
本来是 0
.
我正在尝试使用 for 循环在 python 中编写辛普森法则,但我一直收到断言错误并且无法找出原因。
def integrate_numeric(xmin, xmax, N):
xsum = 0
msum = 0
h = (xmax-xmin)//N
for i in range(0, N):
xsum += f(xmin + i*h)
print (xsum)
for i in range(0,N-1):
msum += f(xmin + (h/2) + i*h)
print (msum)
I = (h/6) * (f(xmin) + 4*(msum) + 2*(xsum) + f(xmax))
return I
f:
def f(x):
return (x**2) * numpy.sin(x)
示例:
assert numpy.isclose(integrate_numeric(xmin=0, xmax=4, N=50), 1.096591)
这是您的代码的固定版本:
import numpy
def integrate_numeric(xmin, xmax, N):
'''
Numerical integral of f from xmin to xmax using Simpson's rule with
N panels.
'''
xsum = 0
msum = 0
h = (xmax-xmin)/N
for i in range(1, N):
xsum += f(xmin + i*h)
print(xsum)
for i in range(0, N):
msum += f(xmin + (h/2) + i*h)
print(msum)
I = (h/6) * (f(xmin) + 4*msum + 2*xsum + f(xmax))
return I
def f(x):
'''Function equivalent to x^2 sin(x).'''
return (x**2) * numpy.sin(x)
assert numpy.isclose(integrate_numeric(xmin=0, xmax=4, N=50), 1.096591)
备注:
- 两个
for
循环中的范围已更改:我们希望第一个for
循环从xmin + h
到xmin + (N-1)*h
,步长为 [=15] =](所以N-1
总值),第二个 for 循环从xmin + h/2
到xmin + (N-1)*h + h/2
,步长为h
(N
总值)。 - 在最终计算中,无需将
f
应用于msum
和xsum
:这些值已经是f
值的总和。我们仍然需要评估f
的唯一地方是xmin
和xmax
。 (注意:这已经在对问题的编辑中得到修复。) - 第
h = (xmax-xmin)//N
行需要h = (xmax-xmin)/N
。您只需要在这里进行常规划分,而不是地面划分。这可能是您最初得到零的原因:h
本来是0
.