You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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]对应E0
    • init_par[1]对应B0
    • init_par[2]对应BP
    • init_par[3]对应V0
      脚本后面调用eos_murnaghan(m_volume, *best_par)时,用*解包best_par的方式也能验证这一点——拟合得到的参数顺序和初始猜测的顺序完全一致,对应函数的后续参数。

内容的提问来源于stack exchange,提问作者蕭力諶

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 10:20:38