Python實現之初等函數一
作者:一只小小鳥鳥
初等函數是由基本初等函數經過有限次的四則運算和復合運算所得到的函數。基本初等函數和初等函數在其定義區間內均為連續函數。高等數學將基本初等函數歸為五類:冪函數、指數函數、對數函數、三角函數、反三角函數。
本文轉載自微信公眾號「python與大數據分析」,作者一只小小鳥鳥。轉載本文請聯系python與大數據分析公眾號。
初等函數是由基本初等函數經過有限次的四則運算和復合運算所得到的函數。基本初等函數和初等函數在其定義區間內均為連續函數。高等數學將基本初等函數歸為五類:冪函數、指數函數、對數函數、三角函數、反三角函數。
比較頭疼的是numpy中的冪函數不支持負數定義域,所以找了很多辦法來解決該問題。
主函數代碼如下:
- #!/usr/bin/env python
- # -*- coding: UTF-8 -*-
- # _ooOoo_
- # o8888888o
- # 88" . "88
- # ( | - _ - | )
- # O\ = /O
- # ____/`---'\____
- # .' \\| |// `.
- # / \\|||:|||// \
- # / _|||||-:- |||||- \
- # | | \\\ - /// | |
- # | \_| ''\---/'' | _/ |
- # \ .-\__ `-` ___/-. /
- # ___`. .' /--.--\ `. . __
- # ."" '< `.___\_<|>_/___.' >'"".
- # | | : `- \`.;`\ _ /`;.`/ - ` : | |
- # \ \ `-. \_ __\ /__ _/ .-` / /
- # ==`-.____`-.___\_____/___.-`____.-'==
- # `=---='
- '''
- @Project :pythonalgorithms
- @File :basicfunction.py
- @Author :不勝人生一場醉
- @Date :2021/7/19 17:39
- '''
- import matplotlib.pyplot as plt
- import numpy as np
- import math
- import mpl_toolkits.axisartist as axisartist # 導入坐標軸加工模塊
- # -----------------函數------------------
- # 給定一個數集A,對A施加一個對應的法則/映射f,記做:f(A),那么可以得到另外一個數集B,也就是可以認為B=f(A);
- # 那么這個關系就叫做函數關系式,簡稱函數。
- # 三個重要的因素: 定義域A、值域B、對應的映射法則f。
- if __name__ == "__main__":
- # 一次函數
- Linearfunction()
- # 二次函數
- Quadraticfunction()
- # 冪函數
- powerfunction()
- # 指數函數
- exponentialfunction()
- # 對數函數
- Logarithmicfunction()
一次函數代碼如下:
- # ---------------一次函數------------------
- # 一次函數是函數中的一種,一般形如y=ax+b(a,b是常數,a≠0),其中x是自變量,y是因變量。
- # 當b=0時,y=kx(k為常數,k≠0),y叫做x的正比例函數
- # 當a=0時,y=b,則為常函數
- def Linearfunction():
- fig = plt.figure(figsize=(10, 8))
- plt.rcParams['font.sans-serif'] = ['SimHei'] # 繪圖中文
- plt.rcParams['axes.unicode_minus'] = False # 繪圖負號
- x = np.linspace(-10, 10, 100)
- i = 1
- alist = [-1, 0, 1]
- blist = [-1, 0, 1]
- for a in alist:
- for b in blist:
- plt.subplot(3, 3, i)
- y = x * a + b
- label = '{}*x+{}'.format(a, b)
- plt.plot(x, y, label=label)
- plt.legend()
- i += 1
- plt.show()
- for a in alist:
- for b in blist:
- y = x * a + b
- label = '{}*x+{}'.format(a, b)
- plt.plot(x, y, label=label)
- i += 1
- plt.title("一次函數")
- plt.legend()
- plt.show()
二次函數代碼如下:
- # 二次函數(quadratic function)的基本表示形式為y=ax²+bx+c(a≠0)。
- # 二次函數最高次必須為二次, 二次函數的圖像是一條對稱軸與y軸平行或重合于y軸的拋物線。
- # 其中a稱為二次項系數,b為一次項系數,c為常數項。x為自變量,y為因變量。等號右邊自變量的最高次數是2。
- # 如果令y值等于零,則可得一個二次方程。該方程的解稱為方程的根或函數的零點。
- # 頂點坐標 = (-b/2a,(4ac-b²)/4a
- def Quadraticfunction():
- fig = plt.figure(figsize=(10, 8))
- plt.rcParams['font.sans-serif'] = ['SimHei'] # 繪圖中文
- plt.rcParams['axes.unicode_minus'] = False # 繪圖負號
- x = np.linspace(-2, 2, 100)
- alist = [-1, 1]
- blist = [-1, 0, 1]
- clist = [-1, 0, 1]
- for a in alist:
- for b in blist:
- for c in clist:
- y = a * x * x + b * x + c
- label = '{}*x*x+{}*x+{}'.format(a, b, c)
- plt.plot(x, y, label=label)
- plt.title("二次函數")
- plt.legend()
- plt.show()
冪函數代碼如下:
- # 冪函數是基本初等函數之一。
- # 一般地,y=xα(α為有理數)的函數,即以底數為自變量,冪為因變量,指數為常數的函數稱為冪函數。
- # 例如函數y=x0 、y=x、y=x²、y=x³。
- # a = 正數
- # a 為>0 的自然數 x定義域(-∞,∞)
- # a 為<0 的整數 X定義域(-∞,0),(0,∞)
- #
- # a >0 的分數
- # a=n/m m為奇數,n為偶數,x定義域(-∞,∞),y定義域[0,+∞)
- # a=n/m m為奇數,n為奇數,x定義域(-∞,∞),y定義域(-∞,∞)
- # a=n/m m為偶數,n不限,x定義域[0,∞),y定義域[0,+∞)
- #
- # a <0 的分數
- # a=n/m m為奇數,n為偶數,x定義域(-∞,0),(0,∞),y定義域(0,+∞)
- # a=n/m m為奇數,n為奇數,x定義域(-∞,0),(0,∞),y定義域(-∞,0),(0,∞)
- # a=n/m m為偶數,n不限,x定義域(0,∞),y定義域(0,+∞)
- def powerfunction():
- plt.figure(figsize=(10, 8))
- ax = plt.gca() # 通過gca:get current axis得到當前軸
- plt.rcParams['font.sans-serif'] = ['SimHei'] # 繪圖中文
- plt.rcParams['axes.unicode_minus'] = False # 繪圖負號
- x = np.linspace(-2, 2, 100)
- alist = [1, 2, 3, 4]
- for a in alist:
- y = np.power(x, a)
- label = 'math.pow(x,{}'.format(a)
- plt.plot(x, y, label=label)
- # 設置圖片的右邊框和上邊框為不顯示
- ax.spines['right'].set_color('none')
- ax.spines['top'].set_color('none')
- # 挪動x,y軸的位置,也就是圖片下邊框和左邊框的位置
- # 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("冪指數,a為正整數")
- plt.legend()
- plt.show()
- plt.figure(figsize=(10, 8))
- ax = plt.gca() # 通過gca:get current axis得到當前軸
- plt.rcParams['font.sans-serif'] = ['SimHei'] # 繪圖中文
- plt.rcParams['axes.unicode_minus'] = False # 繪圖負號
- x = np.append(np.linspace(-1, -0.01, 100), np.linspace(0.01, 1, 100))
- alist = [-1, -2, -3]
- for a in alist:
- y = np.power(x, a)
- label = 'math.pow(x,{}'.format(a)
- plt.plot(x, y, label=label)
- # 設置圖片的右邊框和上邊框為不顯示
- ax.spines['right'].set_color('none')
- ax.spines['top'].set_color('none')
- # 挪動x,y軸的位置,也就是圖片下邊框和左邊框的位置
- # 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("冪指數,a為負整數")
- plt.legend()
- plt.show()
- # a >0 的分數
- # a=n/m m為奇數,n為奇數,x定義域(-∞,∞),y定義域(-∞,∞) 4/3
- # a=n/m m為奇數,n為偶數,x定義域[0,+∞),y定義域[0,+∞)4/3
- # a=n/m m為偶數,n不限,x定義域(-∞,∞),y定義域[0,+∞) 1/2,3/2
- plt.figure(figsize=(10, 8))
- ax = plt.gca() # 通過gca:get current axis得到當前軸
- plt.rcParams['font.sans-serif'] = ['SimHei'] # 繪圖中文
- plt.rcParams['axes.unicode_minus'] = False # 繪圖負號
- x = np.linspace(-2, 2, 100)
- alist = [1 / 3, 5 / 3, 7 / 3]
- for a in alist:
- # y = np.power(x, a)
- # RuntimeWarning: invalid value encountered in power
- y = np.float_power(abs(x), a) * np.sign(x)
- label = 'math.pow(x,{}'.format(a)
- plt.plot(x, y, label=label)
- # 設置圖片的右邊框和上邊框為不顯示
- ax.spines['right'].set_color('none')
- ax.spines['top'].set_color('none')
- # 挪動x,y軸的位置,也就是圖片下邊框和左邊框的位置
- # 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()
- plt.show()
- plt.figure(figsize=(10, 8))
- ax = plt.gca() # 通過gca:get current axis得到當前軸
- plt.rcParams['font.sans-serif'] = ['SimHei'] # 繪圖中文
- plt.rcParams['axes.unicode_minus'] = False # 繪圖負號
- x = np.linspace(0, 2, 100)
- alist = [1 / 8, 1 / 4, 1 / 2]
- for a in alist:
- y = np.power(x, a)
- # y = np.float_power(abs(x), a) * np.sign(x)
- label = 'math.pow(x,{}'.format(a)
- plt.plot(x, y, label=label)
- # 設置圖片的右邊框和上邊框為不顯示
- ax.spines['right'].set_color('none')
- ax.spines['top'].set_color('none')
- # 挪動x,y軸的位置,也就是圖片下邊框和左邊框的位置
- # 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()
- plt.show()
- plt.figure(figsize=(10, 8))
- ax = plt.gca() # 通過gca:get current axis得到當前軸
- plt.rcParams['font.sans-serif'] = ['SimHei'] # 繪圖中文
- plt.rcParams['axes.unicode_minus'] = False # 繪圖負號
- x = np.linspace(-2, 2, 100)
- alist = [2 / 3, 4 / 5, 6 / 7, 4 / 3, 8 / 5]
- for a in alist:
- y = np.power(abs(x), a)
- label = 'math.pow(x,{}'.format(a)
- plt.plot(x, y, label=label)
- # 設置圖片的右邊框和上邊框為不顯示
- ax.spines['right'].set_color('none')
- ax.spines['top'].set_color('none')
- # 挪動x,y軸的位置,也就是圖片下邊框和左邊框的位置
- # 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()
- plt.show()
- # 關于負數就不再重復敘述了
- # a <0 的分數
- # a=n/m m為奇數,x定義域(-∞,0),(0,∞),y定義域(0,+∞)
- # a=n/m m為偶數,x定義域(-∞,0),(0,∞),y定義域(-∞,0),(0,∞)
- # a=n/m m為偶數,n為不限,x定義域(0,∞),y定義域(0,+∞)
指數函數代碼如下:
- # 指數函數是重要的基本初等函數之一。
- # 一般地,y=ax函數(a為常數且以a>0,a≠1)叫做指數函數,函數的定義域是 R 。 [1]
- # 注意,在指數函數的定義表達式中,在ax前的系數必須是數1,自變量x必須在指數的位置上,且不能是x的其他表達式,
- # 否則,就不是指數函數
- def exponentialfunction():
- plt.figure(figsize=(10, 8))
- ax = plt.gca() # 通過gca:get current axis得到當前軸
- plt.rcParams['font.sans-serif'] = ['SimHei'] # 繪圖中文
- plt.rcParams['axes.unicode_minus'] = False # 繪圖負號
- # a>0 a!=1
- # 定義域為((-∞,∞),值域為(0, +∞),都通過(0, 1)點
- x = np.linspace(-2, 2, 100)
- alist = [1 / 4, 1 / 3, 1 / 2, 2, 3, 4]
- for a in alist:
- y = np.power(a, x)
- label = 'math.pow(x,{}'.format(a)
- plt.plot(x, y, label=label)
- # 設置圖片的右邊框和上邊框為不顯示
- ax.spines['right'].set_color('none')
- ax.spines['top'].set_color('none')
- # 挪動x,y軸的位置,也就是圖片下邊框和左邊框的位置
- # 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()
- plt.show()
對數函數代碼如下:
- # 一般地,對數函數是以冪(真數)為自變量,指數為因變量,底數為常量的函數。
- # 對數函數是6類基本初等函數之一。其中對數的定義:
- # 如果ax =N(a>0,且a≠1),那么數x叫做以a為底N的對數,記作x=logaN,讀作以a為底N的對數,其中a叫做對數的底數,N叫做真數。
- # 一般地,函數y=logaX(a>0,且a≠1)叫做對數函數,也就是說以冪(真數)為自變量,指數為因變量,底數為常量的函數,叫對數函數。
- # 其中x是自變量,函數的定義域是(0,+∞),即x>0。它實際上就是指數函數的反函數,可表示為x=ay。因此指數函數里對于a的規定,同樣適用于對數函數。
- def Logarithmicfunction():
- plt.figure(figsize=(10, 8))
- ax = plt.gca() # 通過gca:get current axis得到當前軸
- plt.rcParams['font.sans-serif'] = ['SimHei'] # 繪圖中文
- plt.rcParams['axes.unicode_minus'] = False # 繪圖負號
- # a>0 a!=1
- # 定義域為((-∞,∞),值域為(0, +∞),都通過(0, 1)點
- # 當a>1時,單調遞增
- # 當0<a<1時,單調遞減
- x = np.linspace(0.0001, 2, 100)
- alist = [1 / 4, 1 / 3, 1 / 2, 2, 3, 4]
- for a in alist:
- y = np.log(x) / np.log(a)
- label = 'np.log(x) / np.log({})'.format(a)
- plt.plot(x, y, label=label)
- # 設置圖片的右邊框和上邊框為不顯示
- ax.spines['right'].set_color('none')
- ax.spines['top'].set_color('none')
- # 挪動x,y軸的位置,也就是圖片下邊框和左邊框的位置
- # 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()
- plt.show()
責任編輯:武曉燕
來源:
python與大數據分析