Python对分段函数求导+绘制位移s-t、速度v-t、加速度a-t曲线

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

from sympy.utilities.lambdify import lambdify
#-----------------------------连续数值离散化-便于绘图------------------------------------
def Curve_values(piecewise_function):

    derivative_func = lambdify(x, piecewise_function, 'numpy')
    # 创建x值向量并计算导数值
    derivative_values = derivative_func(x_values)
 
    return derivative_values

###########################绘制、美化坐标轴函数(start)################################################
'''
index:要绘制在第几行第几列,
由于在前面定义的是plt.subplots(3, 1)
也就是说只有一列,所以是axes[index],
表示在该单列的第几行画这个图。

如果在前面定义的是plt.subplots(3,2)
那么就会是axes[index_x][index_y]
表示在第几行第几列画这个图。


func:要绘制的函数名称
Curve_name:曲线名称
x_name:x轴名称
y_name:y轴名称
'''
def axes_draw(index,func,Curve_name,x_name,y_name):
    axes[index].plot(x_values, Curve_values(func), 'r', label = Curve_name)
    axes[index].set_xlabel(x_name)
    axes[index].set_ylabel(y_name)
    axes[index].legend()
    axes[index].grid(True)


def beautify_axes(index):
    axes[index].spines['right'].set_color('none')   # 将图像右边的轴设为透明
    axes[index].spines['top'].set_color('none')     # 将图像上面的轴设为透明
    axes[index].xaxis.set_ticks_position('bottom')    # 将x轴刻度设在下面的坐标轴上
    axes[index].yaxis.set_ticks_position('left')         # 将y轴刻度设在左边的坐标轴上
    axes[index].spines['bottom'].set_position(('data', 0))   # 将两个坐标轴的位置设在数据点原点
    axes[index].spines['left'].set_position(('data', 0))

################################绘制、美化坐标轴函数(end)###########################################

if __name__ == '__main__':
    #-----------------------------分段函数S-t、V-t、a-t(Start)定义------------------------------------
    x = sp.symbols('x')
    s_t = sp.Piecewise((0.25*x,          sp.And(x>=0,x<20)),
                         (5,             sp.And(x>=20,x<50)),
                        (-1.0/3.0*(x-65),sp.And(x>50,x<=65)))
    #位移曲线
    
    v_t = sp.diff(s_t, x)#速度曲线    
    a_t = sp.diff(v_t, x)#加速度曲线    
    
    #-----------------------------分段函数S-t、V-t、a-t(End)------------------------------------
    
    #-----------------------------x轴定义域----------------------------
    left=0
    right=70
    x_values = np.linspace(left, right, 1000)#这个1000个曲线上的点,并不是刻度上的点
    #----------------------------------------------------------------------

    fig, axes = plt.subplots(3, 1, figsize = (8, 7))#两行两列总共4个图
    
    #############################绘制s-t##############################################
    index=0
    Curve_name='s-t Curve'
    x_name='Time(min)'
    y_name='Displacement(km)'
    axes_draw(index,s_t,Curve_name,x_name,y_name)
    beautify_axes(index)
    
    ################################绘制v-t###########################################
    index=1
    Curve_name='v-t Curve'
    x_name='Time(min)'
    y_name='Velocity(km/min)'
    axes_draw(index,v_t,Curve_name,x_name,y_name)
    beautify_axes(index)
    ################################绘制a-t###########################################
    index=2
    Curve_name='a-t Curve'
    x_name='Time(min)'
    y_name='Acceleration(km/min2)'
    axes_draw(index,v_t,Curve_name,x_name,y_name)
    beautify_axes(index)
    
    # plt.grid(True)
    plt.show()

运行结果如下: