欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

python来拟合Langmuir非线性方程
最终运行结果