找回密码
 注册
Simdroid-非首页
查看: 1538|回复: 35

微分方程参数优化(拟合)问题

[复制链接]
发表于 2009-11-28 10:28:14 | 显示全部楼层 |阅读模式 来自 山东淄博
本帖最后由 wanglu 于 2009-12-1 11:19 编辑

在Matlabsky论坛和Matlab中文论坛有两个微分方程参数拟合问题,我用OpenFC(Forcal程序)求解了,但没有得到验证,希望这里的高手能帮忙验证一下,同时讨论一下此类问题的不同解法。

OpenFC下载: http://xiazai.zol.com.cn/detail/27/262791.shtml

首先说明一下,对于参数拟合,我用的是徐士良算法库中的求n维极值的单形调优法函数XSLSF::jsim,该函数需要试算求解,有时不能获得最优解。对于这两个例子,第一个自我感觉良好,似乎得到了最优解;但第二个运算量太大,十几分钟才获得一组解,难以尝试各种参数,故仅获得了迭代100次的局部解。

第一个例子地址:http://www.matlabsky.cn/thread-3511-1-3.html

据说本例可以用Matlab的dsolve函数得出y和z的表达式,因而验证较容易,麻烦Matlab高手能给出解析解。

数学模型:

  1.       dy/dt=k*y*z+0.095*b*z
  2.       dz/dt=-b*z-0.222*z
复制代码
实验数据(ti; yi):
ti        yi
0.01    2.329101563
0.68    3.851292783
1.1     4.50093936
1.63    6.749172247
2.07    9.112062872
2.67    9.691657366
3.09    11.16928013
3.64    10.91451823
4.65    16.44279204
5.1     18.29615885
5.58    21.63989025
6.11    25.78611421
6.63    26.34282633
7.06    26.50581287
7.62    27.63951823
8.66    35.02757626
9.04    35.5562035
9.63    36.10393415

    已知z在t=0.01时的初值为5000,求k和b的最优值?

    算法分析:用求n维极值的单形调优法求最优参数值k和b。用连分式法对微分方程组积分一步函数pbs1求理论值,与实验值做比较,理论值与实验值差的平方和最小为最优。

    Forcal代码:

  1. !using["XSLSF"];                //使用命名空间XSLSF
  2. //函数定义,用于计算微分方程组中各方程右端函数值,连分式法对微分方程组积分一步函数pbs1将调用该函数f。
  3. //t为自变量,y和z为函数值,dy和dz为右端函数值(即微分方程的值)。
  4. //该函数被调用时将用到参数k和b,这2个参数正好是拟合参数,用模块变量传递这2个参数。
  5. f(t,y,z,dy,dz::k,b)=
  6. {
  7.   dy=k*y*z+0.095*b*z,
  8.   dz=-b*z-0.222*z
  9. };
  10. //用连分式法对微分方程组进行积分,获得理论值。
  11. //t1,t2为积分的起点和终点。
  12. //h,s为自动变量。
  13. //模块变量:hf为函数f的句柄,要预先获得该句柄;Array为工作数组;step为积分步长;eps为积分精度。
  14. 积分(t1,t2:h,s:hf,Array,step,eps)=
  15. {
  16.     s=ceil[(t2-t1)/step],        //计算积分步数
  17.     h=(t2-t1)/s,                 //重新计算积分步长
  18.     {   pbs1[hf,t1,Array,h,eps], //对微分方程组积分一步
  19.         t1=t1+h                  //积分步长增加
  20.     }.until[abs(t1-t2)<h/2]      //连续积分至t2
  21. };
  22. //目标函数定义,自变量_k,_b为需要优化的参数,需要将这些参数传递给对应的模块变量k,b。
  23. //模块变量:Array为工作数组;数组tArray存放实验数据ti;数组yArray存放实验数据yi;max为数组tArray和yArray的长度;k,b为优化变量。
  24. 优化(_k,_b:i,s,y,z,yy,t1,t2:Array,tArray,yArray,max,k,b)=
  25. {
  26.   k=_k,b=_b,                         //传递优化变量,函数f中要用到k,b
  27.   Array.setra(0,2.329101563,5000),   //设置积分初值,通过模块变量Array传递,Array是一个数组
  28.   i=1,s=0,t1=0.01,
  29.   (i<max).while{
  30.     tArray.getra(i,&t2), yArray.getra(i,&yy),
  31.     积分(&t1,t2),                    //从t1积分到t2
  32.     Array.getra(0,&y,z),             //从数组Array获得t2时的积分值
  33.     s=s+[y-yy]^2,                    //累加理论值与实验值差的平方
  34.     i++
  35.   },
  36.   s
  37. };
  38. 验证(_k,_b:i,y,z,yy,t1,t2:Array,tArray,yArray,max,k,b)=
  39. {
  40.   k=_k,b=_b,
  41.   printff{"\r\n               t            y实验值            y模拟值         z模拟值\r\n"},
  42.   Array.setra(0,2.329101563,5000),   //设置积分初值,通过模块变量Array传递,Array是一个数组
  43.   i=1,t1=0.01,
  44.   (i<max).while{
  45.     tArray.getra(i,&t2), yArray.getra(i,&yy),
  46.     积分(&t1,t2),                    //从t1积分到t2
  47.     Array.getra(0,&y,&z),            //从数组Array获得t2时的积分值
  48.     printff{"{1,r,18.8}{2,r,18.8}{3,r,18.8}{4,r,18.8}\r\n",t1,yy,y,z},
  49.     i++
  50.   }
  51. };
  52. main(:x,xx,g,d,u,v,k,i,t1,t2,t3,_eps:Array,tArray,yArray,max,hf,step,eps)=
  53. {
  54.   hf=HFor("f"),                                    //模块变量hf保存函数f的句柄,预先用函数HFor获得该句柄
  55.   step=0.01,eps=1e-6,                              //积分步长step要合适,积分精度eps越小越精确,用于对微分方程组积分一步函数pbs1
  56.   Array=new[rtoi(real_s),rtoi(2*15)],              //申请工作数组
  57.   max=18,                                          //实验数据组数
  58.   tArray=new{rtoi(real_s),rtoi(max),rtoi(EndType), //存放实验数据ti
  59.     0.01,
  60.     0.68,
  61.     1.1,
  62.     1.63,
  63.     2.07,
  64.     2.67,
  65.     3.09,
  66.     3.64,
  67.     4.65,
  68.     5.1,
  69.     5.58,
  70.     6.11,
  71.     6.63,
  72.     7.06,
  73.     7.62,
  74.     8.66,
  75.     9.04,
  76.     9.63
  77.     },
  78.   yArray=new{rtoi(real_s),rtoi(max),rtoi(EndType), //存放实验数据yi
  79.     2.329101563,
  80.     3.851292783,
  81.     4.50093936,
  82.     6.749172247,
  83.     9.112062872,
  84.     9.691657366,
  85.     11.16928013,
  86.     10.91451823,
  87.     16.44279204,
  88.     18.29615885,
  89.     21.63989025,
  90.     25.78611421,
  91.     26.34282633,
  92.     26.50581287,
  93.     27.63951823,
  94.     35.02757626,
  95.     35.5562035,
  96.     36.10393415
  97.     },
  98.   x=new[rtoi(real_s),rtoi(3)],                     //申请工作数组
  99.   xx=new[rtoi(real_s),rtoi(2),rtoi(3)],            //申请工作数组
  100.   g=new[rtoi(real_s),rtoi(3)],                     //申请工作数组
  101.   _eps=1e-100, d=550,u=1.6,v=0.4,k=500,            //变换d、u、v进一步求解,k为允许的最大迭代次数
  102.   i=jsim[HFor("优化"),d,u,v,x,_eps,k,xx,g],        //求n维极值的单形调优法
  103.   x.getra(0,&t1,&t2,&t3),                          //获得最优参数值及目标终值
  104.   printff{"\r\n实际迭代次数={1,i}, k={2,r}, b={3,r}, 目标函数终值={4,r}\r\n",i,t1,t2,t3},
  105.   验证(t1,t2),                                     //验证计算结果
  106.   delete[Array],delete[tArray],delete[yArray],delete[x],delete[xx],delete[g]
  107. };
复制代码
结果:


  1. 实际迭代次数=104, k=1.4083232846396376e-004, b=-1.4666335917093112e-004, 目标函数终值=24.291246634355627

  2.                t            y实验值            y模拟值         z模拟值
  3.               0.68         3.8512928         3.5561928         4309.3892
  4.                1.1         4.5009394         4.5088671          3925.987
  5.               1.63         6.7491722         5.9132744         3490.4669
  6.               2.07         9.1120629         7.2438212         3165.8451
  7.               2.67         9.6916574          9.277481         2771.2765
  8.               3.09          11.16928         10.832584         2524.7187
  9.               3.64         10.914518         13.002227         2234.7074
  10.               4.65         16.442792         17.253317         1786.1071
  11.                5.1         18.296159         19.204517         1616.4048
  12.               5.58          21.63989         21.291108         1453.1227
  13.               6.11         25.786114         23.574516          1291.924
  14.               6.63         26.342826         25.768822         1151.1585
  15.               7.06         26.505813          27.53363         1046.4169
  16.               7.62         27.639518         29.747528         924.16377
  17.               8.66         35.027576         33.556979          733.7452
  18.               9.04         35.556204         34.840955         674.42303
  19.               9.63         36.103934         36.714588          591.6789
复制代码
 楼主| 发表于 2009-11-28 13:23:35 | 显示全部楼层 来自 山东淄博
Simdroid开发平台
第二个问题,将允许的最大迭代次数k=500,运行了约40分钟,终于获得一组最优解:


  1. 实际迭代次数=213, k1=9.5111080627706936, k2=18.593155843279298, k4=-0.3629342128423555, k11=9.2785258647078628, k16=42.278370674583023, k17=23.125269056444612, 目标函数终值=1.0494952055839093e-009
复制代码


另外,第一个问题有解析解的,Matlab、maple或mmtc高手们能否给出解析解呢?

盼望大家帮忙验证一下我的结果,给出目标函数终值,最好能给出代码,让大家都能参考。

欢迎大家讨论一下此类问题的解法,无论是用Matlab、maple、mmtc或1stOpt,还是用其他软件均可。
回复 1 不支持 0

使用道具 举报

 楼主| 发表于 2009-11-28 10:39:22 | 显示全部楼层 来自 山东淄博
第二个例子:http://www.ilovematlab.cn/thread-57183-1-4.html

现有如下6个微分式,k1, k2, k4, k11, k16, k17为待定的常数,与t无关,目标是通过[A][B][C][D][E][F]关于t的函数解析式,并用实验数据([E]关于时间t的一组数据),拟合求出这些待定量k的值,实验数据见excel文件。
如果求不出函数解析解的话,也可用其他方法把待定的常数k值求出来也行。

已知t=0时,[A]=[C]=[F]=0, [B]=1.25*10-3, [D]= 1.0*10-4, [E]= 2.0*10-4

d[A]/dt=56*k1*[D]-k2*[A]*[B]
d[B]/dt=-k2*[A]*[B]
d[C]/dt=k2*[A]*[B]-k4*[C]*[D]-k16*[C]*[E]-56*k17*[C]*[F]
d[D]/dt=0.002*k11*[A]- 56*k1*[D]
d[E]/dt=-k16*[C]*[E]
d[F]/dt= k16*[C]*[E]-56*k17*[C]*[F]

t/sE浓度/(mg/L)
00.0002
10.000199566
20.000199814
30.000199068
40.000199006
50.000198448
60.000198634
70.000197704
80.000197642
90.000197454
100.000197082
110.00019671
120.0001964
130.000196276
140.000195716
150.000195468
160.000195034
170.000194724
180.000194166
190.000193978
200.00019342
210.00019311
220.000192738
230.000192428
240.000192054
250.000191558
260.000191124
270.000191
280.00019044
290.000189944
300.000189882
310.000189076
320.000188702
330.000188268
340.000187958
350.000187524
360.000187088
370.000186654
380.000186096
390.000185724
400.000185164
410.000184668
420.000184358
430.00018386
440.00018355
450.000183116
460.000182496
470.000181998
480.000181502
490.000181068
500.000180696
510.000180322
520.000179578
530.000179268
540.000178584
550.000178212
560.000177654
570.000177094
580.000176722
590.000176226
600.000175606
610.00017517
620.00017455
630.00017424
640.00017368
650.000172998
660.000172564
670.000171942
680.000171508
690.000171074
700.000170392
710.000169956
720.000169336
730.000168778
740.00016828
750.00016766
760.000167288
770.000166728
780.000166108
790.00016555
800.000164928
810.000164494
820.000163998
830.000163376
840.00016288
850.00016226
860.000161824
870.000161204
880.000160584
890.000160024
900.000159528
910.000159032
920.00015841
930.000157852
940.000157232
950.000156672
960.000156176
970.000155556
980.000155122
990.000154438
1000.00015388
1010.00015332
1020.000152762
1030.000152204
1040.000151582
1050.000151086
1060.000150528
1070.000149906
1080.00014941
1090.00014879
1100.00014823
1110.00014761
1120.000147114
1130.00014643
1140.000145996
1150.000145376
1160.000144816
1170.000144258
1180.0001437
1190.000143078
1200.000142458
1210.000141962
1220.000141402
1230.000140844
1240.000140224
1250.000139664
1260.000139106
1270.000138548
1280.000137988
1290.00013743
1300.00013681
1310.000136312
1320.000135692
1330.000135134
1340.000134512
1350.000134016
1360.000133396
1370.000132836
1380.000132278
1390.00013172
1400.00013116
1410.000130602
1420.000130106
1430.000129484
1440.000128864
1450.000128368
1460.000127808
1470.00012725
1480.000126568
1490.000126132
1500.000125574
1510.000124954
1520.000124456
1530.000123836
1540.000123278
1550.00012278
1560.000122222
1570.000121602
1580.000121104
1590.000120484
1600.000119988
1610.000119428
1620.00011887
1630.000118312
1640.000117752
1650.000117194
1660.000116698
1670.00011614
1680.00011558
1690.000115084
1700.000114526
1710.000113966
1720.000113408
1730.00011285
1740.00011229
1750.000111794
1760.000111236
1770.000110676
1780.000110118
1790.000109622
1800.000109124
1810.000108566
1820.000108008
1830.000107448
1840.00010689
1850.000106394
1860.000105834
1870.000105338
1880.00010478
1890.000104284
1900.000103724
1910.000103228
1920.00010267
1930.000102172
1940.000101614
1950.000101118
1960.00010062
1970.000100062
1980.000099566
1990.000099006
2000.00009851
2010.000098014
2020.000097454
2030.00009702
2040.000096462
2050.000095966
2060.000095468
2070.00009491
2080.000094414
2090.000093916
2100.00009342
2110.000092924
2120.000092428
2130.000091868
2140.000091372
2150.000090876
2160.000090378
2170.000089882
2180.000089386
2190.000088888
2200.000088392
2210.000087958
2220.0000874
2230.000086902
2240.000086406
2250.00008591
2260.000085474
2270.00008504
2280.000084544
2290.000084048
2300.00008355
2310.000083054
2320.000082558
2330.00008206
2340.000081626
2350.00008113
2360.000080634
2370.000080198
2380.000079702
2390.000079268
2400.00007877
2410.000078336
2420.00007784
2430.000077344
2440.000076908
2450.000076474
2460.00007604
2470.000075544
2480.000075046
2490.000074612
2500.000074178
2510.00007368
2520.000073246
2530.000072812
2540.000072316
2550.00007188
2560.000071446
2570.000071012
2580.000070516
2590.00007008
2600.000069646
2610.000069212
2620.000068778
2630.000068342
2640.000067908
2650.000067474
2660.00006704
2670.000066604
2680.00006617
2690.000065736
2700.000065302
2710.000064866
2720.000064494
2730.000064122
2740.000063626
2750.000063252
2760.000062818
2770.000062384
2780.00006195
2790.000061514
2800.00006108
2810.000060708
2820.000060274
2830.000059838
2840.000059466
2850.000059032
2860.00005866
2870.000058224
2880.000057852
2890.000057418
2900.000057046
2910.000056672
2920.000056238
2930.000055866
2940.000055494
2950.000055122
2960.000054686
2970.000054314
2980.000053942
2990.00005357
3000.000053196
3010.000052762
3020.00005239
3030.000052018
3040.000051644
3050.000051272
3060.0000509
3070.000050528
3080.000050156
3090.000049782
3100.000049472
3110.0000491
3120.000048728
3130.000048356
3140.000047982
3150.00004761
3160.0000473
3170.000046928
3180.000046554
3190.000046182
3200.000045872
3210.0000455
3220.00004519
3230.000044816
3240.000044506
3250.000044134
3260.000043824
3270.000043514
3280.00004314
3290.00004283
3300.000042458
3310.000042148
3320.000041838
3330.000041528
3340.000041154
3350.000040844
3360.000040534
3370.000040224
3380.000039914
3390.000039602
3400.000039292
3410.000038982
3420.000038672
3430.000038362
3440.00003805
3450.00003774
3460.00003743
3470.00003712
3480.00003681
3490.000036562
3500.00003625
3510.00003594
3520.000035692
3530.000035382
3540.000035072
3550.000034824
3560.000034512
3570.000034264
3580.000033954
3590.000033706
3600.000033458
3610.000033148
3620.000032898
3630.000032588
3640.00003234
3650.000032092
3660.000031782
3670.000031534
3680.000031284
3690.000031036
3700.000030788
3710.000030478
3720.00003023
3730.000029982
3740.000029734
3750.000029484
3760.000029236
3770.000028988
3780.00002874
3790.000028492
3800.000028306
3810.000028058
3820.000027808
3830.00002756
3840.000027312
3850.000027126
3860.000026878
3870.00002663
3880.000026444
3890.000026194
3900.000025946
3910.00002576
3920.000025512
3930.000025326
3940.00002514
3950.000024892
3960.000024706
3970.000024456
3980.00002427
3990.000024084
4000.000023898
4010.00002365
4020.000023464
4030.000023278
4040.000023092
4050.000022906
4060.000022656
4070.00002247
4080.000022284
4090.000022098
4100.000021912
4110.000021726
4120.00002154
4130.000021354
4140.000021166
4150.000021042
4160.000020856
4170.00002067
4180.000020484
4190.000020298
4200.000020174
4210.000019988
4220.000019802
4230.000019678
4240.00001949
4250.000019304
4260.00001918
4270.000018994
4280.00001887
4290.000018684
4300.00001856
4310.000018374
4320.00001825
4330.000018126
4340.00001794
4350.000017816
4360.000017628
4370.000017504
4380.00001738
4390.000017256
4400.00001707
4410.000016946
4420.000016822
4430.000016698
4440.000016574
4450.00001645
4460.000016264
4470.00001614
4480.000016014
4490.00001589
4500.000015766


OpenFC代码 :


  1. !using["XSLSF"];                //使用命名空间XSLSF
  2. //函数定义,用于计算微分方程组中各方程右端函数值,连分式法对微分方程组积分一步函数pbs1将调用该函数f。
  3. //t为自变量,A,B,C,D,E,F为函数值,dA,dB,dC,dD,dE,dF为右端函数值(即微分方程的值)。
  4. //该函数被调用时将用到参数k1, k2, k4, k11, k16, k17,这6个参数正好是拟合参数,用模块变量传递这6个参数。
  5. f(t,A,B,C,D,E,F,dA,dB,dC,dD,dE,dF::k1, k2, k4, k11, k16, k17)=
  6. {
  7.   dA=56*k1*D-k2*A*B,
  8.   dB=-k2*A*B,
  9.   dC=k2*A*B-k4*C*D-k16*C*E-56*k17*C*F,
  10.   dD=0.002*k11*A- 56*k1*D,
  11.   dE=-k16*C*E,
  12.   dF= k16*C*E-56*k17*C*F
  13. };
  14. //用连分式法对微分方程组进行积分,获得理论值。
  15. //t1,t2为积分的起点和终点。
  16. //h,s为自动变量。
  17. //模块变量:hf为函数f的句柄,要预先获得该句柄;Array为工作数组;step为积分步长;eps为积分精度。
  18. 积分(t1,t2:h,s:hf,Array,step,eps)=
  19. {
  20.     s=ceil[(t2-t1)/step],        //计算积分步数
  21.     h=(t2-t1)/s,                 //重新计算积分步长
  22.     {   pbs1[hf,t1,Array,h,eps], //对微分方程组积分一步
  23.         t1=t1+h                  //积分步长增加
  24.     }.until[abs(t1-t2)<h/2]      //连续积分至t2
  25. };
  26. //目标函数定义,自变量_k,_b为需要优化的参数,需要将这些参数传递给对应的模块变量k,b。
  27. //模块变量:Array为工作数组;数组tEArray存放实验数据(ti,Ei);max为实验数据组数;k,b为优化变量。
  28. 优化(_k1, _k2, _k4, _k11, _k16, _k17:i,s,E,a1,a2,a3,a4,a5,a6,t1,t2:Array,tEArray,max,k1, k2, k4, k11, k16, k17)=
  29. {
  30.   k1=_k1, k2=_k2, k4=_k4, k11=_k11, k16=_k16, k17=_k17,  //传递优化变量,函数f中要用到k1, k2, k4, k11, k16, k17
  31.   Array.setra(0,0,1.25*10^(-3),0,10^(-4),2*10^(-4),0),   //设置积分初值,通过模块变量Array传递,Array是一个数组
  32.   i=1,s=0,t1=0,
  33.   (i<max).while{
  34.     tEArray.getra(i*2,&t2,&E),
  35.     积分(&t1,t2),                    //从t1积分到t2
  36.     Array.getra(0,a1,a2,a3,a4,&a5,a6),  //从数组Array获得t2时的积分值
  37.     s=s+[a5-E]^2,                    //累加理论值与实验值差的平方
  38.     i++
  39.   },
  40.   s
  41. };
  42. 验证(_k1, _k2, _k4, _k11, _k16, _k17:i,s,E,a1,a2,a3,a4,a5,a6,t1,t2:Array,tEArray,max,k1, k2, k4, k11, k16, k17)=
  43. {
  44.   k1=_k1, k2=_k2, k4=_k4, k11=_k11, k16=_k16, k17=_k17,  //传递优化变量,函数f中要用到k1, k2, k4, k11, k16, k17
  45.   printff{"\r\n               t             A模拟值             B模拟值          C模拟值          D模拟值          E模拟值          F模拟值          E实验值\r\n"},
  46.   Array.setra(0,0,1.25*10^(-3),0,10^(-4),2*10^(-4),0),   //设置积分初值,通过模块变量Array传递,Array是一个数组
  47.   i=1,s=0,t1=0,
  48.   (i<max).while{
  49.     tEArray.getra(i*2,&t2,&E),
  50.     积分(&t1,t2),                    //从t1积分到t2
  51.     Array.getra(0,&a1,&a2,&a3,&a4,&a5,&a6),            //从数组Array获得t2时的积分值
  52.     s=s+[a5-E]^2,                    //累加理论值与实验值差的平方
  53.     printff{"{1,r,18.8}{2,r,18.8}{3,r,18.8}{4,r,18.8}{5,r,18.8}{6,r,18.8}{7,r,18.8}{8,r,18.8}\r\n",t1,a1,a2,a3,a4,a5,a6,E},
  54.     i++
  55.   },
  56.   printff{"\r\n目标函数终值={1,r}\r\n\r\n",s}
  57. };
  58. main(:x,xx,g,d,u,v,k,i,t1,t2,t3,t4,t5,t6,t7,_eps:Array,tEArray,max,hf,step,eps)=
  59. {
  60.   hf=HFor("f"),                                    //模块变量hf保存函数f的句柄,预先用函数HFor获得该句柄
  61.   step=0.05,eps=1e-6,                              //积分步长step要合适,积分精度eps越小越精确,用于对微分方程组积分一步函数pbs1
  62.   Array=new[rtoi(real_s),rtoi(6*15)],              //申请工作数组
  63.   max=451,                                         //实验数据组数
  64.   tEArray=new{rtoi(real_s),rtoi(max),rtoi(2),rtoi(EndType), //存放实验数据(ti,Ei)
  65. 0 , 0.0002 ,
  66. 1 , 0.000199566 ,
  67. 2 , 0.000199814 ,
  68. 3 , 0.000199068 ,
  69. ...... //数据略
  70. 447 , 0.00001614 ,
  71. 448 , 0.000016014 ,
  72. 449 , 0.00001589 ,
  73. 450 , 0.000015766
  74.     },
  75.   x=new[rtoi(real_s),rtoi(7)],                     //申请工作数组
  76.   xx=new[rtoi(real_s),rtoi(6),rtoi(7)],            //申请工作数组
  77.   g=new[rtoi(real_s),rtoi(7)],                     //申请工作数组
  78.   _eps=1e-100, d=2,u=1.1,v=0.1,k=100,            //变换d、u、v进一步求解,k为允许的最大迭代次数
  79.   i=jsim[HFor("优化"),d,u,v,x,_eps,k,xx,g],        //求n维极值的单形调优法
  80.   x.getra(0,&t1,&t2,&t3,&t4,&t5,&t6,&t7),          //获得最优参数值及目标终值
  81.   printff{"\r\n实际迭代次数={1,i}, k1={2,r}, k2={3,r}, k4={4,r}, k11={5,r}, k16={6,r}, k17={7,r}, 目标函数终值={8,r}\r\n",i,t1,t2,t3,t4,t5,t6,t7},
  82.   验证(t1,t2,t3,t4,t5,t6),                         //验证计算结果
  83.   delete[Array],delete[tEArray],delete[x],delete[xx],delete[g]
  84. };
复制代码


部分结果:


  1. 实际迭代次数=100, k1=11.572119058286493, k2=20.605987644786079, k4=5.6399027460131057, k11=10.145516619333584, k16=35.565808626819823, k17=9.9756597283905499, 目标函数终值=1.1440703884564055e-009
  2.                t             A模拟值             B模拟值          C模拟值          D模拟值          E模拟值          F模拟值          E实验值
  3.                 1.    9.9455987e-005    1.2474379e-003    2.5529959e-006    3.0729319e-009    1.9999091e-004    9.0845252e-009      1.99566e-004
  4.                 2.    9.8921631e-005    1.2448909e-003    5.0728026e-006    3.0616921e-009    1.9996377e-004    3.6176865e-008      1.99814e-004
  5.                 3.    9.8395292e-005    1.2423627e-003    7.5558911e-006    3.0499714e-009    1.9991885e-004    8.0893664e-008      1.99068e-004
  6.                 4.    9.7876749e-005     1.239853e-003    1.0002646e-005     3.123494e-009    1.9985641e-004    1.4277954e-007      1.99006e-004
  7.                 5.    9.7366051e-005    1.2373614e-003    1.2413381e-005     3.099665e-009    1.9977674e-004    2.2131168e-007      1.98448e-004
  8.                 6.    9.6862995e-005    1.2348878e-003    1.4788347e-005    3.0551383e-009    1.9968011e-004    3.1590477e-007      1.98634e-004
  9.                 7.    9.6367467e-005    1.2324318e-003    1.7127737e-005    2.9752671e-009    1.9956679e-004    4.2591622e-007      1.97704e-004
  10. ... ...
  11.                91.    7.3024114e-005    1.0689567e-003    1.0863441e-004    2.3030431e-009     1.585819e-004    1.0427352e-005      1.59032e-004
  12.                92.    7.2898677e-005    1.0673508e-003    1.0899453e-004      2.29691e-009    1.5796936e-004    1.0406658e-005       1.5841e-004
  13.                93.    7.2775858e-005      1.06575e-003    1.0934911e-004    2.2911529e-009    1.5735718e-004    1.0384815e-005      1.57852e-004
  14.                94.    7.2655673e-005    1.0641543e-003    1.0969835e-004    2.2513477e-009    1.5674542e-004    1.0361888e-005      1.57232e-004
  15.                95.    7.2538029e-005    1.0625636e-003    1.1004248e-004    2.2508112e-009    1.5613411e-004    1.0337937e-005      1.56672e-004
  16.                96.     7.242289e-005    1.0609778e-003    1.1038171e-004    2.3065522e-009    1.5552329e-004    1.0313022e-005      1.56176e-004
  17.                97.    7.2310356e-005    1.0593969e-003    1.1071626e-004    2.2978462e-009    1.5491301e-004    1.0287197e-005      1.55556e-004
  18.                98.    7.2192075e-005    1.0578207e-003     1.110463e-004     1.056091e-008     1.543033e-004    1.0260515e-005      1.55122e-004
  19.                99.    7.2092921e-005    1.0562493e-003    1.1137204e-004    2.2011907e-009     1.536942e-004    1.0233027e-005      1.54438e-004
  20.               100.    7.1987866e-005    1.0546825e-003    1.1169367e-004     2.229601e-009    1.5308574e-004     1.020478e-005       1.5388e-004
  21. ... ...
复制代码
回复 不支持

使用道具 举报

发表于 2009-11-28 18:20:00 | 显示全部楼层 来自 黑龙江哈尔滨
本帖最后由 TBE_Legend 于 2009-11-28 20:08 编辑
第二个问题,将允许的最大迭代次数k=500,运行了约40分钟,终于获得一组最优解:


实际迭代次数=213, k1=9.5111080627706936, k2=18.593155843279298, k4=-0.3629342128423555, k11=9.2785258647078628, k16= ...
wanglu 发表于 2009-11-28 13:23

maple得到的解析解
  1. restart;
  2. ode1:=diff(y(t),t)=k*y(t)*z(t)+0.095*b*z(t);
  3. ode2:=diff(z(t),t)=-b*z(t)-0.222*z(t);
  4. sol:=dsolve({ode1,ode2},{y(t),z(t)},build);
  5. sol[1];sol[2];
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复 不支持

使用道具 举报

 楼主| 发表于 2009-11-28 19:17:42 | 显示全部楼层 来自 山东淄博
maple得到的解析解
restart;
ode1:=diff(y(t),t)=k*y(t)*z(t)+0.095*b*z(t);
ode2:=diff(z(t),t)=-b*z(t)-0.222*z(t);
sol:=dsolve({ode1,ode2},{y(t),z(t)},build);
sol[1];sol[2];

TBE_Legend 发表于 2009-11-28 18:20


非常感谢TBE_Legend!
回复 不支持

使用道具 举报

 楼主| 发表于 2009-11-28 19:51:38 | 显示全部楼层 来自 山东淄博
第一个问题,太奇怪了,根据TBE_Legend给出的解析解,我带入初始值:
t=0.01, y0=2.329101563, z0=5000
求得解析解中的参数c1和c2:
c1=-2.364794921874116
c2=5011.104980662317

然后修改代码:

  1. !using["XSLSF"];                //使用命名空间XSLSF
  2. //函数定义,用于计算微分方程组中各方程右端函数值,连分式法对微分方程组积分一步函数pbs1将调用该函数f。
  3. //t为自变量,y和z为函数值,dy和dz为右端函数值(即微分方程的值)。
  4. //该函数被调用时将用到参数k和b,这2个参数正好是拟合参数,用模块变量传递这2个参数。
  5. f(t,y,z,dy,dz::k,b)=
  6. {
  7.   dy=k*y*z+0.095*b*z,
  8.   dz=-b*z-0.222*z
  9. };
  10. //用连分式法对微分方程组进行积分,获得理论值。
  11. //t1,t2为积分的起点和终点。
  12. //h,s为自动变量。
  13. //模块变量:hf为函数f的句柄,要预先获得该句柄;Array为工作数组;step为积分步长;eps为积分精度。
  14. 积分(t1,t2:h,s:hf,Array,step,eps)=
  15. {
  16.     s=ceil[(t2-t1)/step],        //计算积分步数
  17.     h=(t2-t1)/s,                 //重新计算积分步长
  18.     {   pbs1[hf,t1,Array,h,eps], //对微分方程组积分一步
  19.         t1=t1+h                  //积分步长增加
  20.     }.until[abs(t1-t2)<h/2]      //连续积分至t2
  21. };
  22. //目标函数定义,自变量_k,_b为需要优化的参数,需要将这些参数传递给对应的模块变量k,b。
  23. //模块变量:Array为工作数组;数组tArray存放实验数据ti;数组yArray存放实验数据yi;max为数组tArray和yArray的长度;k,b为优化变量。
  24. 优化(_k,_b:i,s,y,z,yy,t1,t2:Array,tArray,yArray,max,k,b)=
  25. {
  26.   k=_k,b=_b,                         //传递优化变量,函数f中要用到k,b
  27.   Array.setra(0,2.329101563,5000),   //设置积分初值,通过模块变量Array传递,Array是一个数组
  28.   i=1,s=0,t1=0.01,
  29.   (i<max).while{
  30.     tArray.getra(i,&t2), yArray.getra(i,&yy),
  31.     积分(&t1,t2),                    //从t1积分到t2
  32.     Array.getra(0,&y,z),             //从数组Array获得t2时的积分值
  33.     s=s+[y-yy]^2,                    //累加理论值与实验值差的平方
  34.     i++
  35.   },
  36.   s
  37. };
  38. y理论(t:c1,c2,tt,k,b)= c1=-2.364794921874116, c2=5011.104980662317, k=1.4083232846396376e-004, b=-1.4666335917093112e-004,
  39.      tt=500*k*c2*exp[-1/500*(500*b+111)*t]/(500*b+111), {-19/200*[b*exp(tt)]/k+c1}*exp(-tt);
  40. z理论(t:c2,b)= c2=5011.104980662317, b=-1.4666335917093112e-004, c2*exp[-1/500*(500*b+111)*t];
  41. 验证(_k,_b:i,y,z,yy,t1,t2:Array,tArray,yArray,max,k,b)=
  42. {
  43.   k=_k,b=_b,
  44.   printff{"\r\n               t            y实验值            y模拟值         y理论值         z模拟值         z理论值\r\n"},
  45.   Array.setra(0,2.329101563,5000),   //设置积分初值,通过模块变量Array传递,Array是一个数组
  46.   i=1,t1=0.01,
  47.   (i<max).while{
  48.     tArray.getra(i,&t2), yArray.getra(i,&yy),
  49.     积分(&t1,t2),                    //从t1积分到t2
  50.     Array.getra(0,&y,&z),            //从数组Array获得t2时的积分值
  51.     printff{"{1,r,18.8}{2,r,18.8}{3,r,18.8}{4,r,18.8}{5,r,18.8}{6,r,18.8}\r\n",t1,yy,y,y理论(t1),z,z理论(t1)},
  52.     i++
  53.   }
  54. };
  55. main(:x,xx,g,d,u,v,k,i,t1,t2,t3,_eps:Array,tArray,yArray,max,hf,step,eps)=
  56. {
  57.   hf=HFor("f"),                                    //模块变量hf保存函数f的句柄,预先用函数HFor获得该句柄
  58.   step=0.01,eps=1e-6,                              //积分步长step要合适,积分精度eps越小越精确,用于对微分方程组积分一步函数pbs1
  59.   Array=new[rtoi(real_s),rtoi(2*15)],              //申请工作数组
  60.   max=18,                                          //实验数据组数
  61.   tArray=new{rtoi(real_s),rtoi(max),rtoi(EndType), //存放实验数据ti
  62.     0.01,
  63.     0.68,
  64.     1.1,
  65.     1.63,
  66.     2.07,
  67.     2.67,
  68.     3.09,
  69.     3.64,
  70.     4.65,
  71.     5.1,
  72.     5.58,
  73.     6.11,
  74.     6.63,
  75.     7.06,
  76.     7.62,
  77.     8.66,
  78.     9.04,
  79.     9.63
  80.     },
  81.   yArray=new{rtoi(real_s),rtoi(max),rtoi(EndType), //存放实验数据yi
  82.     2.329101563,
  83.     3.851292783,
  84.     4.50093936,
  85.     6.749172247,
  86.     9.112062872,
  87.     9.691657366,
  88.     11.16928013,
  89.     10.91451823,
  90.     16.44279204,
  91.     18.29615885,
  92.     21.63989025,
  93.     25.78611421,
  94.     26.34282633,
  95.     26.50581287,
  96.     27.63951823,
  97.     35.02757626,
  98.     35.5562035,
  99.     36.10393415
  100.     },
  101.   x=new[rtoi(real_s),rtoi(3)],                     //申请工作数组
  102.   xx=new[rtoi(real_s),rtoi(2),rtoi(3)],            //申请工作数组
  103.   g=new[rtoi(real_s),rtoi(3)],                     //申请工作数组
  104.   _eps=1e-100, d=550,u=1.6,v=0.4,k=500,            //变换d、u、v进一步求解,k为允许的最大迭代次数
  105.   i=jsim[HFor("优化"),d,u,v,x,_eps,k,xx,g],        //求n维极值的单形调优法
  106.   x.getra(0,&t1,&t2,&t3),                          //获得最优参数值及目标终值
  107.   printff{"\r\n实际迭代次数={1,i}, k={2,r}, b={3,r}, 目标函数终值={4,r}\r\n",i,t1,t2,t3},
  108.   验证(t1,t2),                                     //验证计算结果
  109.   delete[Array],delete[tArray],delete[yArray],delete[x],delete[xx],delete[g]
  110. };
复制代码


结果:


  1. 实际迭代次数=118, k=1.4083028531001023e-004, b=-1.4651243025576023e-004, 目标函数终值=24.291246604109279
  2.                t            y实验值            y模拟值         y理论值         z模拟值         z理论值
  3.               0.68         3.8512928          3.556226   -5.4436048e-002         4309.3888         4309.3892
  4.                1.1         4.5009394         4.5089213   -9.6698167e-002         3925.9863          3925.987
  5.               1.63         6.7491722         5.9133543       -0.15899987          3490.466         3490.4669
  6.               2.07         9.1120629         7.2439206       -0.21802501         3165.8441         3165.8451
  7.               2.67         9.6916574          9.277603       -0.30824134         2771.2754         2771.2765
  8.               3.09          11.16928         10.832718       -0.37722813         2524.7175         2524.7187
  9.               3.64         10.914518         13.002374       -0.47347691         2234.7062         2234.7074
  10.               4.65         16.442792         17.253471       -0.66206191         1786.1058         1786.1071
  11.                5.1         18.296159         19.204669       -0.74862018         1616.4036         1616.4048
  12.               5.58          21.63989         21.291253       -0.84118462         1453.1215         1453.1227
  13.               6.11         25.786114          23.57465       -0.94248014         1291.9228          1291.924
  14.               6.63         26.342826         25.768943         -1.039823         1151.1573         1151.1585
  15.               7.06         26.505813         27.533738        -1.1181126         1046.4158         1046.4169
  16.               7.62         27.639518         29.747617        -1.2163246         924.16271         924.16377
  17.               8.66         35.027576         33.557029        -1.3853178         733.74424          733.7452
  18.               9.04         35.556204          34.84099         -1.442277         674.42212         674.42303
  19.               9.63         36.103934         36.714599        -1.5253943         591.67804          591.6789
复制代码


z模拟值   与  z理论值 很接近。但 y实验值  接近  y模拟值  ,与  y理论值  相差却如此大?难道所解c1不对?

大家帮忙解一下c1,谢谢!
回复 不支持

使用道具 举报

 楼主| 发表于 2009-11-28 19:53:46 | 显示全部楼层 来自 山东淄博
实际迭代次数=118, k=1.4083028531001023e-004, b=-1.4651243025576023e-004, 目标函数终值=24.291246604109279

               t            y实验值            y模拟值         y理论值         z模拟值         z理论值
              0.68         3.8512928          3.556226   -5.4436048e-002         4309.3888         4309.3892
               1.1         4.5009394         4.5089213   -9.6698167e-002         3925.9863          3925.987
              1.63         6.7491722         5.9133543       -0.15899987          3490.466         3490.4669
              2.07         9.1120629         7.2439206       -0.21802501         3165.8441         3165.8451
              2.67         9.6916574          9.277603       -0.30824134         2771.2754         2771.2765
              3.09          11.16928         10.832718       -0.37722813         2524.7175         2524.7187
              3.64         10.914518         13.002374       -0.47347691         2234.7062         2234.7074
              4.65         16.442792         17.253471       -0.66206191         1786.1058         1786.1071
               5.1         18.296159         19.204669       -0.74862018         1616.4036         1616.4048
              5.58          21.63989         21.291253       -0.84118462         1453.1215         1453.1227
              6.11         25.786114          23.57465       -0.94248014         1291.9228          1291.924
              6.63         26.342826         25.768943         -1.039823         1151.1573         1151.1585
              7.06         26.505813         27.533738        -1.1181126         1046.4158         1046.4169
              7.62         27.639518         29.747617        -1.2163246         924.16271         924.16377
              8.66         35.027576         33.557029        -1.3853178         733.74424          733.7452
              9.04         35.556204          34.84099         -1.442277         674.42212         674.42303
              9.63         36.103934         36.714599        -1.5253943         591.67804          591.6789
回复 不支持

使用道具 举报

 楼主| 发表于 2009-11-28 20:04:08 | 显示全部楼层 来自 山东淄博
补充:求解c1和c2时,k=1.4083232846396376e-004, b=-1.4666335917093112e-004,取优化解。
回复 不支持

使用道具 举报

 楼主| 发表于 2009-11-28 20:13:50 | 显示全部楼层 来自 山东淄博
似乎用这组解求c1和c2,效果更好:
k=1.4083028531001023e-004, b=-1.4651243025576023e-004
回复 不支持

使用道具 举报

 楼主| 发表于 2009-11-28 20:48:36 | 显示全部楼层 来自 山东淄博
是我自己解错了,求解c1时忘了y0=2.329101563,重新求得c1=53.3071289062511

仅给出结果,还是比较理想的。

实际迭代次数=118, k=1.4083028531001023e-004, b=-1.4651243025576023e-004, 目标函数终值=24.291246604109279

               t            y实验值            y模拟值         y理论值         z模拟值          z理论值
              0.68         3.8512928          3.556226         3.5562263      4309.3887631      4309.3887566
               1.1         4.5009394         4.5089213         4.5089218      3925.9863184      3925.9863125
              1.63         6.7491722         5.9133543         5.9133549      3490.4660381      3490.4660328
              2.07         9.1120629         7.2439206         7.2439213      3165.8441308      3165.8441261
              2.67         9.6916574          9.277603         9.2776039      2771.2753669      2771.2753627
              3.09          11.16928         10.832718         10.832719      2524.7174885      2524.7174847
              3.64         10.914518         13.002374         13.002375      2234.7061716      2234.7061682
              4.65         16.442792         17.253471         17.253473      1786.1058194      1786.1058168
               5.1         18.296159         19.204669          19.20467      1616.4035666      1616.4035641
              5.58          21.63989         21.291253         21.291255      1453.1214789      1453.1214767
              6.11         25.786114          23.57465         23.574653      1291.9227832      1291.9227813
              6.63         26.342826         25.768943         25.768945      1151.1573467      1151.1573449
              7.06         26.505813         27.533738          27.53374      1046.4158252      1046.4158236
              7.62         27.639518         29.747617          29.74762      924.16271166      924.16271027
              8.66         35.027576         33.557029         33.557032      733.74424214      733.74424103
              9.04         35.556204          34.84099         34.840993      674.42211527      674.42211425
              9.63         36.103934         36.714599         36.714603       591.6780432       591.6780423
回复 不支持

使用道具 举报

发表于 2009-11-29 16:20:52 | 显示全部楼层 来自 黑龙江哈尔滨
我很喜欢做这样的题目,第一个很容易,即使不用解析解,也能很容易地求出来。我比较关心的是第二个,mmtc算了半天,我给关了,太慢了。

但是我对你的结果也表示怀疑,因为在优化的过程中,要解ode,很可能遇到ode在某个时间点以后的解就不存在了(优化过程中mmtc的结果有这样的提示)。我对mmtc的ode的算法还是比较有信心的。

所以,我希望能够找一个简单点的(或有准确解答的),但是题目类型完全一样。或许可以把这个方程的一些系数改改什么的。
回复 不支持

使用道具 举报

 楼主| 发表于 2009-11-29 19:50:57 | 显示全部楼层 来自 山东淄博
我很喜欢做这样的题目,第一个很容易,即使不用解析解,也能很容易地求出来。我比较关心的是第二个,mmtc算了半天,我给关了,太慢了。

但是我对你的结果也表示怀疑,因为在优化的过程中,要解ode,很可能遇到ode ...
TBE_Legend 发表于 2009-11-29 16:20


第二个运算量确实大了,Forcal运行约40分钟,才给出了一组解,我估计也是局部最优解。我用的“求n维极值的单形调优法”需要尝试求解,但运行时间长就难以尝试了。

如果对结果表示怀疑,可以验证一下:用我得出的最优解带入微分方程,然后求模拟值,并与实验值比较,给出实验值与模拟值差的平方和,我就是想请大家验证一下这个结果,若全部给出验证数据,就更好了。

k1=9.5111080627706936, k2=18.593155843279298, k4=-0.3629342128423555, k11=9.2785258647078628, k16=42.278370674583023, k17=23.125269056444612

我还在想,优化结果不理想,是不是也有可能是公式模型不太合理?例如下面这个例子:http://www.ilovematlab.cn/viewthread.php?tid=50048

数学模型:
dA/dt=-k1*A*B+k_1*C*D
dB/dt=-k1*A*B+k-1*C*D-k2*C*B+k-2*E*D-k3*E*B+k-3*F*D
dC/dt=k1*A*B-k_1*C*D-k2*C*B+k_2*E*D
dD/dt=k1*A*B-k_1*C*D+k2*C*B-k_2*E*D+k3*E*B-k_3*F*D
dE/dt=k2*C*B-k_2*E*D-k3*E*B+k_3*F*D
dF/dt=k3*E*B-k-3*F*D

拟合参数:k1,k2,k3,k_1,k_2,k_3
实验数据(
ti; Ai, Bi, Ci, Di, Ei, Fi
0 0.3999 15.5780 0 0 0 0
5.3833 0.0346 11.2058 0.1986 4.3713 0.0817 0.0850
9.1833 0.0249 11.1680 0.1597 4.4097 0.1607 0.0546
12.9833 0.0261 11.0306 0.1198 4.5472 0.1639 0.0901
16.7667 0.0366 10.6350 0.0322 4.9419 1.1042 0.2269
20.5667 0.0329 10.5443 0.0350 5.0329 0.0643 0.2677
23.4167 0.0431 10.6538 0.0533 4.9241 0.0565 0.2470

此例Forcal拟合结果很不好,若有兴趣可以试一下?

有准确解答的例子似乎不好找,都是自己解决不了的问题才放到网上来。

能改方程的系数也是个好办法,似乎最终就是找一个最精确的公式吗。
回复 不支持

使用道具 举报

 楼主| 发表于 2009-11-29 20:12:26 | 显示全部楼层 来自 山东淄博
上面的例子在本论坛也有讨论:http://forum.simwe.com/thread-884975-1-2.html
回复 不支持

使用道具 举报

发表于 2009-12-2 10:26:14 | 显示全部楼层 来自 江苏南京
微分方程组参数拟合问题在Matlab里如何求解?Forcal是否能求解更为复杂的微分方程组?比如:
f1(t)/dt=A1(f2(t)/dt,t)
f2(t)/dt=A2(f1(t)/t,f2(t),t)
...
即在微分方程组内含有变量的导数,对于这种方程组的参数拟合如何进行?
回复 不支持

使用道具 举报

 楼主| 发表于 2009-12-2 12:36:50 | 显示全部楼层 来自 山东淄博
微分方程组参数拟合问题在Matlab里如何求解?Forcal是否能求解更为复杂的微分方程组?比如:
f1(t)/dt=A1(f2(t)/dt,t)
f2(t)/dt=A2(f1(t)/t,f2(t),t)
...
即在微分方程组内含有变量的导数,对于这种方程组的参数 ...
napler821127 发表于 2009-12-2 10:26


对应这种情况,就再嵌套一层解非线性方程组即可。
把f2(t)/dt和f2(t)/dt当成求解变量。
如果能得到f2(t)/dt和f2(t)/dt的解析表达式就不用解方程组了。
回复 不支持

使用道具 举报

发表于 2009-12-2 15:36:39 | 显示全部楼层 来自 江苏南京
Forcal程序对微分方程组参数拟合的理论基础是什么?能否给几篇参考文献看看?谢了?
如果想用MATLAB进行参数拟合该如何处理呢?
回复 不支持

使用道具 举报

 楼主| 发表于 2009-12-2 16:32:34 | 显示全部楼层 来自 山东淄博
Forcal程序对微分方程组参数拟合的理论基础是什么?能否给几篇参考文献看看?谢了?
如果想用MATLAB进行参数拟合该如何处理呢?
napler821127 发表于 2009-12-2 15:36

我还真没有考虑过理论基础这个问题,你看我这样回答能否满足你的要求:
《C常用算法程序集》第二版,徐士良主编,清华大学出版社
这本书中有很多算法,我用Forcal封装了,算法怎样实现的,有些我不太懂,但接口我能看明白,并已转换成了Forcal函数。
“微分方程组参数拟合”我是这样实现的:拟合函数采用“求n维极值的单形调优法”,其中目标函数定义中要调用“积分一步的连分式法”(也可以采用其他积分方法)对微分方程进行积分,每次积分前,拟合参数通过Forcal的模块变量传递给积分函数。如果“微分方程组内含有变量的导数”,我就考虑在微分方程组定义中解解非线性方程组(把f2(t)/dt和f2(t)/dt当成求解变量),如果解方程组时还有复杂计算,依次类推嵌套实现即可。Forcal函数没有任何限制,不会阻碍你使用任何东西。程序虽越来越复杂,但不会显著降低Forcal的效率。
至于“求n维极值的单形调优法”等算法怎样实现的,因我没有《C常用算法程序集》电子版,故不好给你提供资料。但可以从以下站点下载到源代码:http://xoomer.virgilio.it/forcal/xiazai/forcal9/forcal9code.rar
你可以找一下《C常用算法程序集》这本书,有详细的说明。
我不知道MATLAB如何解此类问题,等待MATLAB高手解答。
回复 不支持

使用道具 举报

发表于 2009-12-2 20:14:16 | 显示全部楼层 来自 浙江杭州
本帖最后由 messenger 于 2009-12-3 18:42 编辑


Matlab求解这种问题至少有4种方法

1、用ODE求解器+优化工具箱。但这种方法并不完善,例如像TBE_Legend说前面说的那样,ODE方程无解。

2、用Simulink Design Optimization工具箱。

3、用TOMLAB/PROPT工具箱。

4、用System Identification工具箱。

后三种方法的算法与第1种方法的算法本质上应该相同,只是集成了一下,所以其各部份的协同工作效果较好。



我还真没有考虑过理论基础这个问题,你看我这样回答能否满足你的要求:
《C常用算法程序集》第二版,徐士良主编,清华大学出版社
这本书中有很多算法,我用Forcal封装了,算法怎样实现的,有些我不太懂,但接口我能看明白,并已转换成了Forcal函数。
“微分方程组参数拟合”我是这样实现的:拟合函数采用“求n维极值的单形调优法”,其中目标函数定义中要调用“积分一步的连分式法”(也可以采用其他积分方法)对微分方程进行积分,每次积分前,拟合参数通过Forcal的模块变量传递给积分函数。如果“微分方程组内含有变量的导数”,我就考虑在微分方程组定义中解解非线性方程组(把f2(t)/dt和f2(t)/dt当成求解变量),如果解方程组时还有复杂计算,依次类推嵌套实现即可。Forcal函数没有任何限制,不会阻碍你使用任何东西。程序虽越来越复杂,但不会显著降低Forcal的效率。
至于“求n维极值的单形调优法”等算法怎样实现的,因我没有《C常用算法程序集》电子版,故不好给你提供资料。但可以从以下站点下载到源代码:http://xoomer.virgilio.it/forcal/xiazai/forcal9/forcal9code.rar
你可以找一下《C常用算法程序集》这本书,有详细的说明。
我不知道MATLAB如何解此类问题,等待MATLAB高手解答。
wanglu 发表于 2009-12-2 16:32
回复 不支持

使用道具 举报

发表于 2009-12-2 21:28:32 | 显示全部楼层 来自 黑龙江哈尔滨
Matlab求解这种问题至少有4种方法

1、用ODE求解器+优化工具箱。但这种方法并不完善,例如像TBE_Legend说前面说的那样,ODE方程无解。
dsfsf
2、用Simulink Design Optimization工具箱。

3、用TOMLAB/PROPT工具 ...
messenger 发表于 2009-12-2 20:14


我不会matlab,只用过一点点,但我感觉matlab解决这两位函数调用函数的问题不是很好,反正我是不会,我也知道思路是rockwoods写的那几个积分方程求解思路,希望有matlab老用户能给出这个问题的解决方法,我在用mmtc解,但目前效果不理想,我已经向FreddyMusic求助,希望他能帮忙找到问题的解决办法,到时我会贴出结果来。

simulink作函数拟合本版也有人发过一个,好像,忘记了。不知道哪位知道连接?

最后两个工具箱没听说过。
回复 不支持

使用道具 举报

 楼主| 发表于 2009-12-3 18:14:27 | 显示全部楼层 来自 山东淄博
感谢messenger 和TBE_Legend 的说明,期待matlab和mmtc的结果。
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-5-4 23:33 , Processed in 0.092213 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表