python来拟合Langmuir非线性方程
程序员文章站
2022-05-09 08:56:00
...
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
最终运行结果
上一篇: MySQL之触发器
下一篇: Mysql day02_汇总
推荐阅读
-
python用fsolve、leastsq对非线性方程组求解
-
python scipy求解非线性方程的方法(fsolve/root)
-
python进阶TensorFlow神经网络拟合线性及非线性函数
-
数学模型(插值、拟合和微分方程)-python实现
-
python用fsolve、leastsq对非线性方程组求解
-
数值分析:利用牛顿法解非线性方程组的matlab和python实现
-
python scipy求解非线性方程的方法(fsolve/root)
-
python来拟合Langmuir非线性方程
-
python进阶TensorFlow神经网络拟合线性及非线性函数
-
python实现数学模型(插值、拟合和微分方程)