Python 求导

Part.I Introduction

本文将介绍如何用 Python 来求导。求导法则戳我,可以用 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 diff 函数简析

diff 函数的一般用法为:

diff(func,x,n)

其中

  • func是要求导的函数
  • x是要对其求导的变量
  • n是可选的,表示求n阶导数,默认为1阶导数

Part.III 求导实例

Chap.I 导数

一阶导数

求下面函数的一阶导数
f 1 ( x ) = c o s ( x ) f_1(x)=cos(x) f1(x)=cos(x)
代码如下:

def firstDerivative_a():
    """ 一阶导数 """
    x = symbols('x')
    print(diff(cos(x), x))
    return

结果为

-sin(x)


f 1 ′ ( x ) = − s i n ( x ) f_1'(x)=-sin(x) f1(x)=sin(x)


二阶导数

求下面函数的二阶导数
f 2 ( x ) = c o s 2 ( x ) f_2(x)=cos^2(x) f2(x)=cos2(x)
代码如下:

def secondDerivative_a():
    """ 二阶导数 """
    x = symbols('x')
    print(diff(cos(x)**2, x ,2))
    return

结果为

2*(sin(x)**2 - cos(x)**2)


f 2 ′ ′ ( x ) = 2 [ s i n 2 ( x ) − c o s 2 ( x ) ] f''_2(x)=2[sin^2(x)-cos^2(x)] f2′′(x)=2[sin2(x)cos2(x)]

Chap.II 偏导数

一阶偏导数

求下面函数的一阶偏导数
g ( x , y ) = c o s ( x 2 y ) x 2 + y 2 + 1 g(x,y)=\frac{cos(x^2y)}{x^2+y^2+1} g(x,y)=x2+y2+1cos(x2y)
代码如下:

def firstPartialDerivative_a():
    """ 一阶偏导数 """
    x, y = symbols('x y')
    g = cos(x**2*y)/(x**2+y**2+1)
    dx = diff(g, x)
    dy = diff(g, y)

    print("对x的一阶偏导:", dx)
    print("对y的一阶偏导:", dy)
    return

结果为

对x的一阶偏导: -2*x*y*sin(x**2*y)/(x**2 + y**2 + 1) - 2*x*cos(x**2*y)/(x**2 + y**2 + 1)**2
对y的一阶偏导: -x**2*sin(x**2*y)/(x**2 + y**2 + 1) - 2*y*cos(x**2*y)/(x**2 + y**2 + 1)**2 


g x ′ ( x , y ) = − 2 x y ⋅ s i n ( x 2 y ) x 2 + y 2 + 1 − 2 x ⋅ c o s ( x 2 y ) ( x 2 + y 2 + 1 ) 2 g_x'(x,y)=\frac{-2xy\cdot sin(x^2y)}{x^2+y^2+1}-\frac{2x\cdot cos(x^2y)}{(x^2+y^2+1)^2} gx(x,y)=x2+y2+12xysin(x2y)(x2+y2+1)22xcos(x2y)

g y ′ ( x , y ) = − x 2 ⋅ s i n ( x 2 y ) x 2 + y 2 + 1 − 2 y ⋅ c o s ( x 2 y ) ( x 2 + y 2 + 1 ) 2 g_y'(x,y)=\frac{-x^2\cdot sin(x^2y)}{x^2+y^2+1}-\frac{2y\cdot cos(x^2y)}{(x^2+y^2+1)^2} gy(x,y)=x2+y2+1x2sin(x2y)(x2+y2+1)22ycos(x2y)


二阶偏导数

求下面函数的二阶偏导数
g ( x , y ) = c o s ( x 2 y ) x 2 + y 2 + 1 g(x,y)=\frac{cos(x^2y)}{x^2+y^2+1} g(x,y)=x2+y2+1cos(x2y)
代码如下:

def secondPartialDerivative_a():
    """ 二阶偏导数 """
    x, y = symbols('x y')
    g = cos(x**2*y)/(x**2+y**2+1)
    dx = diff(g, x, 2)
    dy = diff(g, y, 2)

    print("对x的二阶偏导:", dx)
    print("对y的二阶偏导:", dy)
    return

结果为

对x的二阶偏导: 
2*(4*x**2*y*sin(x**2*y)/(x**2 + y**2 + 1) - 
y*(2*x**2*y*cos(x**2*y) + sin(x**2*y)) + 
(4*x**2/(x**2 + y**2 + 1) - 1)*cos(x**2*y)/(x**2 + y**2 + 1))/(x**2 + y**2 + 1)  
----------------------------------------
对y的二阶偏导: 
(-x**4*cos(x**2*y) + 
4*x**2*y*sin(x**2*y)/(x**2 + y**2 + 1) + 
2*(4*y**2/(x**2 + y**2 + 1) - 1)*cos(x**2*y)/(x**2 + y**2 + 1))/(x**2 + y**2 + 1)

结果太复杂,就不写公式了。

Reference

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流浪猪头拯救地球

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值