如何在Gnuplot中拟合Lennard-Jones势数据?参数不符求助
Gnuplot拟合Lennard-Jones势参数问题
问题背景
现有以下数据集,需要拟合至Lennard-Jones势公式:
1 20.6711 1.1 12.8327 1.2 6.70081 1.3 2.56984 1.4 -0.0348628 1.5 -1.50733 1.6 -2.21619 1.7 -2.41084 1.8 -2.29524 1.9 -2.02128 2 -1.76153 2.1 -1.47329 2.2 -1.21735 2.3 -0.986853 2.4 -0.786588 2.5 -0.602345 2.6 -0.442397 2.7 -0.314293 2.8 -0.208958 2.9 -0.121526 3 -0.16448 4 -0.0488864 5 0 6 0.0207913 7 0.0275973 8 0.186272 9 0.0402228 10 0.0421324
使用以下Gnuplot代码拟合后,得到的sigma和epsilon参数与预期值(epsilon=2.43,sigma=1.39)不符:
f(x) = (4*epsilon) * ( (sigma/(x))**12 - (sigma/(x))**6 ) set fit brief nolog fit f(x) "data" u 1:2 via sigma,epsilon plot f(x) lw 3 lc "blue"
修正方案
1. 给拟合参数设置初始值
Gnuplot的非线性拟合对初始参数猜测高度敏感,默认从0开始迭代容易收敛到局部最优解。直接用预期值附近的数值作为初始点,引导拟合器找到正确的全局最优:
# 设置初始参数,贴近预期值 sigma = 1.39 epsilon = 2.43
2. 筛选异常数据点
观察数据集可知,x=8的数值0.186272明显偏离Lennard-Jones势的趋势(正常情况下x增大时势能应趋近于0),属于异常点,拟合时排除这类干扰点:
# 只拟合x=1到7的数据点(前23行) fit f(x) "data" u 1:2 every ::0::22 via sigma,epsilon
3. 调整拟合选项确保收敛
增加最大迭代次数,避免因迭代次数不足导致拟合不收敛;开启详细输出可监控拟合过程:
set fit maxiter 1000 set fit verbose
完整修正代码
# 设置初始参数 sigma = 1.39 epsilon = 2.43 # 定义Lennard-Jones势公式 f(x) = 4*epsilon * ( (sigma/x)**12 - (sigma/x)**6 ) # 配置拟合选项 set fit maxiter 1000 set fit verbose # 拟合筛选后的数据 fit f(x) "data" u 1:2 every ::0::22 via sigma,epsilon # 绘制拟合曲线与原始数据对比 plot "data" u 1:2 pt 7 ps 0.8 title "原始数据", \ f(x) lw 3 lc "blue" title "拟合曲线"
可选优化:加权拟合
对于Lennard-Jones势,x较小时势能变化幅度大,这些点对参数估计的贡献更重要,可以通过加权拟合强化这类点的权重,削弱噪音点的影响:
# 用势能绝对值的倒数作为权重,数值波动大的点权重更高 fit f(x) "data" u 1:2:(1/abs($2)) via sigma,epsilon
内容的提问来源于stack exchange,提问作者supertramp182
相关产品推荐
相关产品推荐

