求教:非线性拟合的小问题 ^_^
mathematica吧
全部回复
仅看楼主
level 2
h0rm0ne 楼主
我的code1 和 2 唯一的区别就是sin前面的系数84.95和84.96,但为什么差别这么大?第一个可以完美运行,第二个显示NonlinearModelFit::cvmit: 无法在 100 次迭代中收敛到要求的准确度或者精度,而且结果也不好
code1
Clear[nlm, data]data = Table[{i, 84.96 Sin[2 i] + 50}, {i, 1, 20}];
nlm = NonlinearModelFit[data, a Sin[b x + c] + d, {a, b, c, d}, x]
Show[ListPlot[data], Plot[nlm[x], {x, 0, 20}], Frame -> True]
code2
Clear[nlm, data]data = Table[{i, 84.95 Sin[2 i] + 50}, {i, 1, 20}];
nlm = NonlinearModelFit[data, a Sin[b x + c] + d, {a, b, c, d}, x]
Show[ListPlot[data], Plot[nlm[x], {x, 0, 20}], Frame -> True]
求大神赐教,谢谢!(*^__^*) ……
2017年02月28日 03点02分 1
level 2
h0rm0ne 楼主
另外这里插一个问题 有时用nonlinearmodelfit拟合的结果里面出现了类似于Sin[<<38>>+<<39>>x]的形式,这里双尖括号是什么意思?为什么没有出数字?
2017年02月28日 03点02分 2
level 7
只能说这个模型不稳定, 纯看脸
比较一下这些结果
f[data_] := Module[{nlm},
nlm = NonlinearModelFit[data, a Sin[b x + c] + d, {a, b, c, d}, x];
Show[ListPlot[data], Plot[nlm[x], {x, 0, 20}], Frame -> True]]
f[Table[{i, 84.95 Sin[2 i] + 50}, {i, 1, 20, 0.5}]]
f[Table[{i, 84.95 Sin[2 i] + 50}, {i, 1, 20, 0.8}]]
f[Table[{i, 84.95 Sin[2 i] + 50}, {i, 1, 20, 1}]]
f[Table[{i, 84.95 Sin[2 i] + 60}, {i, 1, 20, 1}]]
f[Table[{i, 84.95 Sin[2 i] + 70}, {i, 1, 20, 1}]]
尖括号意味着长度大, 缩写了
2017年02月28日 06点02分 3
确切地说,非线性模型的拟合效果极度依赖初值。(当然了,也有人怀疑过,这是不是算法的某种设计缺陷:http://mathematica.stackexchange.com/q/105002/1871)至于对策,如上所说,一般就是找合适初值,有的时候Method->NMinimize和NormFunction -> (Norm[#, Infinity] &)也能改善结果。
2017年03月04日 06点03分
多谢层主吧主两位大神[哈哈]
2017年03月06日 09点03分
1