Python数值微积分,摆脱被高数支配的恐惧

2024-03-11 09:12

本文主要是介绍Python数值微积分,摆脱被高数支配的恐惧,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 差分和累加
    • 积分
    • 多重积分

Python科学计算:数组💯数据生成

差分和累加

微积分是现代科学最基础的数学工具,但其应用对象往往是连续函数,而其在非连续函数的类比,便是差分与累加。在【numpy】中,可通过【diff】和【cumsum】来完成这两项任务。

y = sin ⁡ 2 x y=\sin 2x y=sin2x为例,其导数为 d y d x = 2 cos ⁡ x \frac{\text dy}{\text dx}=2\cos x dxdy=2cosx,积分则为 ∫ y d x = − 1 2 cos ⁡ 2 x + C \int y\text dx=-\frac{1}{2}\cos 2x+C ydx=21cos2x+C C C C是某个常数。这三个函数的曲线分别为

在这里插入图片描述

绘图函数如下

import matplotlib.pyplot as plt
import numpy as np
dx = 0.1
x = np.arange(100)*dx
y = np.sin(2*x)
plt.plot(x, y, label="y=sin(2x)")
plt.plot(x[1:], np.diff(y)/dx, label="diff(y)/dx")
plt.plot(x, np.cumsum(y)*dx, label="cumsum(y)*dx")plt.grid()
plt.legend()
plt.show()

其中,diff用于求差分,其输入参数除了待差分数组之外,还有n和axis,比较常用,n为差分的阶数,默认为1;axis用于高维数组中,表示计算的方向,默认-1表示最后一个轴。

cumsum用于累加,对于输入数组 y y y,其返回数组为 S S S,则 S n = ∑ i = 0 n y i S_n=\sum_{i=0}^ny_i Sn=i=0nyi

无论diff还是cumsum,均只针对输入数组进行操作,而不会考虑微积分中至关重要的 d x \text dx dx,所以绘图时对这一部分进行了补全。

此外,由于差分的实质是后一个减去前一个,所以元素个数必然会减少,所以在绘图时,令 x x x从1开始。这是一个在编程时很容易出错的地方,故而numpy还提供了另一个函数【ediff1d】,这是一个只做一阶差分计算的函数,但提供了to_endto_begin参数,分别用于在diff计算结果的后面或前面补充数值。

积分

积分一开始被引入教材,是以梯形求和为示例的:将函数 y = f ( x ) y=f(x) y=f(x)无限分割,然后对相邻两点取平均,再乘以 d x \text dx dx之后进行求和,即 lim ⁡ δ x → 0 ∑ y i + y i + 1 2 δ x \lim_{\delta_x\to0}\sum \frac{y_{i}+y_{i+1}}{2}\delta_x limδx02yi+yi+1δx

【trapz】可实现上述过程,但要求 y y y是一个给定的数组,且 δ x \delta_x δx为1。很显然,这个过程只能称之为梯形求和,毕竟积分的要求是 δ x → 0 \delta_x\to0 δx0 1 1 1 0 0 0有着本质的区别。

为此,【scipy.intergrate】作为顾名思义的积分模块,提供了真真正正的积分。为了行文简洁,后文将此模块简称为【si】模块。

【quad】是【si】中最常用的积分函数,以函数 x 2 x^2 x2 sin ⁡ x \sin x sinx为例,其使用流程如下

import numpy as np
from scipy.integrate import quadfunc = lambda x: x**2
quad(func, 0, 4)        # (21.33, 2.37-13)
quad(np.sin, 0, np.pi)  # (2.0, 2.22e-14)

其中,quad共输入了三个参数,分别是待积分函数、积分下界与积分上界,其返回值有二,分别为积分结果和计算误差。

这两个测试函数的解析形式如下,可见计算结果基本温和。

∫ 0 4 x 2 d x = 1 3 x 3 ∣ 0 4 = 64 3 ≈ 21.3 ∫ 0 π sin ⁡ x d x = − cos ⁡ x ∣ 0 π = 2 \int_0^4 x^2\text dx=\frac{1}{3}x^3\big|^4_0=\frac{64}{3}\approx 21.3\\ \int^\pi_0\sin x\text dx=-\cos x\big|^\pi_0=2 04x2dx=31x3 04=36421.30πsinxdx=cosx 0π=2

除了三个必须输入的参数之外,下列参数也较为常用

  • argsfunc函数中,除待求积分参数之外的其他参数,默认为空
  • epsabs, epsrel 分别为绝对和相对误差,默认为 1.49 × 1 0 − 8 1.49\times10^{-8} 1.49×108
  • limit 自适应算法中子区间的个数,默认50
  • points 断点位置,默认为None
  • weight, wvar 定义域区间内的权重类型和权重,默认为None
  • wopts, maxp1 切比雪夫矩及其上限,默认为None和50
  • full_output=0, limlst=50, complex_func=False

其中,weightwvar参数的具体取值如下。

weightwvar函数
“cos” w w w cos ⁡ w x \cos wx coswx
“sin” w w w sin ⁡ w x \sin wx sinwx
“alg” α , β \alpha, \beta α,β g ( x ) g(x) g(x)
“alg-loga” α , β \alpha, \beta α,β g ( x ) log ⁡ ( x − a ) g(x)\log(x-a) g(x)log(xa)
“alg-logb” α , β \alpha, \beta α,β g ( x ) log ⁡ ( b − x ) g(x)\log(b-x) g(x)log(bx)
“alg-log” α , β \alpha, \beta α,β g ( x ) log ⁡ ( x − a ) log ⁡ ( b − x ) g(x)\log(x-a)\log(b-x) g(x)log(xa)log(bx)
“cauchy” c c c 1 x − c \frac{1}{x-c} xc1

其中, g ( x ) = ( x − a ) α ∗ ( b − x ) β g(x)=(x-a)^\alpha*(b-x)^\beta g(x)=(xa)α(bx)β

func f ( x ) = x f(x)=x f(x)=x,若weight参数为cos,而wvar取值为 w w w,则实际计算的积分表达式为

∫ a b cos ⁡ w f ( x ) d x \int_a^b\cos wf(x)\text dx abcoswf(x)dx

示例如下

func = lambda x : x
quad(func, 0, np.pi)    # (4.935, 5.478e-14)
quad(func, 0, np.pi, weight='cos', wvar=1)  # (-2.00, 1.926e-13)

多重积分

在【si】中,除了quad之外,还提供了二重、三重以及N重积分的API,分别是【dblquad, tplquad, nquad】,三者所需参数如下

MIN = 1.49e-08
dblquad(func, a, b, gfun, hfun, args=(), epsabs=MIN, epsrel=MIN)
tplquad(func, a, b, gfun, hfun, qfun, rfun, args=(), epsabs=MIN, epsrel=MIN)
nquad(func, ranges, args=None, opts=None, full_output=False)

dblquad

以二重积分为例,其对应的问题可表述为下式

∫ a b ∫ y g ( x ) y h ( x ) f ( y , x ) d x d y \int^b_a\int^{y_h(x)}_{y_g(x)} f(y,x)\text dx\text dy abyg(x)yh(x)f(y,x)dxdy

在函数dblquad中,func对应 f ( y , x ) f(y,x) f(y,x),a,b对那个上式的 a , b a,b a,b,gfun, hfun对应上式的 y g ( x ) , y h ( x ) y_g(x), y_h(x) yg(x),yh(x)

接下来求解下面的积分

∫ 1 2 ∫ x 2 x 3 x y d y d x = ∫ 1 2 1 2 ( x y 2 ) ∣ x 2 x 3 d x = ∫ 1 2 1 2 ( x 7 − x 5 ) d x = 1 2 ( 1 8 x 8 − 1 6 x 6 ) ∣ 1 2 = 1 2 ( 2 8 8 − 2 6 6 ) + 1 48 = 513 48 \begin{aligned} &\int^2_1\int^{x^3}_{x^2} xy\text dy\text dx\\ =&\int^2_1 \frac{1}{2}(xy^2)\vert^{x^3}_{x^2}\text dx=&\int^2_1 \frac{1}{2}(x^7-x^5)\text dx\\ =&\frac1 2(\frac1 8x^8-\frac1 6x^6)\vert^2_1=&\frac1 2(\frac{2^8}{8}-\frac{2^6}{6})+\frac{1}{48}\\ =&\frac{513}{48} \end{aligned} ===12x2x3xydydx1221(xy2)x2x3dx=21(81x861x6)12=485131221(x7x5)dx21(828626)+481

Python代码如下

from scipy.integrate import dblquad
func = lambda x,y : x*y
gf = lambda x: x**2
hf = lambda x: x**3
dblquad(func, 1, 2, gf, hf)
# (10.6875, 5.284867210146833e-13)

计算结果与 513 48 \frac{513}{48} 48513一致。

与二重积分相比,三重积分tplquad只是多了一组qfun和rfun,相当于z处于qfun(x,y)和rfun(x,y)之间。

【nquad】貌似不支持回调函数,其参数ranges是元组的列表,每个元组代表对应未知量的取值范围。若将其映射为三重积分函数,则ranges可表示为 ( ( a 1 , b 1 ) , ( a 2 , b 2 ) , ⋯ , ( a n , b n ) ) ((a_1,b_1), (a_2, b_2),\cdots,(a_n, b_n)) ((a1,b1),(a2,b2),,(an,bn))

下面仍以函数func为例,用nquad得出结果

from scipy.integrate import nquad
nquad(func, [[1,2], [3, 4]])
#(0.39276170758930756, 4.91851540406507e-15)

这篇关于Python数值微积分,摆脱被高数支配的恐惧的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/797368

相关文章

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

nudepy,一个有趣的 Python 库!

更多资料获取 📚 个人网站:ipengtao.com 大家好,今天为大家分享一个有趣的 Python 库 - nudepy。 Github地址:https://github.com/hhatto/nude.py 在图像处理和计算机视觉应用中,检测图像中的不适当内容(例如裸露图像)是一个重要的任务。nudepy 是一个基于 Python 的库,专门用于检测图像中的不适当内容。该

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

HTML提交表单给python

python 代码 from flask import Flask, request, render_template, redirect, url_forapp = Flask(__name__)@app.route('/')def form():# 渲染表单页面return render_template('./index.html')@app.route('/submit_form',

Python QT实现A-star寻路算法

目录 1、界面使用方法 2、注意事项 3、补充说明 用Qt5搭建一个图形化测试寻路算法的测试环境。 1、界面使用方法 设定起点: 鼠标左键双击,设定红色的起点。左键双击设定起点,用红色标记。 设定终点: 鼠标右键双击,设定蓝色的终点。右键双击设定终点,用蓝色标记。 设置障碍点: 鼠标左键或者右键按着不放,拖动可以设置黑色的障碍点。按住左键或右键并拖动,设置一系列黑色障碍点

Python:豆瓣电影商业数据分析-爬取全数据【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】

**爬取豆瓣电影信息,分析近年电影行业的发展情况** 本文是完整的数据分析展现,代码有完整版,包含豆瓣电影爬取的具体方式【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】   最近MBA在学习《商业数据分析》,大实训作业给了数据要进行数据分析,所以先拿豆瓣电影练练手,网络上爬取豆瓣电影TOP250较多,但对于豆瓣电影全数据的爬取教程很少,所以我自己做一版。 目

微积分-积分应用5.4(功)

术语“功”在日常语言中用来表示完成一项任务所需的总努力量。在物理学中,它有一个依赖于“力”概念的技术含义。直观上,你可以将力理解为对物体的推或拉——例如,一个书本在桌面上的水平推动,或者地球对球的向下拉力。一般来说,如果一个物体沿着一条直线运动,位置函数为 s ( t ) s(t) s(t),那么物体上的力 F F F(与运动方向相同)由牛顿第二运动定律给出,等于物体的质量 m m m 与其