当前位置: 首页 > 科技观察

Python实现的导数

时间:2023-03-12 04:48:32 科技观察

本文转载自微信公众号《python与大数据分析》,作者是一只小鸟。转载本文请联系python与大数据分析公众号。导数(Derivative),也叫微分函数值。也称微商,是微积分中一个重要的基本概念。当函数y=f(x)的自变量x在x0点产生增量Δx时,当Δx趋于0时,函数输出值的增量Δy与自变量Δx的增量Δx之比,如果存在极限a,则a是x0处的导数,表示为f'(x0)或df(x0)/dx。并非所有函数都有导数,函数也不一定在所有点上都有导数。如果一个函数在某一点有导数,则称该函数在该点可微,否则称为不可微。但是,可微函数必须是连续的;一个不连续的函数一定是不可微的。切线是刚好与曲线上的一点相交的直线。更准确地说,当切线通过曲线上的某一点(即切点)时,切线的方向与曲线上该点的方向相同。在平面几何中,与圆只有一个公共交点的直线称为圆的切线。法线是始终垂直于平面的直线。在几何学中,法线是垂直于曲线在一点的切线的平面上的一条线。法线也适用于光学平面镜反射。#!/usr/bin/envpython#-*-coding:UTF-8-*-#_ooOoo_#o8888888o#88"."88#(|-_-|)#O\=/O#____/`---'\____#.'\\||//`.#/\\|||:|||//\#/_|||||-:-|||||-\#||\\-///||#|\_|''\---/''|_/|#\.-\__`-`___/-./#___`..'/--.--\`.__#.""'<`.___\_<|>_/___.'>'"".#||:`-\`.;`\_/`;.`/-`:||#\\`-.\___\/___/.-`//#==`-.____`-.___\_____/___.-`____.-'==#`=---=''''@Project:pythonalgorithms@File:derivatives.py@Author:无敌人生一醉@Date:2021/8/10:17'''importmatplotlib.pyplotaspltimportnumpyasnpimportmathimportsympyimportmpl_toolkits.axisartistasaxisartist#导入坐标轴处理模块if__name__=='__main__':quadraticderivativeplot()exponentialderivativeplot()arccscderivativeplot()#导数(Derivative),也叫微分函数值。也称微商,是微积分中一个重要的基本概念。#当函数y=f(x)的自变量x在x0点产生增量Δx时,函数输出值的增量Δy与自变量Δx的增量Δx之比为极限a时Δx存在则趋于0,a为x0处的导数,记为f'(x0)或df(x0)/dx。#并不是所有的函数都有导数,一个函数也不一定在所有的点上都有导数。#如果一个函数在某一点有导数,则称该函数在该点可微,否则称为不可微。但是,可微函数必须是连续的;一个不连续的函数一定是不可微的。defquadraticderivativeplot():plt.figure(figsize=(5,12))ax=plt.gca()#通过gca获取当前坐标轴:getcurrentaxisplt.rcParams['font.sans-serif']=['SimHei']#画中文plt.rcParams['axes.unicode_minus']=False#画负号x=np.linspace(-2,2,200)y=x**2label='function=curveofx**2'plt.plot(x,y,label=label)yd=2*xlabel='导数线=2*x的曲线'plt.plot(x,yd,label=label)a=1ad=a**2plt.plot(a,ad,'og',label='x=1的某点')#y=ax+b,已知a=2,x=1,y=1,求bb=ad-2*a#准备画切线dataal=np.linspace(-2,2,200)yl=2*al+blabel='x=1'stangent'plt.plot(al,yl,label=label)#准备绘制法线的数据,切线的斜率=法线斜率的负数b=ad+2*aal=np.linspace(-2,2,200)yl=-2*al+blabel='x=1normal'plt.plot(al,yl,label=label)#求导函数x=sympy.Symbol('x')f1=x**2#参数为函数和变量f1_=sympy.diff(f1,x)print(f1_)#设置右边框和图片上边框不显示ax.spines['right'].set_color('none')ax.spines['top'].set_color('none')#移动x轴和y轴的位置,即下边框和左边框图片#data的位置表示通过value设置x轴的位置,x轴绑定到y=0的位置ax.spines['bottom'].set_position(('data',0))#axes表示百分比设置表格中坐标轴的位置,即绑定y轴为x轴的50%#ax.spines['left'].set_position(('axes',0.5))ax.spines['left'].set_position(('data',0))plt.title("二次函数,导数曲线与某点的法线和切线")plt.legend(loc='upperright')plt.show()#指数函数的导数#指数函数y=a**x#Exponential函数导数为y=a**x*ln(a)defexponentialderivativeplot():plt.figure(figsize=(5,12))ax=plt.gca()#通过gca获取当前坐标轴:getcurrentaxisplt.rcParams['font.sans-serif']=['SimHei']#画中文plt.rcParams['axes.unicode_minus']=False#画负号a=2x=np.linspace(-2,2,200)y=np.power(a,x)yd=np.power(a,x)*np.log(a)label='函数=a**x的曲线'plt.plot(x,y,label=label)label='导数线=a**x的曲线'plt.plot(x,yd,label=label)xpoint=1ypoint=np.power(a,xpoint)plt.plot(xpoint,ypoint,'og',label='x=某点1')#slopeslope=导数,求截距interceptslope=math.pow(a,xpoint)*math.log(a,np.e)#y=ax+b,已知a,x,y,seekbinintercept=ypoint-slope*xpoint#准备绘制切线数据yl=x*slope+intercept#print(slope,intercept,yl)label='x=1tangent'plt.plot(x,yl,label=label)#准备绘制法线数据,切线斜率=法线斜率的负数#y=ax+b,已知x,y,-a,求binintercept=ypoint+slope*xpointyl=-x*slope+interceptlabel='x=1'snormal'plt.plot(x,yl,label=label)##求导函数#x=sympy.Symbol('x')#f1=x**2##参数为函数和变量#f1_=sympy.diff(f1,x)#print(f1_)#设置图片右边框和上边框不一样Displayax.spines['right'].set_color('none')ax.spines['top'].set_color('none')#移动x轴和y轴的位置,也就是下边框的位置andleftborderofthepicture#data表示通过值设置x轴的位置,将x轴绑定到y=0的位置ax.spines['bottom'].set_position(('data',0))#axes表示以百分比的形式设置轴的位置,即绑定y轴为x轴的50%#ax.spines['left'].set_position(('axes',0.5))ax.spines['left'].set_position(('data',0))plt.title("指数函数、导数曲线及某点的法线和切线")plt.legend(loc='upperright')plt.show()#常用导数公式表如下:##c'=0(c为常数)#(x^a)'=ax^(a-1),a是常数,a≠0#(a^x)'=a^xlna#(e^x)'=e^x##(logax)'=1/(xlna),a>0且a≠1#(lnx)'=1/x#(sinx)'=cosx#(cosx)'=-sinx#(tanx)'=(secx)^2#(secx)'=secxtanx#(cotx)'=-(cscx)^2#(cscx)'=-csxcotx#(arcsinx)'=1/√(1-x^2)#(arccosx)'=-1/√(1-x^2)#(arctanx)'=1/(1+x^2)#(arccosx)'=-1/(1+x^2)#arcsinx函数#arcsinx函数的导数#arcsinx函数的导数is1/√(1-x^2)defarcscderivativeplot():plt.figure(figsize=(10,5))ax=plt.gca()#通过gca获取currentaxis当前坐标轴plt.rcParams['font.sans-serif']=['SimHei']#画中文plt.rcParams['axes.unicode_minus']=False#画负号x=np.append(np.linspace(0.01,np.pi/2-0.01,120),np.linspace(np.pi/2+0.01,np.pi-0.01,120))y=1/np.cos(x)#正割函数sec(x)=1/cos(x)#反割函数可以将x和y的值取反。label='函数是np.arcsecx(x)的曲线'plt.plot(y,x,label=label)x=np.linspace(-0.99,0.99,120)yd=1/np.sqrt(1-np.power(x,2))label='导数线是np.arcsecx(x)的曲线'plt.plot(x,yd,label=label)#设置图片的右边框和上边框不显示ax.spines['right'].set_color('none')ax.spines['top'].set_color('none')#移动x轴和y轴的位置,即图片的bottomborder和leftborder#data表示x轴的位置由value设置,x轴绑定到y=0的位置ax.spines['bottom'].set_position(('data',0))#axes表示以百分比的形式设置轴的位置,即绑定y轴为x轴的50%#ax.spines['left'].set_position(('axes',0.5))ax.spines['left'].set_position(('data',0))plt.title("arcsin函数,导数曲线")plt.legend(loc='右上')plt.show()