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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/529011.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

01-分析同步通讯/异步通讯的特点及其应用

同步通讯/异步通讯 微服务间通讯有同步和异步两种方式 同步通讯: 类似打电话场景需要实时响应(时效性强可以立即得到结果方便使用),而且通话期间不能响应其他的电话(不支持多线操作)异步通讯: 类似发邮件场景不需要马上回复并且可以多线操作(适合高并发场景)但是时效性弱响应…

电脑右下角出线白色弹窗的解决方法

电脑无缘无故,在右下角出现一个白色弹窗,无法关闭,非常恶心,后来经过查询,发现可能是360之类的弹bug,解决只需要: 1、鼠标左键 点击一下白框 2、键盘输入 AltF4 虽不是技术问题,但解…

day59 线程

创建线程的第二种方式 实现接口Runnable 重写run方法 创建线程的第三种方式 java.util.concurrent下的Callable重写call()方法 java.util.concurrent.FutureTask 创建线程类对象 获取返回值 线程的四种生命周期 线程的优先级1-10 default为5,优先级越高&#xff0c…

本地部署推理TextDiffuser-2:释放语言模型用于文本渲染的力量

系列文章目录 文章目录 系列文章目录一、模型下载和环境配置二、模型训练(一)训练布局规划器(二)训练扩散模型 三、模型推理(一)准备训练好的模型checkpoint(二)全参数推理&#xff…

数据结构(二)——顺序表和链表的比较

1、存取(读/写)方式 顺序表可以顺序存取,也可以随机存取,在第i个位置上执行存取操作,顺序表仅需一次访问. 链表只能从表头开始依次顺序存取,链表在第i个位置执行存取则需从表头开始依次访问i次. 2、逻辑结构与物理结…

【数据库系统概论】第2章:关系数据库

文章目录 0. 前言2.1 关系数据结构及形式化定义2.1.1关系2.1.2 关系模式 2.2 关系操作2.3 关系的完整性2.4 关系代数 0. 前言 关系数据库系统是支持关系模型的数据库系统。第一章初步介绍了关系模型及其基本术语。本章将深入介绍关系模型。 按照数据模型的三个要素,…

JS-06-数组

一、数组的创建与访问 见:JS-04-javaScript数据类型和变量 JavaScript的Array可以包含任意数据类型,并通过索引来访问每个元素。 要取得Array的长度,直接访问length属性: let arr [1, 2, 3.14, Hello, null, true]; console.l…

系统运维网络知识汇总

一、系统运维中网络方面的规划与思考 系统运维建立在网络的基础之上,如果没有一个相对合理的网络架构,恐怕系统运维做起来也不是那么的顺手。一个公司基本上都会把网络和服务器独立开来,划分不同的区域摆放设备,很多时候都是物理…

基于springboot+vue实现食品安全管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现食品安全管理系统演示 摘要 食品行业同其他行业有很多的差别,食品行业不仅要管食品的生产和销售,还要管食品的库存和保质期,那么对于食品管理者来说,就存在着一定的难度。况且食品的种类复杂,存储条…

JavaWeb实验 Servlet基础编程

实验目的 编写Servlet代码;熟悉并掌握Servlet的使用和配置。 实验内容 【1】利用Servlet实现一个简单的登录系统,要求: 包括登录页面、登录成功页面和登录失败提示页面;用户可以在登录页面输入用户名和密码;点击登…

面试题:分布式锁用了 Redis 的什么数据结构

在使用 Redis 实现分布式锁时,通常使用 Redis 的字符串(String)。Redis 的字符串是最基本的数据类型,一个键对应一个值,它能够存储任何形式的字符串,包括二进制数据。字符串类型的值最多可以是 512MB。 Re…

简单了解一个数据包在网络的一生

在主题之前,我想先谈谈目前计算机的网络模型,主要谈谈 TCP/IP 模型: 应用层:产生最原始的数据,常见协议如 http、ftp、websocket、DNS、QUIC 传输层:传递应用层的数据给网络层,必要时进行切割&…