目錄
1. 一元多項(xiàng)式擬合
使用方法?np.polyfit(x, y, deg)
2. 任意函數(shù)擬合
使用 curve_fit() 方法
實(shí)例:
(1)初始化 x 和 y 數(shù)據(jù)集
(2)建立自定義函數(shù)
(3)使用自定義的函數(shù)生成擬合函數(shù)繪圖?
1. 一元多項(xiàng)式擬合
使用方法?np.polyfit(x, y, deg)
polyfig 使用的是最小二乘法,用于擬合一元多項(xiàng)式函數(shù)。
參數(shù)說明: x 就是x坐標(biāo),y 就是y坐標(biāo),deg 為擬合多項(xiàng)式的次數(shù)。
實(shí)例:
根據(jù) ti yi 兩個(gè)列表來得到 一元二次多項(xiàng)式擬合函數(shù) (deg為2)
import matplotlib.pyplot as plt
import numpy as np
import pylab as mpl
ti = [1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 5.5, 6, 6.5, 7, 7.5, 8]
yi = [33.40, 79.50, 122.65, 159.05, 189.15, 214.15, 238.65, 252.2, 267.55, 280.50, 296.65, 301.65, 310.4, 318.15, 325.15]
z1 = np.polyfit(ti, yi, 2)
print(z1)
輸出結(jié)果:
分別是二次多項(xiàng)式的 3 個(gè)系數(shù),y = ax^2 + bx + c
2. 任意函數(shù)擬合
使用 curve_fit() 方法
curve_fit() 使用是非線性最小二乘法將函數(shù)進(jìn)行擬合,適用范圍:多元、任意函數(shù)
scipy.optimize.curve_fit(f,xdata,ydata,p0 = None)
常用參數(shù)說明:
f: 模型函數(shù)f(x,…)。它必須將自變量作為第一個(gè)參數(shù),其余你需要求的參數(shù)都放后面
xdata: 數(shù)組對象,測量數(shù)據(jù)的自變量。
ydata: 數(shù)組對象,因變量。
p0:參數(shù)的初始猜測(長度 N),如果為None,則初始值為1(如果可以使用自省來確定函數(shù)的參數(shù)數(shù)量,否則會引發(fā) ValueError)。
?返回值:
popt: 數(shù)組,參數(shù)的最佳值,以使的平方殘差之和最小。f(xdata, *popt) - ydata
pcov: 二維陣列,popt的估計(jì)協(xié)方差。對角線提供參數(shù)估計(jì)的方差。
實(shí)例:
(1)初始化 x 和 y 數(shù)據(jù)集
x 為 0~19(包括0和19),y=2x^2 + (二十個(gè)0~100范圍內(nèi)的隨機(jī)數(shù))
import numpy as np
x = np.arange(0,20)
y = 2 * x ** 2 + np.random.randint(0, 100, 20)
#z = 2 * x ** 2 + np.random.randint(0, 100, (1,20))[0]
如圖為生成 x 列表和 y 列表的值(具有隨機(jī)性):
?補(bǔ)充一下 np.random.randint()用法:
numpy.random.randint(low, high=None, size=None, dtype=int)
參數(shù)說明:
1. low: int 生成的數(shù)值的最小值(包含),默認(rèn)為0,可省略。
2. high: int 生成的數(shù)值的最大值(不包含)。
3. size: int or tuple of ints 隨機(jī)數(shù)的尺寸, 默認(rèn)是返回單個(gè),輸入 20 返回 20個(gè),輸入 (3,4) 返回的是一個(gè) 3*4 的二維數(shù)組。(可選)。
4. dtype:想要輸出的結(jié)果類型。默認(rèn)值為int。(可選,一般用不上)。
(2)建立自定義函數(shù)
?定義函數(shù)? y=ax^2
#變量一定要放在第一個(gè)位置
def func(x, a):
return a*x**2
popt, pcov = curve_fit(func, x, y, p0=1) #p0 = 1是因?yàn)橹挥衋一參數(shù)
print(popt) #即參數(shù)a的最佳值
print(pcov)
輸出結(jié)果:
?定義函數(shù) y=2x^2+bx+c
#變量一定要放在第一個(gè)位置
def func(x, a, b, c):
return a*x**2 + b*x + c
popt, pcov = curve_fit(func, x, y) #p0 = 1是因?yàn)橹挥衋一參數(shù)
print(popt) #即參數(shù)a的最佳值
print(pcov)
輸出結(jié)果:
(3)使用自定義的函數(shù)生成擬合函數(shù)繪圖?
對第二個(gè)擬合函數(shù)繪圖:
完整代碼:
注意:在畫圖是可能會出現(xiàn)坐標(biāo)中文亂碼的問題,需要加入以下幾行:
import pylab as mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']? # 解決中文不顯示問題 plt.rcParams['axes.unicode_minus']=False? #解決負(fù)數(shù)坐標(biāo)顯示問題
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
import pylab as mpl
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 解決中文不顯示問題
plt.rcParams['axes.unicode_minus']=False #解決負(fù)數(shù)坐標(biāo)顯示問題
x = np.arange(0,20)
y = 2 * x ** 2 + np.random.randint(0, 100, 20)
z = 2 * x ** 2 + np.random.randint(0, 100, (1,20))[0]
print(x)
print(y)
#變量一定要放在第一個(gè)位置
def func(x, a, b, c):
return a*x**2 + b*x + c
popt, pcov = curve_fit(func, x, y) #p0 = 1是因?yàn)橹挥衋一參數(shù)
print(popt) #即參數(shù)a的最佳值
print(pcov)
#popt[0],popt[1],popt[2]分別代表參數(shù)a b c
y2 = func(x,popt[0],popt[1],popt[2])
plt.scatter(x, y, marker='x',lw=1,label='原始數(shù)據(jù)')
plt.plot(x,y2,c='r',label='擬合曲線')
plt.legend() # 顯示label
plt.show()
運(yùn)行結(jié)果:
?
?使用指數(shù)函數(shù):
y = ae^(bx)
繪圖效果:文章來源:http://www.zghlxwxcb.cn/news/detail-786770.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-786770.html
到了這里,關(guān)于Python做曲線擬合(一元多項(xiàng)式擬合及任意函數(shù)擬合)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!