python來擬合Langmuir非線性方程

晚亭聽鈴發表於2020-11-24

python來擬合Langmuir非線性方程``

簡介

以前都是用origin來進行擬合,但是引數初值需要猜測,有時候不一定能夠得到正確結果。後來用過MATLAB的工具箱,可以擬合,但電腦要安裝MATLAB還是佔挺大空間的。花了一下午瞭解了一下用Python來擬合已有的函式,感覺還不錯,分享出來給大家。初學Python,大神們多多包涵。

程式碼

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

from scipy.optimize import curve_fit



df1 = pd.read_excel('F:/langmuir.xls',header=None,usecols="A") #匯入資料,A列為x軸備用

df2 = pd.read_excel('F:/langmuir.xls',header=None,usecols="B") #匯入資料,B列為y軸備用

Ce0 = np.array(df1) #dataframe轉陣列,此時為單列陣列,需要轉置為單行

Ce = Ce0[:,0]  #轉置

print(Ce)

qe0 = np.array(df2) #dataframe轉陣列,此時為單列陣列,需要轉置為單行

qe = qe0[:,0] #轉置

print(qe)



# 這裡的函式可以自定義任意形式。

def func(Ce, qm, Ka):

     return qm*Ka*Ce/(1+Ka*Ce)



# popt返回的是給定模型的最優引數。我們可以使用pcov的值檢測擬合的質量,其對角線元素值代表著每個引數的方差。

param_bounds=([0,0],[np.inf,np.inf]) #引數上下限,第一個方括號為所有引數下限,第二個為所有引數上限

popt, pcov = curve_fit(func, Ce, qe, bounds=param_bounds) #擬合函式

qm = popt[0] 

Ka = popt[1]

qe_pre = func(Ce,qm,Ka) #擬合y值

plot1 = plt.plot(Ce, qe, 's',label='original values')

plot2 = plt.plot(Ce, qe_pre, 'r',label='polyfit values')

plt.xlabel('Ce')

plt.ylabel('qe')

plt.legend(loc=4) #右下角畫圖例



SSE = ((qe_pre-qe)**2).sum()



chi_square = ((qe-qe_pre)**2/qe_pre).sum()





#計算R平方

from sklearn.metrics import r2_score

r2 = r2_score(qe, qe_pre)

print('qm=',qm)

print('Ka=',Ka)

print('擬合R方為:',r2)

print('SSE =',SSE)

print('chi_square =',chi_square)

本文首發嗶哩嗶哩
https://www.bilibili.com/read/cv8512063

在這裡插入圖片描述
最終執行結果

相關文章