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

[1stOpt] 优化问题 -- 线规的选择

[复制链接]
发表于 2010-12-24 09:21:56 | 显示全部楼层 |阅读模式 来自 湖南湘潭
优化问题 -- 线规的选择
在电机设计生产中, 若设计出来的导线线规太粗(导线太硬, 工艺不便), 一般要用多根细导线并绕。
这多根导线可以是不同规格的。原则是多根并绕的导线的截面积要尽量接近于设计的截面积(即线规)。
为了工艺的方便, 一般并绕导线的线规不超过2种(可以有多根)。
已知所选用的导线的线规如下。

问题:给定设计的截面积,如何选择合适的线规?

例 : 设计的截面积为2.61 mm^2
问如何选择?
答 : 可以选2根, 线径为1.30的漆包线。
    实际截面积: 2*(pi*1.30^2/4) = 2.655 mm^2
    与设计的截面积很接近。


已知 QZ-2, QZL-2 厚绝缘聚酯漆包圆线的线规如下 : 单位mm(仅列出导体标称直径 - 不含漆膜厚度)
0.50
0.53
0.56
0.60
0.67
0.71
0.75
0.80
0.85
0.90
0.95
1.00
1.06
1.12
1.18
1.25
1.30
1.40
1.50
1.56
1.60
1.70
1.80
1.90
2.00
2.12
2.24
2.36
2.50

评分

1

查看全部评分

发表于 2010-12-24 23:24:18 | 显示全部楼层 来自 北京
Simdroid开发平台
不知理解对否:

  1. Algorithm = SM3[50];
  2. Constant n=2;
  3. Constant R=[0.50,0.53,0.56,0.60,0.67,0.71,0.75,0.80,0.85,0.90,0.95,
  4.             1.00,1.06,1.12,1.18,1.25,1.30,1.40,1.50,1.56,1.60,1.70,1.80,1.90,2.00,2.12,2.24,2.36,2.50];
  5. BinParameter p(29);
  6. IntParameter K(29)=[0,12];
  7. MinFunction abs(Sum(R,p,K)(k*pi*(R/2)^2*p)-2.61);
  8.             Sum(p)(p)=n;
复制代码


结果:
目标函数(最小): 0.000593141928317387
p1: 1
p2: 0
p3: 1
p4: 0
p5: 0
p6: 0
p7: 0
p8: 0
p9: 0
p10: 0
p11: 0
p12: 0
p13: 0
p14: 0
p15: 0
p16: 0
p17: 0
p18: 0
p19: 0
p20: 0
p21: 0
p22: 0
p23: 0
p24: 0
p25: 0
p26: 0
p27: 0
p28: 0
p29: 0
k1: 2
k2: 5
k3: 9
k4: 7
k5: 5
k6: 5
k7: 4
k8: 10
k9: 5
k10: 5
k11: 11
k12: 5
k13: 12
k14: 11
k15: 2
k16: 7
k17: 5
k18: 10
k19: 8
k20: 10
k21: 1
k22: 6
k23: 0
k24: 4
k25: 5
k26: 6
k27: 10
k28: 12
k29: 3

即取1,3号线材(对应p1=1, p3=1),相应的根数为2,9(对应k1=2, k3=9),此时组成的截面积为2.609406858
回复 不支持

使用道具 举报

发表于 2010-12-25 16:57:21 | 显示全部楼层 来自 湖北武汉
不知理解对否:

Algorithm = SM3[50];
Constant n=2;
Constant R=[0.50,0.53,0.56,0.60,0.67,0.71,0.75,0.80,0.85,0.90,0.95,
            1.00,1.06,1.12,1.18,1.25,1.30,1.40,1.50,1.56,1.60,1.70,1.80,1.90 ...
shamohu 发表于 2010-12-24 23:24

是否需要考虑各导线间的空隙吗?
回复 不支持

使用道具 举报

 楼主| 发表于 2010-12-25 17:35:07 | 显示全部楼层 来自 湖南湘潭
不考虑”各导线间的空隙“
并绕原则是“多根并绕的导线的(总)截面积要尽量接近于设计的截面积“

2# shamohu 理解是正确的。结果也应该是最优的。
稍显不足的是,优化变量太多。
实际上这个优化问题又可以这样表述:
min    abs(  k1* pi*(R1/2)^2  + k2* pi*(R1/2)^2 - 2.61)
sub.   k1,k2  正整数(0,1,2,3...)
           R1,R2∈[  0.50,0.53,0.56,0.60,0.67,0.71,0.75,0.80,0.85,0.90,0.95,1.00,
                              1.06,1.12,1.18,1.25,1.30,1.40,1.50,1.56,1.60,1.70,1.80,1.90,
                              2.00,2.12,2.24,2.36,2.50 ];
这里就只有4个优化变量。k1,k2为2种线规的根数,k1,k2可以等于0,但不同时等于0。
                                        实际上还可以进一步限定k1,k2的取值范围。
                                       若只选用最小的线规,设根数为n = 2.61/(pi*0.25^2) 取整数部分。
                                       则 k1+k2<=n
                                       R1,R2为这2线规对应线径。
回复 不支持

使用道具 举报

发表于 2010-12-25 20:14:11 | 显示全部楼层 来自 湖北武汉
R1,R2∈[  0.50,0.53,0.56,0.60,0.67,0.71,0.75,0.80,0.85,0.90,0.95,1.00,
                              1.06,1.12,1.18,1.25,1.30,1.40,1.50,1.56,1.60,1.70,1.80,1.90,
                              2.00,2.12,2.24,2.36,2.50 ];

这个如何在1stOpt中便捷地表现出来?
回复 不支持

使用道具 举报

发表于 2010-12-25 20:17:17 | 显示全部楼层 来自 湖北武汉
不知理解对否:

Algorithm = SM3[50];
Constant n=2;
Constant R=[0.50,0.53,0.56,0.60,0.67,0.71,0.75,0.80,0.85,0.90,0.95,
            1.00,1.06,1.12,1.18,1.25,1.30,1.40,1.50,1.56,1.60,1.70,1.80,1.90 ...
shamohu 发表于 2010-12-24 23:24

k(x)应该是选用的根数吧。如版主的处理,当是否选用的flag(即版主的p(x))为0时,能不能让相应的k(x)固定为零?这样的结果就可以唯一了。
回复 不支持

使用道具 举报

发表于 2010-12-25 21:13:41 | 显示全部楼层 来自 北京
根据4#Lin2009的思路,代码如下,在编程模式下实现:

  1. Algorithm = SM2[50];
  2. Constant R=[0.50,0.53,0.56,0.60,0.67,0.71,0.75,0.80,0.85,0.90,0.95,
  3.             1.00,1.06,1.12,1.18,1.25,1.30,1.40,1.50,1.56,1.60,1.70,1.80,1.90,2.00,2.12,2.24,2.36,2.50];
  4. IntParameter p(2)=[1,29], K(2)=[0,12];
  5. StartProgram [Pascal];
  6. Procedure MainModel;
  7. Begin
  8.     ObjectiveResult := abs(k1* pi*(R[p1]/2)^2  + k2* pi*(R[p2]/2)^2 - 2.61);
  9. End;
  10. EndProgram;
复制代码
结果:
目标函数(最小): 0.000593141928317314
p1: 1
p2: 3
k1: 2
k2: 9

或:
目标函数(最小): 0.000593141928317314
p1: 3
p2: 1
k1: 9
k2: 2
回复 不支持

使用道具 举报

 楼主| 发表于 2010-12-26 17:24:26 | 显示全部楼层 来自 湖南湘潭
本帖最后由 lin2009 于 2010-12-26 17:34 编辑

7# shamohu

解答很简洁,两组解是对称的,可以用k1<=k2 得出唯一的一组解。
但是编程模式比较复杂,最好能直接用快捷模式。

也就是在1stopt快捷模式中,能否直接设置2个优化变量R1和R2,
并规定这两个变量的取值范围,R1,R2∈[  0.50,0.53,...]
(不是常见的连续型数据,而是离散型的数据)来进行优化:

如:
Parameter R1,R2 ∈[  0.50,0.53,0.56,0.60,0.67,0.71,0.75,0.80,0.85,0.90,0.95,1.00,
                              1.06,1.12,1.18,1.25,1.30,1.40,1.50,1.56,1.60,1.70,1.80,1.90,
                              2.00,2.12,2.24,2.36,2.50 ]; // R1,R2 是所选线规的线径(直径)。
constant n = floor(2.61/(pi*0.50^2/4)); //n为只用最小线规时的并绕根数。显然k1+k2<=n;
IntParameter  k1,k2;   // k1,k2为两种线规的根数,属于整数类型的优化变量。
Minfunction  abs(k1* pi * R1^2/4  + k2* pi * R2^2/4 - 2.61);
                      k1 + k2 <= n

5#20wangz 所说的,
R1,R2∈[  0.50,0.53,0.56,0.60,0.67,0.71,0.75,0.80,0.85,0.90,0.95,1.00,
                              1.06,1.12,1.18,1.25,1.30,1.40,1.50,1.56,1.60,1.70,1.80,1.90,
                              2.00,2.12,2.24,2.36,2.50 ];
这个如何在1stOpt中便捷地表现出来?

也应该是表达这个意思。

用parameter 关键词好像不行,不知道还有没有其它途径?
回复 不支持

使用道具 举报

发表于 2010-12-27 11:38:44 | 显示全部楼层 来自 北京海淀
下面代码与2#的代码相比,求解变量减少了近一半,结果也唯一:

  1. Algorithm = SM3[50];
  2. Constant R=[0.50,0.53,0.56,0.60,0.67,0.71,0.75,0.80,0.85,0.90,0.95,
  3.             1.00,1.06,1.12,1.18,1.25,1.30,1.40,1.50,1.56,1.60,1.70,1.80,1.90,2.00,2.12,2.24,2.36,2.50];
  4. IntParameter p(29)=[0,2], K(2)=[1,12];
  5. MinFunction abs(Sum(R,p)(if(p=0,0,if(p=1,k1,k2))*pi*(R/2)^2*if(p>0,1,0))-2.61);
  6.             Sum(p)(if(p=0,0,1))=2;//保证只有两种规格
复制代码
结果:
目标函数值(最小): 0.000593141928317387
p1: 2
p2: 0
p3: 1
p4: 0
p5: 0
p6: 0
p7: 0
p8: 0
p9: 0
p10: 0
p11: 0
p12: 0
p13: 0
p14: 0
p15: 0
p16: 0
p17: 0
p18: 0
p19: 0
p20: 0
p21: 0
p22: 0
p23: 0
p24: 0
p25: 0
p26: 0
p27: 0
p28: 0
p29: 0
k1: 9
k2: 2

另外,编程模式也不是很复杂,有的问题只能在编程模式下完成。
回复 不支持

使用道具 举报

发表于 2010-12-29 09:03:12 | 显示全部楼层 来自 北京海淀
你的代码有问题,在4.0中都无法运行。参考1#和7#的代码。
回复 不支持

使用道具 举报

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

本版积分规则

Simapps系列直播

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

GMT+8, 2024-9-20 19:51 , Processed in 0.045220 second(s), 18 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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