1stOpt与Lingo的非线性拟和测试对比!
非线性拟和实质上也是一个优化问题,即残差平方和最小。1stOpt有专门的拟和模式,代码简单直观,动态图形显示计算结果;Lingo没有专门的拟和形式,只能将问题转换成一般的优化问题。下面以两个实例来对比验证各自的表现。Lingo版本是10,启用“Global Solver”,1stOpt版本是2.5.例一:
公式:y = a0 + a1*x^k1 + a2*X^k2;
数据:x,y
5 3.3
10 6.5
15 9.2
20 11.9
25 14.5
30 17.0
35 19.4
40 21.7
45 23.9
50 25.9
55 27.6
60 29.2
65 30.0
70 30.3
75 30.0
80 29.2
85 26.0
90 21.0
95 12.0
Lingo代码:
Model:
Sets:
BAC/R1..R19/:x,y;
EndSets
Data:
x = 5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95;
y =3.3,6.5,9.2,11.9,14.5,17.0,19.4,21.7,23.9,25.9,27.6,29.2,30.0,30.3,30.0,29.2,26.0,21.0,12.0;
EndData
Min=@Sum(BAC:(a0+a1*x^k1+a2*x^k2-y)^2);
@free(a0);
@free(a1);
@free(a2);
@free(k1);
@free(k2);
End
运行时间很长,结果也很离谱:Min=464.3750
A0 -734327.3
A1 367157.5
K1 0.1212479E-04
A2 367158.0
K2 0.1174782E-04
1stOpt代码:
Algorithm = LM2;
Function Y = a0 + a1*x^k1 + a2*X^k2;
Data;
5 3.3
10 6.5
15 9.2
20 11.9
25 14.5
30 17.0
35 19.4
40 21.7
45 23.9
50 25.9
55 27.6
60 29.2
65 30.0
70 30.3
75 30.0
80 29.2
85 26.0
90 21.0
95 12.0
很快得结果:
残差平方和(SSE): 0.909314071040377 (对应Lingo的最小值)
a0 -1.48141876206282
a1 -1.33957893482488E-13
k1 7.26524918693183
a2 1.34593124056475
k2 0.770896456786862
例二:
公式:y=b1*exp(b2*abs(x+b3)^b4);
数据:x,y
27.25 1
27.75 3
28.25 6
28.75 13
29.25 18
29.75 19
30.25 17
30.75 16
31.25 6
31.75 5
32.25 2
Lingo代码:
Model:
Sets:
BAC/R1..R11/:x,y;
EndSets
Data:
x=27.25,27.75,28.25,28.75,29.25,29.75,30.25,30.75,31.25,31.75,32.25;
y=1,3,6,13,18,19,17,16,6,5,2;
EndData
Min=@Sum(BAC:(b1*@exp(b2*@abs(x+b3)^b4)-y)^2);
@free(b1);
@free(b2);
@free(b3);
@free(b4);
End
计算不知何时终止,强行中断,得Min=275.9210
B1 0.000000
B2 32.88549
B3 -30.43433
B4 -0.1287276E-01
1stOpt代码:
Algorithm = GLM;
Function y=b1*exp(b2*abs(x+b3)^b4);
Data;
27.25 1
27.75 3
28.25 6
28.75 13
29.25 18
29.75 19
30.25 17
30.75 16
31.25 6
31.75 5
32.25 2
几秒内完成,
残差平方和(SSE): 14.6664218246103
b1 19.1581776899949
b2 -0.362592752520546
b3 -29.8159227205935
b4 2.29795107715564
上述两例,Lingo都难以完成任务,完败于1stOpt。当然这并不能说Lingo不好。在非线性拟和方面,做过大量测试,绝大多数情况,Lingo还是表现不错,抛除其代码不是很直观外,应用效果虽不如1stOpt,但比Origin、Matlab等强,也不用猜初值。
大家可以自己验证一下!
[ 本帖最后由 dingd 于 2008-5-6 20:52 编辑 ] 这是使用提供lingo12计算的结果, 用的时间是长点:
Local optimal solution found.
Objective value: 0.9092270
Objective bound: 0.000000
Infeasibilities: 0.000000
Extended solver steps: 632
Total solver iterations: 2882005
Model Class: NLP
Total variables: 6
Nonlinear variables: 5
Integer variables: 0
Total constraints: 2
Nonlinear constraints: 1
Total nonzeros: 6
Nonlinear nonzeros: 5
Variable Value Reduced Cost
A0 -1.495460 0.3264887E-03
A1 1.351174 0.6113963E-02
K1 0.7699962 0.3195477E-01
A2 0.000000 -2.066217
K2 7.274076 0.1475154E-03
很久以前的帖子了。
第一个问题用Lingo 13跑了近20分钟也没得到最优解,强行终止了。
用最新版的1stOpt 5.0,计算5次,每次仅需10秒左右,均可得相同结果:
均方差(RMSE): 0.218755695715365
残差平方和(SSE): 0.909227033750352
相关系数(R): 0.999667174132494
相关系数之平方(R^2): 0.999334459038045
决定系数(DC): 0.999334459038046
卡方系数(Chi-Square): 0.022935922103561
F统计(F-Statistic): 5258.87991885924
参数 最佳估算
---------- -------------
a0 -1.49546127006435
a1 1.35117327583104
k1 0.769996104686907
a2 -1.28596600510275E-13
k2 7.27408052590875
页:
[1]