lin2009 发表于 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

shamohu 发表于 2010-12-24 23:24:18

不知理解对否:

Algorithm = SM3;
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,2.00,2.12,2.24,2.36,2.50];
BinParameter p(29);
IntParameter K(29)=;
MinFunction abs(Sum(R,p,K)(k*pi*(R/2)^2*p)-2.61);
            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

20wangz 发表于 2010-12-25 16:57:21

不知理解对否:

Algorithm = SM3;
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 http://forum.simwe.com/images/common/back.gif
是否需要考虑各导线间的空隙吗?

lin2009 发表于 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线规对应线径。

20wangz 发表于 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中便捷地表现出来?

20wangz 发表于 2010-12-25 20:17:17

不知理解对否:

Algorithm = SM3;
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 http://forum.simwe.com/images/common/back.gif
k(x)应该是选用的根数吧。如版主的处理,当是否选用的flag(即版主的p(x))为0时,能不能让相应的k(x)固定为零?这样的结果就可以唯一了。

shamohu 发表于 2010-12-25 21:13:41

根据4#Lin2009的思路,代码如下,在编程模式下实现:
Algorithm = SM2;
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,2.00,2.12,2.24,2.36,2.50];
IntParameter p(2)=, K(2)=;
StartProgram ;
Procedure MainModel;
Begin
    ObjectiveResult := abs(k1* pi*(R/2)^2+ k2* pi*(R/2)^2 - 2.61);
End;
EndProgram;
结果:
目标函数(最小): 0.000593141928317314
p1: 1
p2: 3
k1: 2
k2: 9

或:
目标函数(最小): 0.000593141928317314
p1: 3
p2: 1
k1: 9
k2: 2

lin2009 发表于 2010-12-26 17:24:26

本帖最后由 lin2009 于 2010-12-26 17:34 编辑

7# shamohu

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

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

如:
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;
IntParameterk1,k2;   // k1,k2为两种线规的根数,属于整数类型的优化变量。
Minfunctionabs(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 关键词好像不行,不知道还有没有其它途径?

shamohu 发表于 2010-12-27 11:38:44

下面代码与2#的代码相比,求解变量减少了近一半,结果也唯一:
Algorithm = SM3;
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,2.00,2.12,2.24,2.36,2.50];
IntParameter p(29)=, K(2)=;
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);
            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

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

shamohu 发表于 2010-12-29 09:03:12

你的代码有问题,在4.0中都无法运行。参考1#和7#的代码。
页: [1]
查看完整版本: 优化问题 -- 线规的选择