Python擬合曲線

RubyTsui發表於2024-07-29

擬合曲線

多項式擬合

np.ployfit(x, y, deg)

import matplotlib.pyplot as plt
import numpy as np
x = [1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 5.5, 6, 6.5, 7, 7.5, 8]
y = [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]
 
coef = np.polyfit(x, y, 2)	# 返回擬合引數
fn = np.poly1d(coef)	# 利用引數生成多項式函式
 
plt.scatter(x, y)
plt.plot(x, fn(x), color='red')
plt.show()

任意擬合

scipy.optimize.curve_fit

import scipy.optimize as opt
from scipy.optimize import curve_fit

# 已有資料點
x = np.array([1, 2, 3, 4, 5])
y = np.array([1, 4, 9, 16, 25])

# 定義擬合方程(任意)
def func(x1, a, b, c):  
    return a*x1**2 + b*x1 + c
    
p_opt, p_cov = curve_fit(func, x, y)  # p0 = 1是因為只有a一引數
print("方程引數最佳值為:", p_opt.astype(np.int64))  # 引數最佳值,np.round(popt, 4)
print("擬合方程協方差矩陣:\n", p_cov)  # 協方差矩陣,popt[0],popt[1],popt[2]分別代表引數a b c
y_predict = func(x, p_opt[0], p_opt[1], p_opt[2])

plt.scatter(x, y, marker='x', lw=1, label='原始資料')
plt.plot(x, y_predict, c='r', label='擬合曲線')
plt.legend()  # 顯示label
plt.show()

相關文章