Part.I Introduction

高中及大学时代,苦『积分』久矣,当时如掌握了此『黑科技』,课堂作业岂不是秒秒钟搞定。本文将介绍如何用 Python 求积分,包括求一重积分、二重积分等等。

在这里插入图片描述

需要的包有

  • sympy:符号工具包
  • scipy:科学计算包
from sympy import *
from scipy.stats import *

Part.II 基础知识

在正式开始之前,首先需要了解下面的一些基础知识。

Chap.I 特殊量的表示

在求积分的过程中,会用到许多像『无穷大』、『PI』等特数量,它们在sympy库中是如何表示的呢?下面一个表格对它们进行了汇总

代码表示符号含义
pi π \pi π圆周率
oo ∞ \infty 无穷大
-oo − ∞ -\infty 负无穷大
exp(x) e x e^x ex自然常数的 x 次幂
log(x) l n ( x ) ln(x) ln(x)以自然常数为底的对数 l o g e x log_ex logex
erf(x) erf ⁡ ( x ) \operatorname{erf}(x) erf(x)误差函数 erf ⁡ ( x ) = 2 π ∫ 0 x e − t 2 d t \operatorname{erf}(x)=\frac{2}{\sqrt{\pi}}\int_{0}^{x} e^{-t^2}dt erf(x)=π 20xet2dt
erfc(x) erfc ⁡ ( x ) \operatorname{erfc}(x) erfc(x)误差函数补 erfc ⁡ ( x ) = 1 − erfc ⁡ ( x ) \operatorname{erfc}(x)=1-\operatorname{erfc}(x) erfc(x)=1erfc(x)
erfi(x) erfci ⁡ ( x ) \operatorname{erfci}(x) erfci(x)虚误差函数 erfci ⁡ ( x ) = − i erf ⁡ ( i x ) = 2 π ∫ 0 x e t 2 d t \operatorname{erfci}(x)=-i\operatorname{erf}(ix)=\frac{2}{\sqrt{\pi}}\int_{0}^{x}e^{t^2}dt erfci(x)=ierf(ix)=π 20xet2dt

Chap.II integrate 函数简析

求积分的函数 integrate()scipy 包中被定义,它的常用方法汇总如下表所示

代码含义
integrate(f(x),x)计算不定积分 ∫ f ( x ) d x \int f(x)dx f(x)dx
integrate(f(x),(x,a,b))计算定积分 ∫ a b f ( x ) d x \int_a^b f(x)dx abf(x)dx
integrate(f(x,y),x,y)计算双重不定积分 ∫ ∫   f ( x , y ) d x d y \int \int\ f(x,y)dxdy ∫∫ f(x,y)dxdy
integrate(f(x,y),(x,a,b),(y,c,d))计算双重定积分 ∫ c d ∫ a b   f ( x , y ) d x d y \int_c^d \int_a^b\ f(x,y)dxdy cdab f(x,y)dxdy

更高重积分同理

Part.III 求积分实例

这部分介绍几个求积分的实例。

Chap.I 一重积分

求不定积分

求下面的不定积分
F ( x ) = ∫ x e x ( e x + 1 ) 2   d x F(x)=\int \frac{xe^x}{(e^x+1)^2} \ dx F(x)=(ex+1)2xex dx
代码如下

def singleIntegral_a():
    """ 一重不定积分 """
    x = symbols('x')
    print(integrate(x*exp(x)/(exp(x)+1)**2, x))
    return

结果为

x - x/(exp(x) + 1) - log(exp(x) + 1)


F ( x ) = x − x e x + 1 − l n ( e x + 1 ) F(x)=x-\frac{x}{e^x+1}-ln\left( e^x+1 \right) F(x)=xex+1xln(ex+1)


求定积分
F ( x ) = ∫ 0 1 x 2 + e x + 1   d x F(x)=\int_0^1 x^2+e^x+1 \ dx F(x)=01x2+ex+1 dx
代码如下

def singleIntegral_b():
    """ 一重定积分 """
    x = symbols('x')
    fmt=integrate(x**2 + exp(x) + 1, (x, 0, 1))
    print(fmt)
    print(fmt.evalf())
    return

结果为

1/3 + E
3.05161516179238

Chap.II 二重积分

求不定积分
∫ e x 2 + y 2   d x \int e^{x^2+y^2}\ dx ex2+y2 dx
代码如下:

def doubleIntegral_a():
    """ 二重不定积分 """
    x, y = symbols('x y')
    fmt = integrate(exp(x**2+y**2),x,y)
    print(fmt)
    #print(fmt.evalf())
    return

结果为

pi*erfi(x)*erfi(y)/4


F ( x ) = π 4 ⋅ erfci ⁡ ( x ) ⋅ erfci ⁡ ( y ) F(x)=\frac{\pi}{4}\cdot\operatorname{erfci}(x)\cdot\operatorname{erfci}(y) F(x)=4πerfci(x)erfci(y)

如果设定范围 x ∈ [ 0 , 1 ] ,   y ∈ [ 1 , 2 ] x\in[0,1],\ y\in[1,2] x[0,1], y[1,2],则代码为

def doubleIntegral_a():
    """ 二重不定积分 """
    x, y = symbols('x y')
    fmt = integrate(exp(x**2+y**2),(x, 0, 1), (y, 1, 2))
    print(fmt)
    print(fmt.evalf())
    return

结果为

-pi*erfi(1)**2/4 + pi*erfi(1)*erfi(2)/4
21.9251145961748

求定积分
F ( x ) = ∫ 0 1 ∫ 0 3 − 2 y x y   d x d y F(x)=\int_{0}^{1}\int_{0}^{3-2y}xy\ dxdy F(x)=01032yxy dxdy
代码如下:

def doubleIntegral_b():
    """ 二重定积分 """
    x, y = symbols('x y')
    fmt = integrate(x * y, (x, 0, 3 - 2*y), (y, 0, 1))
    print(fmt)
    print(fmt.evalf())
    return

结果为

3/4
0.750000000000000

Reference

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐