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

[1stOpt] 杆的最大长度(趣味问题)

[复制链接]
发表于 2010-11-15 21:40:53 | 显示全部楼层 |阅读模式 来自 湖南湘潭
本帖最后由 lin2009 于 2010-11-17 20:38 编辑

如图所示的一个走廊,能从一端到另一端在地面上滑动通过的杆为L,试求L的最大值。
已知

 楼主| 发表于 2010-11-17 19:03:11 | 显示全部楼层 来自 湖南湘潭
Simdroid开发平台
本帖最后由 lin2009 于 2010-11-17 20:53 编辑

参考答案如下,过程暂时不贴出,先让大家试试看。
l: 32.3070077214581
alpha: 0.613180525650986

显然,L的最大长度应该满足方程:
L = L2/sin(pi - gamma - alpha) + L1/sin(alpha)

可以用多种方法求得该最大值(可以有解析解和数值解)。
应该说应用1stopt的方法最简便。
回复 不支持

使用道具 举报

 楼主| 发表于 2010-11-26 10:37:56 | 显示全部楼层 来自 湖南湘潭
本帖最后由 lin2009 于 2010-11-26 10:51 编辑

从1#图上可知,杆的最大长度必须要满足下面的条件:

在地面上滑动通过走廊的杆的最大长度,必定是L的最小值


优化目标函数是:
min  L2/sin(pi - beta1 - alpha) + L1/sin(alpha)
优化变量是

方法1、采用1stopt方法;
用1stopt表示的优化问题:
  1. constant L1 = 9, L2 = 10, beta1 = 3/5*pi;
  2. Parameter 0 < alpha < pi - beta1;
  3. minfunction L;
  4. L = L2/sin(pi - beta1 - alpha) + L1/sin(alpha);
复制代码
= == == = 结果 = == == =
迭代数 : 20001
计算用时(时 : 分 : 秒 : 毫秒) : 00:00:30 : 781
计算中止原因 : 达到最大迭代数
优化算法 : 鲁棒简面体爬山法 + 通用全局优化法(SM3)
函数表达式 : l
目标函数值(最小) : 32.3070638443789
alpha:0.614032211739331
l:32.3070638443789
约束函数
   1:l - (10/sin(pi - 1.88495559215388 - alpha) + 9/sin(alpha)) = 0
= == == = 计算结束 = == == =

方法2、结合绘图进行寻优;
这是一元函数的最优化问题,因此也可将图画出,再寻找最优点。如下图所示:

3、先进行理论推导,得出最优点发生的条件,再求解方程。
也可以在进行直接计算的方法:《Matlab科学计算》, 清华大学出版社,p46。
当且仅当 alpha满足下面方程时,L有最小值。

求解alpha,并代入L的表达式,可以得到相同的结果。






评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2010-11-26 10:54:17 | 显示全部楼层 来自 湖南湘潭
后续问题:如何得出最优点发生的条件呢?即

方程是如何得出的呢?
回复 不支持

使用道具 举报

发表于 2010-11-26 11:12:14 | 显示全部楼层 来自 北京海淀
那段1stOpt代码运行了下,换一下其它算法结果似乎更快更好:

  1. Algorithm = SM1[30];
  2. constant L1 = 9, L2 = 10, beta1 = 3/5*pi;
  3. Parameter 0 < alpha < pi - beta1;
  4. minfunction L;
  5. L = L2/sin(pi - beta1 - alpha) + L1/sin(alpha);
复制代码
计算用时(时:分:秒:毫秒): 00:00:00:266
计算中止原因: 达到收敛判定标准
优化算法: 标准简面体爬山法 + 通用全局优化法(SM1)
函数表达式: l
目标函数值(最小): 32.3070077214083
alpha: 0.61318052831074
l: 32.3070077214083

约束函数:
   1: l-(10/sin(pi - 1.88495559215388 - alpha) + 9/sin(alpha)) = -4.978772949E-11
回复 不支持

使用道具 举报

 楼主| 发表于 2010-11-28 15:06:18 | 显示全部楼层 来自 湖南湘潭
5# shamohu
"那段1stOpt代码运行了下,换一下其它算法结果似乎更快更好",
为什么说结果似乎更好呢?楼主没有明确说明。

其实从结果本身是看不出来的。
应该与实际值相比,才能判断准确程度。

3#的第三种方法最为准确(经理论推导的为实际值)。相应的1stopt代码和结果如下:
  1. constant L1 = 9, L2 = 10, beta1 = 3/5*pi;
  2. function L = L2/sin(pi - beta1 - alpha) + L1/sin(alpha);
  3. L2*cos(pi - beta1 - alpha)/(sin(pi - beta1 - alpha))^2 - L1*cos(alpha)/(sin(alpha))^2 = 0;
复制代码

====== 结果 ======
迭代数: 18
计算用时(时:分:秒:毫秒): 00:00:00:329
计算中止原因: 达到收敛判定标准
优化算法: 通用全局优化法(UGO1)
函数表达式 1: l -( 10/sin(pi - 1.88495559215388 - alpha) + 9/sin(alpha)) = 0
         2: 10*cos(pi - 1.88495559215388 - alpha)/(sin(pi - 1.88495559215388 - alpha))^2 - 9*cos(alpha)/(sin(alpha))^2
            -( 0) = 2.273985444E-10
目标函数值(最小): 1.26217744835362E-29
l: 32.3070077214581
alpha: 0.613180525650986
====== 计算结束 ======

可以看出3#的方法2也很准确(绘图并结合一维寻优方法,如黄金分割法、斐波纳契法等,操作较麻烦)。

问题是直接利用1stopt方法,操作最方便,但是算法选择不当,可能存在精度不足的问题。
这在一定程度上可以 用多次运行程序选择最佳结果的方法(1stopt中自动完成)来弥补。
相应的程序和结果如下:
  1. MultiRun = 10;// 运行10次,取其最优!
  2. constant L1 = 9, L2 = 10, beta1 = 3/5*pi;
  3. Parameter 0 < alpha < pi - beta1;
  4. minfunction L;
  5. L = L2/sin(pi - beta1 - alpha) + L1/sin(alpha);
复制代码

====== 结果 ======
重复计算最佳目标函数: 32.3070077214581
重复计算求得最佳目标函数次数: 2
重复计算最差目标函数: 63.3943822955649
重复计算平均目标函数: 35.9559572576879
重复计算总用时: 0:00:16
优化算法: 通用全局优化法(UGO2)
函数表达式: l
目标函数值(最小): 32.3070077214581
alpha: 0.613180520635929
l: 32.3070077214581
约束函数
   1: l-(10/sin(pi - 1.88495559215388 - alpha) + 9/sin(alpha)) = 0
====== 计算结束 ======

由此可见,利用数值方法进行的寻优,有其特殊性,结果不一定是最优,应该加以验证,并设法提高其精度(如1stopt中的多次运算取其最优的做法)。
回复 不支持

使用道具 举报

发表于 2010-12-13 08:59:42 | 显示全部楼层 来自 浙江杭州
能给出数学建模,这个优化起来并不难。excel也可以求出。

本帖子中包含更多资源

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

×
回复 不支持

使用道具 举报

发表于 2011-1-5 12:30:13 | 显示全部楼层 来自 上海虹口区
。。。。。。。。。。。。。。。。。。
回复 不支持

使用道具 举报

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

本版积分规则

Simapps系列直播

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

GMT+8, 2024-9-30 08:59 , Processed in 0.049434 second(s), 18 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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