寻找合适的模型拟合给定的数据
我经过长时间计算得到的两列数据如下:x y
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
虽然这两列数据具有物理背景,但我想抛开这些物理背景,单纯地用数学方法去寻找合适的模型y=f(x)去拟合这些数据
要求f的参数个数合适,即不欠拟合也不过拟合,拟合误差要足够小(10的-7次方级别)
这样的f(x)应该如何去构造? 本帖最后由 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^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^u)/.fx3/.x->data[])-data[]; maxError=Max
结果:0.000739861
fx3=FindFit^u+k*1/Log], {{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^u+k*1/Log])/.fx3/.x->data[])-data[]
maxError=Max
结果:0.000459543
fx3 = FindFit^u + k*1/Log] + 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^u + k*1/Log] + p/x^o)/.fx3/.x->data[])-data[]; maxError=Max
结果:0.000053361 本帖最后由 Jack315 于 2025-9-15 11:31 编辑
顶楼中数据的图形:
从图中可以看出:
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\rightarrow y=m-a\tanh\)
拟合结果如下图所示:
模型参数:
\(\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}\)
模型残差:
残差的形状看起来像一个按指数规律衰减的三角函数,但这种振荡在 \(x\ge2^{11}\) 之后似乎消失了。
所以能不能在\(x\ge100\) 的区间再增加一些样本点?
由于振荡曲线只有 3 个极值点和 4 个零点,即使强行拟合一个按指数规律衰减的三角函数,对模型的改善或也比较有限。
如果 x 能取小数,希望在 \(0\le x\le 5\) 这个区间也再增加一些样本点。
另外能否提供 \(x=0\) 处的样本点?这个点对建模或许有一定的指导作用。
新增的样本点在横轴上 (x) 按指数规律分布会比较有帮助,在有细节变化处适当增加更多样本点。
页:
[1]