找回密码
 欢迎注册
查看: 264|回复: 2

[原创] 寻找合适的模型拟合给定的数据

[复制链接]
发表于 2025-9-12 14:18:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
我经过长时间计算得到的两列数据如下:
  1.      x      y
  2.      1 0.59274605
  3.      2 0.58620243
  4.      3 0.57498716
  5.      4 0.56713131
  6.      5 0.56168319
  7.      6 0.55775209
  8.      7 0.55480183
  9.      8 0.55251393
  10.      9 0.55069046
  11.     10 0.54920490
  12.     11 0.54797209
  13.     12 0.54693280
  14.     13 0.54604542
  15.     14 0.54527865
  16.     15 0.54460965
  17.     16 0.54402113
  18.     20 0.54223730
  19.     24 0.54103321
  20.     32 0.53951142
  21.     40 0.53859030
  22.     64 0.53719589
  23.    2^7 0.53602405
  24.   2^11 0.53491670
  25.   2^15 0.53484716
  26.   2^30 0.53484262
复制代码

虽然这两列数据具有物理背景,但我想抛开这些物理背景,单纯地用数学方法去寻找合适的模型y=f(x)去拟合这些数据

要求f的参数个数合适,即不欠拟合也不过拟合,拟合误差要足够小(10的-7次方级别)

这样的f(x)应该如何去构造?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2025-9-13 15:28:30 | 显示全部楼层
本帖最后由 uk702 于 2025-9-13 15:57 编辑

不太好朦,尤其不知序列是否收敛于 0.53..... 。

data={{1, 0.59274605}, {2, 0.58620243}, {3, 0.57498716}, {4, 0.56713131}, {5, 0.56168319}, {6, 0.55775209}, {7, 0.55480183}, {8, 0.55251393}, {9, 0.55069046}, {10, 0.54920490}, {11, 0.54797209}, {12, 0.54693280}, {13, 0.54604542}, {14, 0.54527865}, {15, 0.54460965}, {16, 0.54402113}, {20, 0.54223730}, {24, 0.54103321}, {32, 0.53951142}, {40, 0.53859030}, {64, 0.53719589}, {2^7, 0.53602405}, {2^11, 0.53491670}, {2^15, 0.53484716}, {2^30, 0.53484262}};

(* 一个相对简单的形式 *)
fx3=FindFit[data, a+b*Log[17.0+c*x^v]^u, {{a, 0.59}, {b, 0.7}, {u, -2.34}, {v, 2.22}, {c, 1.0}}, {x}]
结果:{a -> 0.534157, b -> 0.858322, u -> -2.51265, v -> 2.0756, c -> 1.15862}
errors=((a+b*Log[17.0+c*x^v]^u)/.fx3/.x->data[[All, 1]])-data[[All, 2]]; maxError=Max[errors]
结果:0.000739861

fx3=FindFit[data, a+b*Log[w+x^v]^u+k*1/Log[Log[c+x]], {{a, 0.54}, {b, 0.25}, {u, -1.19}, {v, 2.52}, {w, 14.3}, {k, -0.03}, {c, 20.0}}, {x}]
结果:{a->0.54477, b->0.209415, u->-0.778989, v->3.42432, w->21.3901, k->-0.0533429, c->53.5703}
errors=((a+b*Log[w+x^v]^u+k*1/Log[Log[c+x]])/.fx3/.x->data[[All, 1]])-data[[All, 2]]
maxError=Max[errors]
结果:0.000459543

fx3 = FindFit[data, a + b*Log[w + x^v]^u + k*1/Log[Log[c + x]] + p/x^o, {{a, 0.54}, {b, 0.25}, {u, -1.19}, {v, 2.52}, {w, 14.3}, {k, -0.03}, {c, 20.0}, {p, 1.0}, {o, 10.0}}, {x}]
结果:{a -> 0.544909, b -> 0.176867, u -> -0.99092, v -> 2.10872, w -> 6.49134, k -> -0.0431531, c -> 34.9894, p -> -0.00674056, o -> 914.492}
errors=((a + b*Log[w + x^v]^u + k*1/Log[Log[c + x]] + p/x^o)/.fx3/.x->data[[All, 1]])-data[[All, 2]]; maxError=Max[errors]
结果:0.000053361
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2025-9-15 10:44:14 | 显示全部楼层
本帖最后由 Jack315 于 2025-9-15 11:31 编辑

顶楼中数据的图形:
原始数据.png
从图中可以看出:
x 应取对数,并在水平方向作平移:\(x_1=\log_2x-n\) ;
y 在垂直方向作镜像,并作平移:\(y_1=m-y\) 。
这时,图形的形状与函数 \(\tanh(t)=\frac{e^t-e^{-t}}{e^t+e^{-t}}\) 或 \(sigmoid(t)=\frac{1}{1+e^{-t}}\) 比较吻合。
选择拟合 \(\tanh(t)\) 函数:
\(y_1=a\tanh(bx_1)\rightarrow m-y=a\tanh[b(\log_2x-n)]\rightarrow y=m-a\tanh[b(\log_2x-n)]\)
拟合结果如下图所示:
拟合结果.png
模型参数:
\(\begin{matrix}a = 0.034170538174903&&b=0.478462022444302\\m=0.569776240335495&&n=1.877485670809697\end{matrix}\)
拟合优度:
\(\begin{matrix}R^2=0.997005400121391&&R_{Adj}^2=0.996577600138732\end{matrix}\)
模型残差:
残差.png
残差的形状看起来像一个按指数规律衰减的三角函数,但这种振荡在 \(x\ge2^{11}\) 之后似乎消失了。
所以能不能在\(x\ge100\) 的区间再增加一些样本点?
由于振荡曲线只有 3 个极值点和 4 个零点,即使强行拟合一个按指数规律衰减的三角函数,对模型的改善或也比较有限。
如果 x 能取小数,希望在 \(0\le x\le 5\) 这个区间也再增加一些样本点。
另外能否提供 \(x=0\) 处的样本点?这个点对建模或许有一定的指导作用。
新增的样本点在横轴上 (x) 按指数规律分布会比较有帮助,在有细节变化处适当增加更多样本点。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2025-10-5 02:58 , Processed in 0.030470 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表