1

我必须更改 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”循环是否正确使用了中点规则?我无法判断循环是否正确使用了中点规则,因为我不太了解该规则。非常感谢您,并且很容易,因为我对编程很陌生。

4

0 回答 0