求助拟合函数参数问题(附代码)
mathematica吧
全部回复
仅看楼主
level 2
想用NonlinearModelFit拟合自己写的一个函数的参数,效果非常差(附图),且速度极慢,求助大侠帮忙
附:(代码)
ClearAll["Global`*"];
MR[B_, le_, lp_, \[Eta]_ ] :=
Block[{cq = 6.16*10^-6, \[Rho] = 20.2*10^4, fun, x, y, g, ps, qs, pt,
qt, zs, fs, zt, ft, Z, F, lB, \[Alpha], \[Beta], \[Sigma]},
fun[x_, y_] := (2 Sqrt[-x] Sin[1/3 ArcCos[(3 y)/(2 x) Sqrt[-3/x]]])/
Sqrt[-4 x^3 - 27 y^2];
g = (2 (1 - \[Eta]))/(3 (\[Eta] + 1)) ;
ps = -4/(3 g^4) (1 - 1/3 g - 8/9 g^2 + 1/3 g^3 - 1/2 g^4);
qs = 1/g^6 (16/27 - 8/27 g - 80/81 g^2 + 664/729 g^3 - 28/81 g^4 -
2/27 g^5 - 7/27 g^6);
pt = 4/(3 g^4) (-1 + 1/2 g + 5/4 g^2 - 3/8 g^3 + 27/64 g^4);
qt = 1/g^6 (16/27 - 4/9 g - 14/9 g^2 + 67/54 g^3 + 1/6 g^4 -
1/8 g^5 - 5/32 g^6);
zs = -2 Sqrt[-ps/3] Cos[1/3 ArcCos[(3 qs)/(2 ps) Sqrt[-3/ps]]] +
2/9 (3 + g - 3 g^2)/g^2;
fs = (2 fun[ps, qs])/(
3 (1 - 1/2 g)^2 g^3) (zs^2 g^3 (-2 + 3/2 g) +
zs g (1 + 1/2 g - 7/2 g^2 + 9/4 g^3) - (2 - 4 g - 1/2 g^2 +
3 g^3 - 3/2 g^4));
zt = -2 Sqrt[-pt/3] Cos[1/3 ArcCos[3 qt/(2 pt) Sqrt[-3/pt]]] +
2/(9 g^2) (3 + 3 g/2 - 27 g^2/8);
ft = (2 fun[pt, qt])/(
3 (1 - 1/2 g)^2 g^3) (zt^2 g^3 (-2 + 3/2 g) +
zt g (1 + 3/2 g - 35/8 g^2 + 39/16 g^3) - (3 - 9/2 g -
3/2 g^2 + 7/2 g^3 - 3/2 g^4));
Z = {0, zs, zt, zt};
F = {1, fs, ft, ft};
lB = 12.8/Sqrt[B];
\[Alpha] =
cq/(2 lB)
Sum[F[[i]] (HurwitzZeta[1/2,
1/2 + (Z[[i]] + (le/lp)^2) (lB/le)^2] -
HurwitzZeta[1/2, 1/2 + (Z[[i]] + 1) (lB/le)^2]), {i, 4}];
\[Beta] =
cq/le Sum[
F[[j]] (Sqrt[Z[[j]] + 1] - Sqrt[Z[[j]] + (le/lp)^2]), {j, 4}];
\[Sigma] = \[Alpha] - \[Beta];
Re[100 (-\[Sigma] /((\[Rho]^-1) + \[Sigma] ))]]
data ={{0.27586, 0.04188}, {0.55172, 0.06026}, {0.82759, 0.15554}, {1.10345,0.25673}, {1.37931, 0.30264}, {1.65517, 0.35005}, {1.93103, 0.38227}, {2.2069, 0.41157}, {2.48276, 0.38694}, {2.75862, 0.36296}, {3.03448, 0.33171}, {3.31034, 0.27029}, {3.58621, 0.22558}, {3.86207, 0.15364}, {4.13793, 0.0676}, {4.41379, -0.03071}, {4.68966, -0.13739}, {4.96552, -0.258}, {5.24138, -0.37462}, {5.51724, -0.49661}, {5.7931, -0.64497}, {6.06897, -0.79205}, {6.34483, -0.97282}, {6.62069, -1.1363}, {6.89655, -1.3314}, {7.17241, -1.51024}, {7.44828, -1.72525}, {7.72414, -1.99221}, {8, -2.24913}}
fit = NonlinearModelFit[data, MR[B, le, lp, \[Eta]] , {le, lp , \[Eta]}, B]
Show[ListPlot[data], Plot[fit[x], {x, 0, 8}], Frame -> True]
2020年12月29日 16点12分 1
吧务
level 12
你这个原函数形式太复杂了,试了半天也没拟合出太好的效果。建议想办法简化简函数形式,明确各参数取值范围,然后用数值最优化的办法求解吧
Show[ListPlot[data],
Plot[MR[x, 0.21464577895051168`, 30.9332066085763`,
0.9373902740766087`], {x, 0, 8}], Frame -> True]
2020年12月31日 03点12分 2
感谢,感谢奥
2021年01月05日 01点01分
1