利用Python实现数值积分的方法
作者:赵卓不凡? 发布时间:2023-07-11 10:16:31
标签:Python,实现,数值,积分
1. 栗子
为了加深大家的印象,首先我们来看个例子:
图示如下:
2. 矩形计算面积
我们知道,在数学中,积分运算表示上述曲线和x轴围成的封闭区域的面积,为此,我们在数值预算中,来近似计算上述区域的面积,最直观的想法就是拆成一个个小的矩形来计算对应的面积。
2.1 左侧边长计算面积
为了计算每个小矩形的面积,设计到边长高的选择,这里我么以左侧函数取值作为对应矩形的高来计算相应的小矩形的面积,图示如下:
对应的代码如下:
import numpy as np
x = np.linspace(0, 3, 1001)
f = lambda x: x**3 - 4*x**2 + 4*x + 2
a = 0.5
b = 2.5
Ax = np.linspace(a, b, 101)
Ay = f(Ax)
def defInt_left(f, a, b, N):
# left-hand point
result = 0; FX = []; Xn = []
dx = abs(b - a)/N
while a < b:
result += f(a)*dx
FX += [f(a)]
Xn += [a]
a += dx
return result, FX, Xn, dx
N = 4
I_left, FX, Xn, dx = defInt_left(f, a, b, N)
print(I_left)
上述代码中,我们将横坐标拆分为4小份,也就是拆分成4个小矩形,然后使用函数左侧的点坐位小矩形的高,上述代码的运行结果如下:
5.25
2.2 右侧边长计算面积
这里和上述原理类似,只不过每个小矩形的高采用右侧边长函数取值来近似计算,图例如下:
样例代码如下:
def defInt_right(f, a, b, N):
# right-hand point
result = 0; FX = []; Xn = []
dx = abs(b - a)/N
while a < b:
result += f(a + dx)*dx
FX += [f(a + dx)]
Xn += [a]
a += dx
return result, FX, Xn, dx
N = 4
I_right, FX, Xn, dx = defInt_right(f, a, b, N)
print(I_right)
运行结果如下:
5.0
2.3 中值边长计算面积
看了上述两种近似计算方式,有同学就说有取左侧点算出来面积大的,有取右侧点算出来面积小的,那干脆折中一下,我们来以中值坐位矩形的高来计算对应的面积。图例如下:
代码实现如下:
def defInt_middle(f, a, b, N):
# middle point
result = 0; FX = []; Xn = []
dx = abs(b - a)/N
while a < b:
result += f(a + dx/2)*dx
FX += [f(a + dx/2)]
Xn += [a]
a += dx
return result, FX, Xn, dx
N = 4
I_mid, FX, Xn, dx = defInt_middle(f, a, b, N)
print(I_mid)
运行结果如下:
5.0625
3. 梯形计算面积
读到这里的同学可能会思考,既然可以将封闭区域划分成一个个的小矩形,那当然也可以将其划分成梯形来近似计算相应的面积,图例如下:
样例代码如下:
def defInt_trapezoid(f, a, b, N):
# trapezoidal rule
result = 0; FXa, FXb = [], []; Xn = []
dx = abs(b - a)/N
while a < b:
result += (f(a) + f(a + dx))*dx/2
FXa += [f(a)]; FXb += [f(a + dx)]
Xn += [a]
a += dx
return result, FXa, FXb, Xn, dx
N = 4
I_trap, FXa, FXb, Xn, dx = defInt_trapezoid(f, a, b, N)
print(I_trap)
运行结果如下:
5.125
4. 真值比对
最后,我们来针对不同的N来讲封闭区域划分成对应的小份,分别针对性的计算上述四种方式的积分值,样例代码如下:
Nx = range(1, 11)
I1, I2, I3, I4 = [], [], [], []
for Ni in Nx:
i1, *_ = defInt_left(f, a, b, Ni); I1 += [i1];
i2, *_ = defInt_right(f, a, b, Ni); I2 += [i2];
i3, *_ = defInt_middle(f, a, b, Ni); I3 += [i3];
i4, *_ = defInt_trapezoid(f, a, b, Ni); I4 += [i4];
最后将其与真值进行对比,如下:
可以看出,随着划分区域的增多,采用梯形计算面积方式最逼近真值。
5. 总结
本文重点介绍了使用不同面积划分方法来近似计算积分取值的原理和相应的代码实现,其中采用梯形计算面积的方式随着划分子区域数目的增加最接近真值,推荐大家使用。
来源:https://blog.csdn.net/sgzqc/article/details/122817967


猜你喜欢
- 问题描述我自己根据edgelist计算的邻接矩阵,与调用networkx.adjacency_matrix(g)返回的结果不一样,经过调试发
- 前言今天给大家分析3个计算机视觉方向的Python实用代码,主要用到的库有:opencv-pythonnumpypillow要是大家所配置的
- 首先我们有这么一种需求,就是我在一个列表中点击了某个item,跳转到详情界面,那么我就需要把item的实体数据从列表页面传递到详情页面,那么
- 本文实例讲述了PHP实现的微信公众号扫码模拟登录功能。分享给大家供大家参考,具体如下:PHP微信公众号扫码模拟登录功能功能只是将:https
- 从一段指定的字符串中,取得期望的数据,正常人都会想到正则表达式吧?写过正则表达式的人都知道,正则表达式入门不难,写起来也容易。但是正则表达式
- 在使用SQL Server存储过程或者触发器时,通常会使用自定义异常来处理一些特殊逻辑。例如游标的销毁,事务的回滚。接下来将会详细的介绍SQ
- 首先,啰嗦几句废话如下: (1)触发器(trigger)是个特殊的存储过程,它的执行并不需要我们去显式调用,而是由一些事件触发,这有点类似C
- 前言reinhard算法:Color Transfer between Images,作者Erik Reinhardwelsh算法:Tran
- 试一试这个办法:struserlist = struserlist & "<
- 1、打开一个记事本,将需要安装的第三方python依赖包写入文件,比如:需要安装urllib3、flask、bs4三个python库(替换成
- 一维线性拟合数据为y=4x+5加上噪音结果:import numpy as npfrom mpl_toolkits.mplot3d impo
- 发现问题一个作业报错,报错信息如下,从错误信息根本看不出为什么出错,手工运行作业又成功了。一时不清楚什么原因导致作业出错。MessageEx
- 1,使用mysqldump时报错(1064),这个是因为mysqldump版本太低与当前数据库版本不一致导致的。mysqldump: Cou
- Hinton在论文《Improving neural networks by preventing co-adaptation of fea
- 有2种方法:一、 QML中定义一个信号,连接Python里的函数;这里的函数不用特意指明为槽函数,普通函数即可。QML的信号连接Python
- 下面给大家介绍Java正则表达式验证固定电话号码符合性,具体代码如下所示:/** * 验证固定电话号码的合法性 * @author jy *
- 目录解决方案:1. IGNORE2. REPLACE3. ON DUPLICATE KEY UPDATE我们插入数据的时候,有可能碰到重复数
- 因为直接把内容作为字符串给编辑器的 Value 属性赋值使用的是 JavaScript 代码,要让 JS 代码不受内容中双引号、换行等的干扰
- websocket网易聊天室?web微信?直播?假如你工作以后,你的老板让你来开发一个内部的微信程序,你需要怎么办?我们先来分析一下里面的技
- librosa是处理音频库里的opencv,使用python脚本研究音频,先安装三方库librosa。如下通过清华镜像源安装librosa;