求助!mathematics分段函数的非线性拟合
mathematica吧
全部回复
仅看楼主
level 4
ElevenYJF 楼主
这是我用NonlinearModelFit做的拟合,跑不出结果来,代码如下:
ClearAll["Global`*"];
data = {{1.8, 8.26365}, {2, 8.26669}, {2.25, 8.2327}, {2.5,
8.17323}, {2.75, 8.07695}, {3, 7.89004}, {3.25, 7.65782}, {3.5,
7.38312}, {3.75, 6.96965}, {4, 6.47689}, {4.25, 5.85103}, {4.5,
5.22516}, {4.75, 4.49169}, {5, 3.74122}, {5.25, 3.09553}, {5.5,
2.56879}, {5.75, 2.02222}, {6, 1.61159}, {6.23057, 1.21511}, {6.5,
0.83563}, {7.1, 0}};
k = 2*0.08617;
fit = NonlinearModelFit[data,
Piecewise[{{r*(a1*Tanh[(1.82*((1.018*(7.1/x - 1))^0.51))])*
Tanh[((a1*Tanh[(1.82*((1.018*(7.1/x - 1))^0.51))])/(k*
x))/(a1*0.09*r)] + (1 - r)*(a2*
Tanh[(1.82*((1.018*(4/x - 1))^0.51))])*
Tanh[((a2*Tanh[(1.82*((1.018*(4/x - 1))^0.51))])/(k*
x))/(a2*0.09*(1 - r))],
x < 4}, {r*(a1*Tanh[(1.82*((1.018*(7.1/x - 1))^0.51))])*
Tanh[((a1*Tanh[(1.82*((1.018*(7.1/x - 1))^0.51))])/(k*
x))/(a1*0.09*r)], x >= 4}}], {{a1, 1, 1.5}, {a2, 0.4,
0.8}, {r, 0, 1}}, x];
然后我用非常笨的For循环做了一个,精度小了跑不出理想的结果来,精度要求高了,跑半天没反应,代码如下:
ClearAll["Global`*"];
k = 2*0.8617;
data = {{1.8, 8.26365}, {2, 8.26669}, {2.25, 8.2327}, {2.5,
8.17323}, {2.75, 8.07695}, {3, 7.89004}, {3.25, 7.65782}, {3.5,
7.38312}, {3.75, 6.96965}, {4, 6.47689}, {4.25, 5.85103}, {4.5,
5.22516}, {4.75, 4.49169}, {5, 3.74122}, {5.25, 3.09553}, {5.5,
2.56879}, {5.75, 2.02222}, {6, 1.61159}, {6.23057, 1.21511}, {6.5,
0.83563}, {7.1, 0}};
t = 0;
For[a1 = 1, a1 < 1.5,
a1 = a1 + 0.001, {For[a2 = 0.4, a2 < 0.8,
a2 = a2 + 0.001, {For[r = 0.1, r < 1,
r = r + 0.001, {For[i = 1, i < 21,
i++, {m = data[[i, 1]], n = data[[i, 2]],
T1 = a1*Tanh[(1.82*((1.018*(7.1/m - 1))^0.51))],
T2 = a2*Tanh[(1.82*((1.018*(4/m - 1))^0.51))],
c1 = r*T1*Tanh[(T1/(k*m))/(a1*0.09*r)],
c2 = (1 - r)*T2*Tanh[(T2/(k*m))/(a2*0.09*(1 - r))],
If[m < 4, y = c1 + c2, y = c1], t = t + (n - y)^2}],
If[t < 100,
Print["a1=", a1, " a2=", a2, " r=", r, " t=", t]]}]}]}];
还有还有,我用1stopt这个软件也跑了,但拟合的结果太差了,也贴上代码:
Title "Type your title here";
Parameters a1[1,1.5],a2[0.4,0.8],r[0.1,0.9];
Variable x,y;
Constant k = 2*0.08617;
ConstStr T1 = a1*Tanh(1.82*Power((1.018*(7.1/x-1)),0.51));
ConstStr T2 = a2*Tanh(1.82*Power((1.018*(4/x-1)),0.51));
ConstStr c1 = r*T1*Tanh(T1/(k*x))/(a1*0.09*r);
ConstStr c2 = (1-r)*T2*Tanh(T2/(k*x))/(a2*0.09*(1-r));
Function y=if(x<=4,c1+c2,c1);
data;
1.88.26365
28.26669
2.258.2327
2.58.17323
2.758.07695
37.89004
3.257.65782
3.57.38312
3.756.96965
46.47689
4.255.85103
4.55.22516
4.754.49169
53.74122
5.253.09553
5.52.56879
5.752.02222
61.61159
6.230571.21511
6.50.83563
7.10
最后的最后,用Origin也试了试,但不知道分段函数应该怎么来表示[泪]
2017年03月11日 11点03分 1
level 7
既然都分段了, 分段拟合可以么?
2017年03月13日 04点03分 2
level 7
ClearAll["Global`*"];
data = {{1.8, 8.26365}, {2, 8.26669}, {2.25, 8.2327}, {2.5,
8.17323}, {2.75, 8.07695}, {3, 7.89004}, {3.25, 7.65782}, {3.5,
7.38312}, {3.75, 6.96965}, {4, 6.47689}, {4.25, 5.85103}, {4.5,
5.22516}, {4.75, 4.49169}, {5, 3.74122}, {5.25, 3.09553}, {5.5,
2.56879}, {5.75, 2.02222}, {6, 1.61159}, {6.23057, 1.21511}, {6.5,
0.83563}, {7.1, 0}};
k = 2*0.08617;
ListPlot[data]
model1 = r*(a1*Tanh[(1.82*((1.018*(7.1/x - 1))^0.51))])*
Tanh[((a1*Tanh[(1.82*((1.018*(7.1/x - 1))^0.51))])/(k*
x))/(a1*0.09*r)] + (1 - r)*(a2*
Tanh[(1.82*((1.018*(4/x - 1))^0.51))])*
Tanh[((a2*Tanh[(1.82*((1.018*(4/x - 1))^0.51))])/(k*
x))/(a2*0.09*(1 - r))];
model2 = r*(a1*Tanh[(1.82*((1.018*(7.1/x - 1))^0.51))])*
Tanh[((a1*Tanh[(1.82*((1.018*(7.1/x - 1))^0.51))])/(k*x))/(a1*0.09*
r)];
res1 = FindFit[Select[data, First[#] < 4 &],
model1, {{a1, 1}, {a2, 1}, {r, 10}}, x];
res2 = FindFit[Select[data, First[#] >= 4 &],
model2, {{a1, 1}, {a2, 1}, {r, 10}}, x];
Show[ListPlot[data], Plot[model1 /. res1, {x, 0, 4}],
Plot[model2 /. res2, {x, 4, 7.1}]]
第二段模型并不是很合适
2017年03月13日 04点03分 3
level 4
ElevenYJF 楼主
@guocong89
[大拇指]厉害了,确实这个拟合的模型不怎么符合我的数据,还有另一个带积分的模型,抽空能否也帮忙看一下,拜托拜托
数据还是这些:
data = {{1.8, 8.26365}, {2, 8.26669}, {2.25, 8.2327}, {2.5,
8.17323}, {2.75, 8.07695}, {3, 7.89004}, {3.25, 7.65782}, {3.5,
7.38312}, {3.75, 6.96965}, {4, 6.47689}, {4.25, 5.85103}, {4.5,
5.22516}, {4.75, 4.49169}, {5, 3.74122}, {5.25, 3.09553}, {5.5,
2.56879}, {5.75, 2.02222}, {6, 1.61159}, {6.23057, 1.21511}, {6.5,
0.83563}, {7.1, 0}};
常数设的是这个:
k = 0.08617;
模型是这样的:
y (x) = (0.09*r)*(1 + 4 \!\(
\*SubsuperscriptBox[\(\[Integral]\), \(T1\), \(\[Infinity]\)]\(
\*SubscriptBox[\(\[PartialD]\), \(z\)]
\*FractionBox[\(1\), \(1 +
\*SuperscriptBox[\(E\),
FractionBox[\(z\), \(k*x\)]]\)]*
\*FractionBox[\(z\),
SqrtBox[\(z^2 - T1^2\)]] \[DifferentialD]z\)\)) + (0.09*(1 - r))*(1 +
4 \!\(
\*SubsuperscriptBox[\(\[Integral]\), \(T2\), \(\[Infinity]\)]\(
\*SubscriptBox[\(\[PartialD]\), \(z\)]
\*FractionBox[\(1\), \(1 +
\*SuperscriptBox[\(E\),
FractionBox[\(z\), \(k*x\)]]\)]*
\*FractionBox[\(z\),
SqrtBox[\(z^2 - T2^2\)]] \[DifferentialD]z\)\));
直接复制过来格式有点奇怪,截图看得清楚些:
其中
T1 (x) = a1*Tanh[(1.82*((1.018*(7.1/x - 1))^0.51))];
T2 (x) = a2*Tanh[(1.82*((1.018*(7.1/x - 1))^0.51))];
需要求得的还是这三个参数:a1,a2,r
我做不出来,或许是因为未知的在积分的下限上,跑不出来
2017年03月15日 08点03分 6
这个问题好像之前讨论过, 积分拟合感觉基本不可能
2017年03月15日 09点03分
@guocong89 那用什么方法,或者有其他软件可以试试吗
2017年03月16日 02点03分
@ElevenYJF 暴力的搜索每个参数吧, 如果你能估算出参数范围
2017年03月17日 02点03分
@guocong89 实现倒是没问题的,当然效果怎么样另说(说到底还是模型好坏的问题唉),参7楼。
2017年04月01日 09点04分
吧务
level 15
对于积分模型的拟合,单纯的“实现”是没有问题的,定义黑箱函数即可:
data = {{1.8, 8.26365}, {2, 8.26669}, {2.25, 8.2327}, {2.5, 8.17323}, {2.75,
8.07695}, {3, 7.89004}, {3.25, 7.65782},
{3.5, 7.38312}, {3.75, 6.96965}, {4, 6.47689}, {4.25, 5.85103}, {4.5,
5.22516}, {4.75, 4.49169}, {5, 3.74122},
{5.25, 3.09553}, {5.5, 2.56879}, {5.75, 2.02222}, {6, 1.61159}, {6.23057,
1.21511}, {6.5, 0.83563}, {7.1, 0}};
k = 0.08617;
T1[x_, a1_] = a1*Tanh[1.82*(1.018*(7.1/x - 1))^0.51];
T2[x_, a2_] = a2*Tanh[1.82*(1.018*(7.1/x - 1))^0.51];
y[(a1_)?NumericQ, a2_, r_, (x_)?NumericQ] := With[{T1 = T1[x, a1], T2 = T2[x, a2]},
(0.09*r)*(1 +
4*NIntegrate[(D[1/(1 + E^(z/(k*x))), z]*z)/Sqrt[z^2 - T1^2], {z, T1, Infinity},
Method -> {Automatic, "SymbolicProcessing" -> 0}]) +
(0.09*(1 - r))*(1 +
4*NIntegrate[(D[1/(1 + E^(z/(k*x))), z]*z)/Sqrt[z^2 - T2^2], {z, T2, Infinity},
Method -> {Automatic, "SymbolicProcessing" -> 0}])];
nlm = FindFit[data, y[a1, a2, r, x], {a1, a2, r}, x]; // AbsoluteTiming
Plot[y[a1, a2, r, x] /. nlm // Re, {x, 1.8, 7.1}]
注意我为了提速加了Method -> {Automatic, "SymbolicProcessing" -> 0},这在这里其实是不合适的,因为那是个振荡积分,不用符号预处理几乎可以肯定算不准,但是不加的话求解速度会很慢,我懒得等了。FindFit的初值我也没给。(因为不了解模型性质。)最后的拟合效果并不好,这里就不贴了。
2017年04月01日 09点04分 7
level 4
ElevenYJF 楼主
非常感谢,再详细解释一下,这是一个求解多带的超导体的超导能隙的模型,数据是实验所得数据,a1的范围应该是0.4-0.7之间,a2的范围是1.1-1.2之间,r是比例,是0-1之间。
2018年04月09日 02点04分 8
1