我必须更改 Python 中的脚本,该脚本使用黎曼的总和与左手规则来计算函数的积分,并对其进行修改,以便它使用黎曼的总和与中点规则。这是原始脚本(左手规则):
import numpy as nt
import matplotlib.pyplot as plt
def func(x):
return 1+nt.exp(-x)*nt.sin(5*x)
def Riemann(x0,xn,N):
x=nt.zeros((N))
y=nt.zeros((N))
dx=(xn-x0)/(N-1)
x[0]=x0
y[0]=func(x[0])
somme=0.0
plt.plot([x[0],x[0]],[0,func(x[0])],'-b')
for i in nt.arange(1,N):
somme=somme+y[i-1]*dx
x[i]=x[i-1]+dx
y[i]=func(x[i])
plt.plot([x[i-1],x[i],x[i]],[y[i-1],y[i-1],y[i]],'-k')
plt.plot([x[i],x[i]],[0,y[i]],'-g')
plt.plot([x[N-1],x[N-1]],[0,func(x[N-1])],'-b')
plt.plot(x,func(x),'r')
yy=nt.zeros((N))
plt.plot(x,yy,'b')
plt.title('Sums of Riemann with lefthand rule')
plt.xlabel('x')
plt.ylabel('y')
plt.show()
然后我尝试修改脚本,使其使用中点规则,它看起来像这样:
import numpy as nt
import matplotlib.pyplot as plt
def func(x):
return 1+nt.exp(-x)*nt.sin(5*x)
def Riemann(x0,xn,N):
x=nt.zeros((N))
y=nt.zeros((N))
dx=(xn-x0)/(N-1)
x[0]=x0
y[0]=func(x[0])
somme=0.0
plt.plot([x[0],x[0]],[0,func(x[0])],'-b')
for i in nt.arange(1,N):
somme=somme+2*((y[i-1]+y[i])/2)*dx
x[i]=x[i-1]+dx
y[i]=func(x[i])
plt.plot([x[i-1],x[i-1],x[i]],[y[i-1],((y[i-1]+y[i])/2),((y[i-1]+y[i])/2)],'-k')
plt.plot([x[i],x[i]],[0,y[i]],'-g')
plt.plot([x[N-1],x[N-1]],[0,func(x[N-1])],'-b')
plt.plot(x,func(x),'r')
yy=nt.zeros((N))
plt.plot(x,yy,'b')
plt.title('Riemann sums with midpoints rule')
plt.xlabel('x')
plt.ylabel('y')
plt.show()
我有两个问题。首先,中点图形的脚本有什么问题,因为红线上方的黑线不应该停止?其次,第二个脚本中的“for”循环是否正确使用了中点规则?我无法判断循环是否正确使用了中点规则,因为我不太了解该规则。非常感谢您,并且很容易,因为我对编程很陌生。