Python實現(xiàn)之導數(shù)
本文轉(zhuǎn)載自微信公眾號「python與大數(shù)據(jù)分析」,作者一只小小鳥鳥 。轉(zhuǎn)載本文請聯(lián)系python與大數(shù)據(jù)分析公眾號。
導數(shù)(Derivative),也叫導函數(shù)值。又名微商,是微積分中的重要基礎(chǔ)概念。當函數(shù)y=f(x)的自變量x在一點x0上產(chǎn)生一個增量Δx時,函數(shù)輸出值的增量Δy與自變量增量Δx的比值在Δx趨于0時的極限a如果存在,a即為在x0處的導數(shù),記作f'(x0)或df(x0)/dx。
不是所有的函數(shù)都有導數(shù),一個函數(shù)也不一定在所有的點上都有導數(shù)。若某函數(shù)在某一點導數(shù)存在,則稱其在這一點可導,否則稱為不可導。然而,可導的函數(shù)一定連續(xù);不連續(xù)的函數(shù)一定不可導。
切線指的是一條剛好觸碰到曲線上某一點的直線。更準確地說,當切線經(jīng)過曲線上的某點(即切點)時,切線的方向與曲線上該點的方向是相同的。平面幾何中,將和圓只有一個公共交點的直線叫做圓的切線。
法線(normal line),是指始終垂直于某平面的直線。在幾何學中,法線指平面上垂直于曲線在某點的切線的一條線。法線也應(yīng)用于光學的平面鏡反射上。
- #!/usr/bin/env python
- # -*- coding: UTF-8 -*-
- # _ooOoo_
- # o8888888o
- # 88" . "88
- # ( | - _ - | )
- # O\ = /O
- # ____/`---'\____
- # .' \\| |// `.
- # / \\|||:|||// \
- # / _|||||-:- |||||- \
- # | | \\\ - /// | |
- # | \_| ''\---/'' | _/ |
- # \ .-\__ `-` ___/-. /
- # ___`. .' /--.--\ `. . __
- # ."" '< `.___\_<|>_/___.' >'"".
- # | | : `- \`.;`\ _ /`;.`/ - ` : | |
- # \ \ `-. \_ __\ /__ _/ .-` / /
- # ==`-.____`-.___\_____/___.-`____.-'==
- # `=---='
- '''
- @Project :pythonalgorithms
- @File :derivatives.py
- @Author :不勝人生一場醉@Date :2021/8/1 0:17
- '''
- import matplotlib.pyplot as plt
- import numpy as np
- import math
- import sympy
- import mpl_toolkits.axisartist as axisartist # 導入坐標軸加工模塊
- if __name__ == '__main__':
- quadraticderivativeplot()
- exponentialderivativeplot()
- arccscderivativeplot()
- # 導數(shù)(Derivative),也叫導函數(shù)值。又名微商,是微積分中的重要基礎(chǔ)概念。
- # 當函數(shù)y=f(x)的自變量x在一點x0上產(chǎn)生一個增量Δx時,函數(shù)輸出值的增量Δy與自變量增量Δx的比值在Δx趨于0時的極限a如果存在,a即為在x0處的導數(shù),記作f'(x0)或df(x0)/dx。
- # 不是所有的函數(shù)都有導數(shù),一個函數(shù)也不一定在所有的點上都有導數(shù)。
- # 若某函數(shù)在某一點導數(shù)存在,則稱其在這一點可導,否則稱為不可導。然而,可導的函數(shù)一定連續(xù);不連續(xù)的函數(shù)一定不可導。
- def quadraticderivativeplot():
- plt.figure(figsize=(5, 12))
- ax = plt.gca() # 通過gca:get current axis得到當前軸
- plt.rcParams['font.sans-serif'] = ['SimHei'] # 繪圖中文
- plt.rcParams['axes.unicode_minus'] = False # 繪圖負號
- x = np.linspace(-2, 2, 200)
- y = x ** 2
- label = '函數(shù)=x**2的曲線'
- plt.plot(x, y, label=label)
- yd = 2 * x
- label = '導數(shù)線=2*x的曲線'
- plt.plot(x, yd, label=label)
- a = 1
- ad = a ** 2
- plt.plot(a, ad, 'og', label='x=1的某個點')
- # y=ax+b,已知a=2,x=1,y=1,求b
- b = ad - 2 * a
- # 準備畫切線的數(shù)據(jù)
- al = np.linspace(-2, 2, 200)
- yl = 2 * al + b
- label = 'x=1的切線'
- plt.plot(al, yl, label=label)
- # 準備畫法線的數(shù)據(jù),切線斜率=法線斜率的負數(shù)
- b = ad + 2 * a
- al = np.linspace(-2, 2, 200)
- yl = -2 * al + b
- label = 'x=1的法線'
- plt.plot(al, yl, label=label)
- # 求導函數(shù)
- x = sympy.Symbol('x')
- f1 = x ** 2
- # 參數(shù)是函數(shù)與變量
- f1_ = sympy.diff(f1, x)
- print(f1_)
- # 設(shè)置圖片的右邊框和上邊框為不顯示
- ax.spines['right'].set_color('none')
- ax.spines['top'].set_color('none')
- # 挪動x,y軸的位置,也就是圖片下邊框和左邊框的位置
- # data表示通過值來設(shè)置x軸的位置,將x軸綁定在y=0的位置
- ax.spines['bottom'].set_position(('data', 0))
- # axes表示以百分比的形式設(shè)置軸的位置,即將y軸綁定在x軸50%的位置
- # ax.spines['left'].set_position(('axes', 0.5))
- ax.spines['left'].set_position(('data', 0))
- plt.title("二次函數(shù)、導數(shù)曲線及某點的法線、切線")
- plt.legend(loc='upper right')
- plt.show()
- # 指數(shù)函數(shù)的導數(shù)
- # 指數(shù)函數(shù) y=a**x
- # 指數(shù)函數(shù)的導數(shù)為 y=a**x*ln(a)
- def exponentialderivativeplot():
- plt.figure(figsize=(5, 12))
- ax = plt.gca() # 通過gca:get current axis得到當前軸
- plt.rcParams['font.sans-serif'] = ['SimHei'] # 繪圖中文
- plt.rcParams['axes.unicode_minus'] = False # 繪圖負號
- a = 2
- x = np.linspace(-2, 2, 200)
- y = np.power(a, x)
- yd = np.power(a, x) * np.log(a)
- label = '函數(shù)=a**x的曲線'
- plt.plot(x, y, label=label)
- label = '導數(shù)線=a**x的曲線'
- plt.plot(x, yd, label=label)
- xpoint = 1
- ypoint = np.power(a, xpoint)
- plt.plot(xpoint, ypoint, 'og', label='x=1的某個點')
- # 斜率slope=導數(shù),求截距intercept
- slope = math.pow(a, xpoint) * math.log(a, np.e)
- # y=ax+b,已知a,x,y,求b
- intercept = ypoint - slope * xpoint
- # 準備畫切線的數(shù)據(jù)
- yl = x * slope + intercept
- # print(slope,intercept,yl)
- label = 'x=1的切線'
- plt.plot(x, yl, label=label)
- # 準備畫法線的數(shù)據(jù),切線斜率=法線斜率的負數(shù)
- # y=ax+b,已知x,y,-a,求b
- intercept = ypoint + slope * xpoint
- yl = -x * slope + intercept
- label = 'x=1的法線'
- plt.plot(x, yl, label=label)
- # # 求導函數(shù)
- # x = sympy.Symbol('x')
- # f1 = x**2
- # # 參數(shù)是函數(shù)與變量
- # f1_ = sympy.diff(f1, x)
- # print(f1_)
- # 設(shè)置圖片的右邊框和上邊框為不顯示
- ax.spines['right'].set_color('none')
- ax.spines['top'].set_color('none')
- # 挪動x,y軸的位置,也就是圖片下邊框和左邊框的位置
- # data表示通過值來設(shè)置x軸的位置,將x軸綁定在y=0的位置
- ax.spines['bottom'].set_position(('data', 0))
- # axes表示以百分比的形式設(shè)置軸的位置,即將y軸綁定在x軸50%的位置
- # ax.spines['left'].set_position(('axes', 0.5))
- ax.spines['left'].set_position(('data', 0))
- plt.title("指數(shù)函數(shù)、導數(shù)曲線及某點的法線、切線")
- plt.legend(loc='upper right')
- plt.show()
- # 常用導數(shù)公式表如下:#
- # c'=0(c為常數(shù))
- # (x^a)'=ax^(a-1),a為常數(shù)且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)
- # (arccotx)'=-1/(1+x^2)
- # arcsinx函數(shù)的導數(shù)
- # arcsinx函數(shù)
- # arcsinx函數(shù)的導數(shù)為 1/√(1-x^2)
- def arccscderivativeplot():
- plt.figure(figsize=(10, 5))
- ax = plt.gca() # 通過gca:get current axis得到當前軸
- 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)
- # 正割函數(shù) sec(x)=1/cos(x)
- # 反正割函數(shù) 顛倒x,y值即可
- label = '函數(shù)為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 = '導數(shù)線為np.arcsecx(x)的曲線'
- plt.plot(x, yd, label=label)
- # 設(shè)置圖片的右邊框和上邊框為不顯示
- ax.spines['right'].set_color('none')
- ax.spines['top'].set_color('none')
- # 挪動x,y軸的位置,也就是圖片下邊框和左邊框的位置
- # data表示通過值來設(shè)置x軸的位置,將x軸綁定在y=0的位置
- ax.spines['bottom'].set_position(('data', 0))
- # axes表示以百分比的形式設(shè)置軸的位置,即將y軸綁定在x軸50%的位置
- # ax.spines['left'].set_position(('axes', 0.5))
- ax.spines['left'].set_position(('data', 0))
- plt.title("arcsin函數(shù)、導數(shù)曲線")
- plt.legend(loc='upper right')
- plt.show()