有人能把这个拟合出来吗?
我拟合了几次,都是没有结果,难道sinh的函数就不能拟合吗Constant ep0=0.001, s0=41.523; //Æðʼֵ
Parameter a, n;
Variable ep, s;
StartProgram [Pascal];
var j: integer;
temep, tems: double;
Begin
temep := ep0;
tems := s0;
for j := 0 to DataLength - 1 do begin
s[j]:=s[j];
ep[j]:= temep*(sinh(a*s[j])/sinh(a*tems))^n;
temep := ep[j];
tems := s[j];
end;
End;
EndProgram;
Data;
//ʱ¼ät£¨h£© ϸ°û£¨X) ²úÎP£©
//0.001 43.263
//0.001 41.523
0.01 59.819
0.1 101.89
1 137.731 用的是哪个版本?如果是网上流行的1.5 PJ版就别指望用这种编程模式了。 就用2.0 或者2.5,能拟合出来吗 有点象时间系列?数据点比较少啊。
优化算法: 全局麦夸特法(Global Levenberg-Marquardt)
计算结束原因: 达到收敛判定标准
均方差(RMSE): 0.00285228625581715
残差平方和(SSE): 2.44066106553703E-5
相关系数(R): 0.999989917112026
相关系数之平方(R^2): 0.999979834325716
决定系数(DC): 0.999959281597172
F统计(F-Statistic): 24558.9200591484
参数 最佳估算
-------------------- -------------
a 0.0173497948192158
n 3.57748260398233
====== 输出结果 =====
文件:Data file - 1
No 实测ep 计算ep
1 0.01 0.00506533143686638
2 0.1 0.100235709646303
3 1 0.999990111115807 代码改了一句:
Constant ep0=0.001, s0=41.523;
Parameter a, n;
Variable ep[OutPut], s;
StartProgram [Pascal];
Procedure MainModel;
var j: integer;
temep, tems: double;
Begin
temep := ep0;
tems := s0;
for j := 0 to DataLength - 1 do begin
s[j]:=s[j];
ep[j]:= temep*(sinh(a*s[j])/sinh(a*tems))^n;
temep := ep[j];
tems := s[j];
end;
End;
EndProgram;
Data;
//ê±??t£¨h£? ??°?£¨X) 2ú??£¨P£?
//0.001 43.263
//0.001 41.523
0.01 59.819
0.1 101.89
1 137.731 我算了,好像也是你这个结果,但是刚开始我用的是差分进化法,却得不到稳定的解,全局麦夸特法(Global Levenberg-Marquardt),每次都能得到稳定解,他们之间有什么区别吗?能稍微解释一下吗,谢谢了。
我发现shamohu 可能是目前simwe上对1stopt了解最深刻的大虾,呵呵。 对于非线性优化问题,目前还没有任何一种算法是“十全十美”,都有各自的特点和适合解决的问题类型和范围。参考一下1stOpt的使用手册,对于无约束非线性拟合,全局麦夸特法应是首选;如果是混合整数、或有约束,可以试一下差分进化法。总之,没有固定格式,多试几下。 请教版主:
你的程序中循环内第一句s[j]:=s[j]这一句是起什么作用的?把它去掉似乎也不影响结果吧?
我是初学者,所以对程序看得比较仔细,期望能从其中吸取营养。
页:
[1]
