curve_fit如何确定模型函数变量与自变量、拟合参数的对应关系?
关于scipy.optimize.curve_fit参数对应关系的问题
完整Python脚本
#!/usr/bin/python # coding=utf-8 import sys import numpy as np from scipy.optimize import curve_fit import matplotlib.pyplot as plt def read_data(filename): data = np.loadtxt(filename) return data[:,1], data[:,2] def eos_murnaghan(vol, E0, B0, BP, V0): return E0 + B0*vol/BP*(((V0/vol)**BP)/(BP-1)+1) - V0*B0/(BP-1) def fit_murnaghan(volume, energy): # guess parameters with quadratic function p_coefs = np.polyfit(volume, energy, 2) p_min = - p_coefs[1]/(2.*p_coefs[0]) # warn if min volume not in result range if (p_min < volume.min() or p_min > volume.max()): print "Warning: minimum volume not in range of results" # estimate E0 E0 = np.polyval(p_coefs, p_min) # estimate B0 B0 = 2.*p_coefs[2]*p_min # initial guesses of parameters init_par = [E0, B0, 4, p_min] print "guess parameters:" print " V0 = {:1.4f} A^3 ".format(init_par[3]) print " E0 = {:1.4f} eV ".format(init_par[0]) print " B(V0) = {:1.4f} eV/A^3".format(init_par[1]) print " B'(VO) = {:1.4f} ".format(init_par[2]) best_par, cov_matrix = curve_fit(eos_murnaghan, volume, energy, p0 = init_par) return best_par def fit_and_plot(filename): # read data volume, energy = read_data(filename) # fit parameters with Murnaghan best_par = fit_murnaghan(volume, energy) print "Fit parameters:" print " V0 = {:1.4f} A^3 ".format(best_par[3]) print " E0 = {:1.4f} eV ".format(best_par[0]) print " B(V0) = {:1.4f} eV/A^3".format(best_par[1]) print " B'(VO) = {:1.4f} ".format(best_par[2]) # fit Murnaghan model m_volume = np.linspace(volume.min(), volume.max(), 1000) m_energy = eos_murnaghan(m_volume, *best_par) # draw E-V lines = plt.plot(volume, energy, 'ok', m_volume, m_energy, '--r' ) plt.xlabel(r"Volume [$rm{A}^3$]") plt.ylabel(r"Energy [$rm{eV}$]") return best_par, lines fit_and_plot("SUMMARY.dat") plt.draw() plt.show()
关键语句
best_par, cov_matrix = curve_fit(eos_murnaghan, volume, energy, p0 = init_par)
问题
curve_fit如何确定init_par、volume(xdata)、energy(ydata)分别对应eos_murnaghan函数中的哪些变量?
回答
volume(xdata)的对应关系:curve_fit会直接把volume传给拟合函数eos_murnaghan的第一个参数,也就是函数定义里的vol变量——这是curve_fit的默认规则:xdata始终对应拟合函数的首个输入参数。energy(ydata)的作用:它不会被传给eos_murnaghan,而是作为拟合的目标参考数据。curve_fit会计算eos_murnaghan(volume, *参数)的输出和energy之间的误差,通过调整参数来最小化这个误差。init_par的对应关系:init_par里的元素会按顺序填充到eos_murnaghan中除第一个参数(vol)之外的所有位置:init_par[0]对应E0init_par[1]对应B0init_par[2]对应BPinit_par[3]对应V0
脚本后面调用eos_murnaghan(m_volume, *best_par)时,用*解包best_par的方式也能验证这一点——拟合得到的参数顺序和初始猜测的顺序完全一致,对应函数的后续参数。
内容的提问来源于stack exchange,提问作者蕭力諶
相关产品推荐
相关产品推荐

