本文讲述如何求出一个函数的临界点,以及可导函数与其切线的关系,使用python的sympy、numpy和绘图工具包matplotlib,编码环境为Jupyter notebook。

导入必要的工具包:

import sympy as smp import numpy as np import matplotlib.pyplot as plt

定义符号函数:

x = smp.symbols('x')

例1: 求f(x) = x cos(x) 的一阶导数、二阶导数和临界点

def f(x): return x smp.cos(x)

smp.diff(f(x),x) (计算结果) 1-sin(x) smp.diff(f(x),x,2) (计算结果) -cos(x)

eq = smp.Eq(smp.diff(f(x),x),0) smp.solve(eq) (计算结果) [pi/2]

注:如果在临界点的计算表达式之前,加上命令语句:smp.init_printing() , 则计算结果显示为 [π/2]。

绘制例 1 的函数 f(x) = x cos(x) 的图形

def f(x): return x np.cos(x) x = np.linspace(0, 3,1000) plt.plot(x, f(x)) plt.plot(np.pi/2, f(np.pi/2),'o')

绘图结果如下图1:

python怎么定义微分方程(Python微积分导数4)(1)

图1中黄色圆点为 x = π/2

结合函数的凹凸性和切线关系,求函数 f(x) = x^2 的导数

绘制函数f(x)的图形(如图2),代码如下:

def f(x): return x**2 def df(x): return 2*x a_0 = 1 x = np.linspace(0,2,1000) plt.plot(x,f(x))

python怎么定义微分方程(Python微积分导数4)(2)

函数的凹凸性和切线关系结合在一起,也可以求出函数f(x) = x^2 的导数数,方法步骤如下:

  1. 确定起始点;
  2. 在该点上求出该函数的切线;
  3. 沿着这条切线变化的方向,向前或向后做稍微移动,再取一点,然后在新取得这一点上,再求出一条该函数的切线;
  4. 重复第(3)步。

上述方法,可以写成以下代码来实现:

y_val = [1] x_val = [1] step_size = 0.05 epsilon = 0.01 for step in range(20): # 200 a_next = y_val[-1] - (df(x_val[-1]))*step_size y_val.append(a_next) x_val.append(x_val[-1] - step_size) if y_val[-2] - y_val[-1] < epsilon: print(step, x_val[-1]) break #(运算结果如下) 18 0.049999999999999684

上述运算结果中,最后一个切点,即y_val[-1]的值是:−0.0449999999999993

在f(x)的图形上画出上述运算结果(即x_val和y_val对应的点,如图3),代码如下:

plt.plot(x,f(x)) plt.plot(x_val, y_approxs,'o')

python怎么定义微分方程(Python微积分导数4)(3)

图3中的黄色圆点共有20个。

,