dingd 发表于 2008-5-6 16:11

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 编辑 ]

zsy312 发表于 2012-5-26 10:30

这是使用提供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

dingd 发表于 2012-5-30 15:58

很久以前的帖子了。

第一个问题用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]
查看完整版本: 1stOpt与Lingo的非线性拟和测试对比!