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

[1stOpt] 用1stopt算非线性方程组,为什么同样一问题得到不同的解?

[复制链接]
发表于 2007-8-1 00:03:17 | 显示全部楼层 |阅读模式 来自 江苏南京
解非线性方程组后,为什么同样一个方程组,而且求解范围也一样,运行一次得到一个不一样的解,相差还很大。这样得到的解还有什么可信度啊?困惑
发表于 2007-8-1 09:20:30 | 显示全部楼层 来自 北京
Simdroid开发平台
对于类似周期性的函数,自然会有多个解。

最好把方程组贴出来才好发现问题
回复 不支持

使用道具 举报

 楼主| 发表于 2007-8-1 10:20:38 | 显示全部楼层 来自 江苏南京
问题贴出来如下:
Title "lq81";
Parameters x1=0.1 [0,0.2],x2=0.1 [0,0.2],x3=0.1 [0,0.2],x4=0.1 [0,0.2],x5=0.01 [0,0.03],x6=0.5 [0,1];
Function x2+x3+x5=1;
x1+x4+2*x5=0.72 ;
x2+2*x3+x4-2*x6=0.66  ;
x4*x5/x2*x4^3=1.825*10^(-6) ;
x1*x3/x2*x4=1.2667  ;
21*x1-88*x2-359*x3-215*x4-34*x5+84*x6=-118;
====== 结果 ======

迭代数: 41
计算用时(时:分:秒:毫秒): 00:00:06:31
计算中止原因: 达到收敛判定标准
优化算法: 麦夸特法(Levenberg-Marquardt) + 通用全局优化法
函数表达式 1: x2+x3+x5-(1)
         2: x1+x4+2*x5-(0.72)
         3: x2+2*x3+x4-2*x6-(0.66)
         4: x4*x5/x2*x4^3-(1.825*10^(-6))
         5: x1*x3/x2*x4-(1.2667)
         6: 21*x1-88*x2-359*x3-215*x4-34*x5+84*x6-(-118)
目标函数值: 2.08024303530524
x1: 0.0697853486053646
x2: 0.000441758474335074
x3: 0.180584732978836
x4: 0.199998811707658
x5: 0.00878085214644671
x6: 0.0505844511342077

====== 计算结束 ======
====== 结果 ======

迭代数: 54
计算用时(时:分:秒:毫秒): 00:00:07:172
计算中止原因: 达到收敛判定标准
优化算法: 麦夸特法(Levenberg-Marquardt) + 通用全局优化法
函数表达式 1: x2+x3+x5-(1)
         2: x1+x4+2*x5-(0.72)
         3: x2+2*x3+x4-2*x6-(0.66)
         4: x4*x5/x2*x4^3-(1.825*10^(-6))
         5: x1*x3/x2*x4-(1.2667)
         6: 21*x1-88*x2-359*x3-215*x4-34*x5+84*x6-(-118)
目标函数值: 2.08024345264649
x1: 0.0120924525195733
x2: 0.153499782388099
x3: 0.180586891793774
x4: 0.199999887103821
x5: 0.0281127873575315
x6: 0.0505858083993123

====== 计算结束 ======
反正每次运行的结果都布一样,而且相差很多,都不知哪个是合理的结果了,请问版主应该如何确定计算结果的准确性啊?
回复 不支持

使用道具 举报

 楼主| 发表于 2007-8-1 10:22:25 | 显示全部楼层 来自 江苏南京
用matlab算是不是会好一点?
回复 不支持

使用道具 举报

发表于 2007-8-1 10:34:34 | 显示全部楼层 来自 北京
试了一下,用你的代码,每次都可得一稳定结果:

目标函数值: 1.89127014860811
x1: 0.199999999966627
x2: 0.0723607027302667
x3: 0.199999999616132
x4: 0.2
x5: 0.03
x6: 8.58061852164981E-17

注意上面的目标函数并不等于0,也即在你的参数限制范围内,不存在实根。如果将范围限制去掉,可得唯一一组根:
目标函数值: 9.25818355229842E-24
x1: -1.16985468376932
x2: 2.3416227598682
x3: -1.34162309484511
x4: 1.88985401374888
x5: 3.35015146047298E-7
x6: 0.444115291960558
回复 不支持

使用道具 举报

 楼主| 发表于 2007-8-1 12:38:47 | 显示全部楼层 来自 江苏南京
那我的预期结果是非负的啊,得到负数显然是不合理的,这是不是说明我的这个方程组本身存在问题?
回复 不支持

使用道具 举报

发表于 2007-8-1 15:03:03 | 显示全部楼层 来自 北京
如果均要非负,下面结果应是最好的了:

目标函数        0.105869
x1        0.000000
x2        0.000000
x3        0.288762
x4        0.000000
x5        0.421638
x6        0.000000
回复 不支持

使用道具 举报

发表于 2007-8-1 18:28:30 | 显示全部楼层 来自 江苏盐城
s版的水准模拟彩票该很准~~
回复 不支持

使用道具 举报

 楼主| 发表于 2007-8-1 19:45:56 | 显示全部楼层 来自 江苏南京
楼上的能不能解释一下啊,我看大家用的软件都是网上下的吧
回复 不支持

使用道具 举报

发表于 2007-8-1 20:45:19 | 显示全部楼层 来自 江苏盐城

回复 #9 bingren007 的帖子

我说的s版是指shamohu版主啊,呵呵
sorry,跑题了~~
回复 不支持

使用道具 举报

发表于 2009-1-22 23:34:31 | 显示全部楼层 来自 宁夏银川
目标函数值: 0.00375794675767896
x1: -0.787258010244071
x2: 0.00778657608456651
x3: 0.207676896405498
x4: -0.0603274536391072
x5: 0.784376985978284
回复 不支持

使用道具 举报

发表于 2009-2-4 22:17:47 | 显示全部楼层 来自 湖南长沙

1stopt解方程组的效率

一。
首先看官方的例题。

用mathematica6验证这些解,发现它们的精确性真是出奇的低。

二。
再来看1楼提出的问题。
在mathematica6中解之,得到:
{{x6 -> -51.3958 - 50.5334 I, x1 -> -251.027 - 244.297 I,
  x3 -> -10.2371 - 10.2798 I, x2 -> -114.29 - 111.854 I,
  x5 -> 125.528+ 122.134 I,
  x4 -> -0.0282072 + 0.028166 I}, {x6 -> -51.3958 + 50.5334 I,
  x1 -> -251.027 + 244.297 I, x3 -> -10.2371 + 10.2798 I,
  x2 -> -114.29 + 111.854 I, x5 -> 125.528- 122.134 I,
  x4 -> -0.0282072 - 0.028166 I}, {x6 -> 0.208112- 0.00491165 I,
  x1 -> -1.59533 - 0.0291827 I, x3 -> 0.206126- 0.00830168 I,
  x2 -> -0.00132858 - 0.0021321 I, x5 -> 0.795203+ 0.0104338 I,
  x4 -> 0.00493131+ 0.00831518 I}, {x6 -> 0.208112+ 0.00491165 I,
  x1 -> -1.59533 + 0.0291827 I, x3 -> 0.206126+ 0.00830168 I,
  x2 -> -0.00132858 + 0.0021321 I, x5 -> 0.795203- 0.0104338 I,
  x4 -> 0.00493131- 0.00831518 I}, {x6 -> 0.216934, x1 -> -1.54301,
  x3 -> 0.22091, x2 -> 0.00265309, x5 -> 0.776437,
  x4 -> -0.00985919}, {x6 -> 0.426439, x1 -> -1.55213, x3 -> -1.10879,
   x2 -> 2.10879, x5 -> 1.0454*10^-6,
  x4 -> 1.55213}, {x6 -> 0.581879- 0.0375154 I,
  x1 -> 0.620815- 0.524452 I, x3 -> 0.831693- 0.468351 I,
  x2 -> 0.168309+ 0.468353 I, x5 -> -1.98513*10^-6 - 2.45181*10^-6 I,
  x4 -> -0.620809 + 0.524457 I}, {x6 -> 0.581879+ 0.0375154 I,
  x1 -> 0.620815+ 0.524452 I, x3 -> 0.831693+ 0.468351 I,
  x2 -> 0.168309- 0.468353 I, x5 -> -1.98513*10^-6 + 2.45181*10^-6 I,
  x4 -> -0.620809 - 0.524457 I}, {x6 -> 50.2275- 50.5335 I,
  x1 -> 240.183- 244.297 I, x3 -> 10.3365- 10.28 I,
  x2 -> 110.769- 111.855 I, x5 -> -120.106 + 122.135 I,
  x4 -> 0.0282074+ 0.0282568 I}, {x6 -> 50.2275+ 50.5335 I,
  x1 -> 240.183+ 244.297 I, x3 -> 10.3365+ 10.28 I,
  x2 -> 110.769+ 111.855 I, x5 -> -120.106 - 122.135 I,
  x4 -> 0.0282074- 0.0282568 I}}
共有九组解。其精确度是远比1stopt要高。

本帖子中包含更多资源

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

×
回复 不支持

使用道具 举报

发表于 2009-2-5 09:30:47 | 显示全部楼层 来自 北京海淀
原帖由 mathcd 于 2009-2-4 22:17 发表
...用mathematica6验证这些解,发现它们的精确性真是出奇的低。
. ...

1:你再用其它软件验证一下,如Excel。
2:论坛是学习交流之处,每个软件都有自己的特点和正真了解它的高手,因此建议别轻易对某软件下结论,如想下结论,请三思而后行,首先确信自己正确并没有低级错误,其次确信对该软件确实掌握了。
回复 不支持

使用道具 举报

发表于 2009-2-5 10:26:38 | 显示全部楼层 来自 湖南长沙

回复

每一种软件都有自己的特点。全然掌握任何一种软件的全部效能也不容易。所以,在每一次学习的过程当中,都应该将各种软件就相同问题的解进行比较,比较其精确性,和其他指标。在12楼,我将一个1stopt官方的解代人官方提供的题中,发现原题个方程左右两边之间的数值的差距实在太大了。
再者,
从1stopt本身而言。我用该软件的1.5版计算了下面这道题,
Parameter x1[0,], x2[0,];
Minimum ;
Function x1-x2+sqrt(6*x1+0.25)+0.5;
         x1+x2-6-(x1-x2+sqrt(6*x1+0.25)+0.5)<=0;
         3*x1+x2*(x1-x2+sqrt(6*x1+0.25)+0.5)-12<=0;
         x1-2*x2/sin(x1-x2+sqrt(6*x1+0.25)+0.5)-2<=0;
发现:
1.在不更换算法的情况下,每一次执行的结果都有很大的差异,似乎不是精确度的问题。
2.在更换算法的情况下,每一次执行的结果也有很大的差异。
另外,若计算下面这题:
Parameter x1[0,], x2[0,];
Minimum ;
Function x1-x2-sqrt(6*x1+0.25)+0.5;
         x1+x2-6-(x1-x2-sqrt(6*x1+0.25)+0.5)<=0;
         3*x1+x2*(x1-x2-sqrt(6*x1+0.25)+0.5)-12<=0;
         x1-2*x2/sin(x1-x2-sqrt(6*x1+0.25)+0.5)-2<=0;
则,
1.在不更换算法的情况下,每一次执行的结果只有很小的差异,似乎是精确度的问题。
2.在更换算法的情况下,每一次执行的结果也只有很小的差异。当然,有时候也会出现较大的并非精确度的差异。当多执行几次后,或有一个较稳定的解。例如,下面的解:
迭代数: 89
计算用时(时:分:秒:毫秒): 00:00:00:110
计算中止原因: 达到收敛判定标准
优化算法: 改进差分进化算法
函数表达式: x1-x2-sqrt(6*x1+0.25)+0.5
目标函数值(最小): -1.56247620437011
x1: 0.625015378171211
x2: 0.687468515417526

约束函数
   1: x1+x2-6-(x1-x2-sqrt(6*x1+0.25)+0.5)-(0) = -3.125039902
   2: 3*x1+x2*(x1-x2-sqrt(6*x1+0.25)+0.5)-12-(0) = -11.19910706
   3: x1-2*x2/sin(x1-x2-sqrt(6*x1+0.25)+0.5)-2-(0) = 0
是非常稳定的。而更换算法后,还可以得到另一个较稳定解:
迭代数: 98
计算用时(时:分:秒:毫秒): 00:00:00:297
计算中止原因: 达到收敛判定标准
优化算法: 标准简面体爬山法 + 通用全局优化法
函数表达式: x1-x2-sqrt(6*x1+0.25)+0.5
目标函数值(最小): -3.16666666666667
x1: 0.33333333611959
x2: 2.49999999721374

约束函数
   1: x1+x2-6-(x1-x2-sqrt(6*x1+0.25)+0.5)-(0) = 0
   2: 3*x1+x2*(x1-x2-sqrt(6*x1+0.25)+0.5)-12-(0) = -18.91666665
   3: x1-2*x2/sin(x1-x2-sqrt(6*x1+0.25)+0.5)-2-(0) = -201.0972061
注:这个解是接近于lingo11给出的解答的。
总之,这些情况都可以说明1stopt是有待改进的。它的不同版本之间的解的差异,很多时候也不是精确度的问题。这将导致只有下一个版本才能正确计算的结果。
匆匆答过,有思量不周处,请海涵。
回复 不支持

使用道具 举报

发表于 2009-2-5 10:42:15 | 显示全部楼层 来自 北京海淀
原帖由 mathcd 于 2009-2-5 10:26 发表
在12楼,我将一个1stopt官方的解代人官方提供的题中,发现原题个方程左右两边之间的数值的差距实在太大了。
...

1:化点时间用其它软件验证一下再出结论不迟。
2:就这道方程组,你用Mathematic求解一下,看其数值解是多少?
回复 不支持

使用道具 举报

发表于 2009-2-5 10:47:39 | 显示全部楼层 来自 宁夏银川
1stopt确实存在,需要多运行几次,并在不同方法中比较,以此来确定最优化的解答!
回复 不支持

使用道具 举报

发表于 2009-2-5 11:20:21 | 显示全部楼层 来自 湖南长沙

回复15楼

“就这道方程组,你用Mathematic求解一下,看其数值解是多少?”
答曰:我用Mathematic6 重新算了一次,结果如下:
{{x6 -> -48.1139 - 47.2277 I, x1 -> -170.472 - 167.061 I,
  x3 -> -10.9344 - 10.9624 I, x2 -> -73.674 - 72.5555 I,
  x5 -> 85.6084+ 83.5179 I,
  x4 -> -0.0250907 + 0.0250316 I}, {x6 -> -48.1139 + 47.2277 I,
  x1 -> -170.472 + 167.061 I, x3 -> -10.9344 + 10.9624 I,
  x2 -> -73.674 + 72.5555 I, x5 -> 85.6084- 83.5179 I,
  x4 -> -0.0250907 - 0.0250316 I}, {x6 -> -0.184006 - 0.0029435 I,
  x1 -> -0.994713 - 0.0172337 I, x3 -> 0.144597- 0.00532768 I,
  x2 -> -0.000371495 - 0.000603327 I, x5 -> 0.855774+ 0.00593101 I,
  x4 -> 0.00316478+ 0.00537169 I}, {x6 -> -0.184006 + 0.0029435 I,
  x1 -> -0.994713 + 0.0172337 I, x3 -> 0.144597+ 0.00532768 I,
  x2 -> -0.000371495 + 0.000603327 I, x5 -> 0.855774- 0.00593101 I,
  x4 -> 0.00316478- 0.00537169 I}, {x6 -> -0.178775, x1 -> -0.964157,
  x3 -> 0.154017, x2 -> 0.000741569, x5 -> 0.845241,
  x4 -> -0.0063257}, {x6 -> 0.266693- 0.0483024 I,
  x1 -> 1.15184+ 0.63204 I, x3 -> 0.625224+ 0.535445 I,
  x2 -> 0.374776- 0.535448 I, x5 -> 4.62128*10^-7 + 3.44252*10^-6 I,
  x4 -> -0.431836 - 0.632046 I}, {x6 -> 0.266693+ 0.0483024 I,
  x1 -> 1.15184- 0.63204 I, x3 -> 0.625224- 0.535445 I,
  x2 -> 0.374776+ 0.535448 I, x5 -> 4.62128*10^-7 - 3.44252*10^-6 I,
  x4 -> -0.431836 + 0.632046 I}, {x6 -> 0.444115, x1 -> -1.16986,
  x3 -> -1.34162, x2 -> 2.34162, x5 -> 4.07012*10^-7,
  x4 -> 1.88985}, {x6 -> 46.7897- 47.2273 I, x1 -> 165.108- 167.06 I,
  x3 -> 11.0076- 10.9624 I, x2 -> 72.1992- 72.5548 I,
  x5 -> -82.2068 + 83.5172 I,
  x4 -> 0.0250909+ 0.0251594 I}, {x6 -> 46.7897+ 47.2273 I,
  x1 -> 165.108+ 167.06 I, x3 -> 11.0076+ 10.9624 I,
  x2 -> 72.1992+ 72.5548 I, x5 -> -82.2068 - 83.5172 I,
  x4 -> 0.0250909- 0.0251594 I}}
然后用maple12又算了一次,结果如下:
{x1 = -1.16985468376146144950, x2 = 2.34162275980252670690, x3 = -1.34162309481946862400, x4 = 1.88985401372757761540, x5 = 3.35016941917057531650*10^(-7), x6 = .44411529194558353716}, {x1 = 165.10846228962626049000-167.05964262318128978000*I, x2 = 72.19919728538481004400-72.55480420528729678200*I, x3 = 11.00757931178830075000-10.96243741636170011800*I, x4 = 0.2509090471996109304e-1+0.2515937988329597960e-1*I, x5 = -82.20677659717311079400+83.51724162164899690000*I, x6 = 46.78972340684068631800-47.22725982906370051900*I}, {x1 = -.99471292930815005917-0.1723370525199235714e-1*I, x2 = -0.37149454015669175e-3-0.60332687785127258e-3*I, x3 = .14459742207767458972-0.532767938094678314e-2*I, x4 = 0.316478438318585512e-2+0.537169273439624571e-2*I, x5 = .85577407246248210203+0.593100625879805572e-2*I, x6 = -.18400593300081082859-0.294349645267429657e-2*I}, {x1 = 1.15183545851062243550-.63203950710794768745*I, x2 = .37477576369618419708+.53544840803155233781*I, x3 = .62522377435745623499-.53544496499870117257*I, x4 = -.43183638240334157140+.63204639317365001792*I, x5 = 4.61946359567927717230*10^(-7)-0.344303285116523e-5*I, x6 = .26669346500387754783+0.4830243560390000529e-1*I}, {x1 = -170.47167192772334996000-167.06093098012886988000*I, x2 = -73.67395402470924667800-72.55552770490905721200*I, x3 = -10.93442727961229911600-10.96242196215938377100*I, x4 = -0.2509068091974163001e-1+0.2503164599198790797e-1*I, x5 = 85.60838130432154579400+83.51794966706844098400*I, x6 = -48.11394963242679327000-47.22766999161791842400*I}, {x1 = -.96415666545961365493, x2 = 0.74156918057976015e-3, x3 = .15401724895091549712, x4 = -0.632569827739583053e-2, x5 = .84524118186850474273, x6 = -.17877481559749253807}, {x1 = -170.47167192772334996000+167.06093098012886988000*I, x2 = -73.67395402470924667800+72.55552770490905721200*I, x3 = -10.93442727961229911600+10.96242196215938377100*I, x4 = -0.2509068091974163001e-1-0.2503164599198790797e-1*I, x5 = 85.60838130432154579400-83.51794966706844098400*I, x6 = -48.11394963242679327000+47.22766999161791842400*I}, {x1 = 1.15183545851062243550+.63203950710794768745*I, x2 = .37477576369618419708-.53544840803155233781*I, x3 = .62522377435745623499+.53544496499870117257*I, x4 = -.43183638240334157140-.63204639317365001792*I, x5 = 4.61946359567927717230*10^(-7)+0.344303285116523e-5*I, x6 = .26669346500387754783-0.4830243560390000529e-1*I}, {x1 = -.99471292930815005917+0.1723370525199235714e-1*I, x2 = -0.37149454015669175e-3+0.60332687785127258e-3*I, x3 = .14459742207767458972+0.532767938094678314e-2*I, x4 = 0.316478438318585512e-2-0.537169273439624571e-2*I, x5 = .85577407246248210203-0.593100625879805572e-2*I, x6 = -.18400593300081082859+0.294349645267429657e-2*I}, {x1 = 165.10846228962626049000+167.05964262318128978000*I, x2 = 72.19919728538481004400+72.55480420528729678200*I, x3 = 11.00757931178830075000+10.96243741636170011800*I, x4 = 0.2509090471996109304e-1-0.2515937988329597960e-1*I, x5 = -82.20677659717311079400-83.51724162164899690000*I, x6 = 46.78972340684068631800+47.22725982906370051900*I}
两相对比,结果的差异只在精确度的不同。
最重要的是,这些解都不止一个解而且包括复数解,这是两个很明显的特征,而1stopt看来是做不到的。1stopt根本没有提供正确的解。
我想,Mathematic6 和maple12不会同时错了吧。

[ 本帖最后由 mathcd 于 2009-2-5 11:21 编辑 ]
回复 不支持

使用道具 举报

发表于 2009-2-5 11:28:14 | 显示全部楼层 来自 北京海淀
"在12楼,我将一个1stopt官方的解代人官方提供的题中,发现原题个方程左右两边之间的数值的差距实在太大了。"
你下上面结论针对的题是下面方程组:
(x-0.3)^y^z+x/y/z-x*y*sin(z)+(x+y-z)^cos(x-1) = 1;
(y-0.2)^z^x+y/z/x-y*z*sin(x)+(y+z-x)^cos(y-2) = 2;
(z-0.1)^x^y+z/x/y-z*x*sin(y)+(z+x-y)^cos(z-3) = 3;

希望你验证的也是这,不知是表达不清,还是mathcd看不清。而且再次建议:不要轻易下结论。
回复 不支持

使用道具 举报

发表于 2009-2-5 11:35:32 | 显示全部楼层 来自 湖南长沙

其实

其实这个方程组我已经验证过了:
(x-0.3)^y^z+x/y/z-x*y*sin(z)+(x+y-z)^cos(x-1) = 1;
(y-0.2)^z^x+y/z/x-y*z*sin(x)+(y+z-x)^cos(y-2) = 2;
(z-0.1)^x^y+z/x/y-z*x*sin(y)+(z+x-y)^cos(z-3) = 3;
在12楼的两张图片里。
版主自己比较哦。我的结论不是轻易下的,若下错了,我定然会更正。当然,没错的,就不必改了。
回复 不支持

使用道具 举报

发表于 2009-2-5 11:52:51 | 显示全部楼层 来自 北京海淀
自信应该建立在水平之上。不要轻易迷信某个软件,也不要轻易否定某个软件。虚心使人进步!
1:你用Matlab、Excel等验证一下上面方程组的结果
2:用Mathematic求一下数值解

如果你不愿意动手,坚持自己的“正确”结论,那该题就没必要在此浪费时间讨论下去了。
回复 不支持

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-7 04:20 , Processed in 0.055461 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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