1stOpt非线性拟合技巧之一
1stOpt的非线性拟合能力应该是笔者目前所见过最强的,使用也很简单、方便,但对一些例子,如果掌握不当,却难以求得正解。近日网上搜索,在DPS([url]www.chinadps.net)[/url]的论坛上看到一有关DPS与1stOpt在非线性拟合问题上的争论([url]http://w7913.s10.mydiscuz.com/forumdisplay.php?fid=13[/url])。DPS是浙江大学唐启义教授开发的一套统计软件,功能多多。本贴在此不是想比较两种软件,而是以其论坛上的非线性拟合问题为例,介绍如何处理类似问题。原贴的1stOpt代码及数据附录如下。
用1stOpt运行该代码,的确得不到好的结果,至于DPS论坛上那位1stOpt用户是如何求出的不得而知,笔者试了一下,只要在function语句前加上一句:
StartRange = [-100000,100000];
就可以很容易求出答案了,为何要加这一句呢?看看x数据,最高值达400000,因此可以推断,有的参数值可能会很大,大到按常规方法搜索不到的地步(1stOpt缺省取值范围为0-5),因此只要人为地改变一下取值范围就可以了,也没必要去猜初值了。
除了一些特殊情况,大多数情况下没必要这么做,应根据实际数据情况而定。
大家可自己试试,希望有帮助。
********************************************************
Title "Peak Fit 11";
Function y = p1*exp(-2.77*((x-p2)/p3)^2)+p1*exp(-2.77*((x-5*p2)/p4)^2)+
a0*exp(-0.5*((x-a1)/a2)^2)+2*a0*exp(-0.5*((x-2*a1)/a2)^2);
Data;
//x y
1428 0.0159
2857 0.0294
5714 0.0540
8571 0.0832
11429 0.1769
14286 0.3010
17143 0.4822
20000 0.8909
22857 1.4673
25714 2.6091
28571 3.9487
31429 6.1861
34286 10.2854
37143 14.1971
40000 20.8154
42857 27.9622
45714 34.1893
48571 50.9944
51429 52.8896
54286 74.7148
57143 78.2739
60000 94.8341
62857 97.1913
65714 106.9074
68571 110.5764
71429 99.7094
74286 95.2368
77143 100.9800
80000 95.3051
82857 84.7236
85714 72.5028
88571 63.7613
91429 53.8688
94286 45.3433
97143 47.6868
100000 39.2611
102857 41.2603
105714 38.4826
108571 41.0614
111429 42.8718
114286 52.4247
117143 54.6309
120000 58.5655
122857 57.6910
125714 62.2335
128571 63.6598
131429 74.5593
134286 76.3657
137143 76.8343
140000 76.4166
142857 73.9337
145714 83.6326
148571 79.5735
151429 77.3333
154286 82.7579
157143 74.8436
160000 70.2986
162857 69.1072
165714 62.9654
168571 63.9911
171429 63.3608
174286 54.3341
177143 54.7983
180000 54.1602
182857 50.5028
185714 46.6765
188571 37.3148
191429 35.4733
194286 31.4011
197143 31.6141
200000 29.3181
202857 29.2092
205714 25.6456
208571 23.5434
211429 21.6426
214286 20.5469
217143 21.0379
220000 23.0230
222857 23.3786
225714 22.6132
228571 28.5862
231429 29.2285
234286 34.6253
237143 40.5241
240000 43.5328
242857 44.4078
245714 55.3422
248571 63.8790
251429 70.3837
254286 64.7925
257143 84.1060
260000 85.2346
262857 96.3957
265714 101.5065
268571 101.5635
271429 125.4770
274286 123.0295
277143 116.8548
280000 132.5786
282857 146.0718
285714 152.3447
288571 149.5277
291429 149.2917
294286 167.8167
297143 140.3957
300000 146.2560
302857 140.2877
305714 150.3306
308571 151.0844
311429 135.0494
314286 124.1520
317143 128.2794
320000 121.8187
322857 127.7168
325714 109.3237
328571 98.8645
331429 101.0413
334286 95.4619
337143 82.9761
340000 108.2798
342857 173.0225
345714 125.9043
348571 55.3894
351429 48.4749
354286 40.5538
357143 32.5134
360000 30.7203
362857 26.0722
365714 21.6562
368571 19.8353
371429 16.4291
374286 14.3602
377143 11.6957
380000 8.8610
382857 7.2047
385714 6.0873
388571 5.1435
391429 4.1757
394286 3.0479
397143 2.7644
400000 2.1079
[[i] 本帖最后由 shamohu 于 2007-3-2 23:35 编辑 [/i]]
求助:1stopt做拟合时显示读数据出错,请高手指点,见程序。
Title "Type your title here";Parameters a,b,c,d ;
Variable x,y;
Function y=a+b*sin(c*x)+d*sin(3*c*x);
data;
//x y
0.00000 0.27441
1.00000 0.29980
2.00000 0.32422
3.00000 0.34424
4.00000 0.35986
5.00000 0.37305
6.00000 0.38086
7.00000 0.38574
8.00000 0.38770
9.00000 0.38672
10.00000 0.38232
11.00000 0.37451
12.00000 0.36328
13.00000 0.34717
14.00000 0.32666
15.00000 0.30225
16.00000 0.27637 没有问题啊,这是结果:
"Type your title here"
(R): 0.999921355577664
R^2): 0.999842717340273
参数
---------- -------------
a 0.273899674696823
b 0.118735759949776
c 0.194903006199373
d 0.0051011229959653
====== 计算结果 =====
No 实测值 计算值
1 0.27441 0.2738997
2 0.2998 0.2997110
3 0.32422 0.3237160
4 0.34424 0.3444523
5 0.35986 0.3610404
6 0.37305 0.3732487
7 0.38086 0.3813700
8 0.38574 0.3859600
9 0.3877 0.3875294
10 0.38672 0.3862968
11 0.38232 0.3820883
12 0.37451 0.3744173
13 0.36328 0.3627176
14 0.34717 0.3466495
15 0.32666 0.3263726
16 0.30225 0.3026890
17 0.27637 0.2770014
[[i] 本帖最后由 abingchem 于 2007-5-14 11:00 编辑 [/i]]
页:
[1]
