balou 发表于 2009-12-13 15:20:42

请问如何对部分计算结果进行上下限约束

最近编写一个计算振动特性的函数,用了fmincon函数进行优化设计,除了要对十二个初始值进行优化外,计算得到的六个固有频率值也有上下限约束,而对这六个值使用非线性约束会使计算不收敛,优化的目标是另外一部分的计算值,程序见下面:

functionfun_kipor_opti
%初始值
x_ini=;
% x_ini
%%设置下限值
x_lb=;
% x_lb
%设置上限值
x_ub=;

%采用标准算法
options=optimset('largescale','off');
options=optimset(options,'MaxFunEvals',3000);
options=optimset('Display','iter');
=fmincon('fun_kipor_opti_obj',x_ini,[],[],[],[],x_lb,x_ub,[],options)

function y=fun_kipor_opti_obj(x)
global Dec_ratio K M
for II=1:4
      k_gdu(1:3,II)=x(3*II-2:3*II);
end
   
=eig(K,M);      %K,M 已知
f=sqrt(omiga)/(2*pi);   %f为频率
                                    %fi为振型
% 求出Fre
for I=1:6
   Fre(I)=f(I,I);
end

%求出E_decoup
for I=1:6   
            
      Total=fi(:,I)'*M*fi(:,I);
      
      for n=1:6    %n为自由度数
         
         Temp=0.0;
         for L=1:6
             Temp=Temp+M(n,L)*fi(L,I);
         end
         
         Temp=Temp*fi(n,I);
         
         E_decoup(n,I)=Temp/Total*100;
   end
end

y=0;
for n=1:6
   y=(Dec_ratio(n)-E_decoup(n,n))^2+y;
end
%   也就是 Fre , E_decoup都是程序计算出来的中间变量或者说是结果
%   Dec_ratio是优化要达到的目标
%   现在问题是 Fre(一行六列的矩阵) 也有上下线约束,请问如何对这个中间变量约束呢? 使用非线性约束结果不好收敛,而且他不是初始的优化对象,只是中间变量,请问有什么方法解决这 个问题,我被困扰了好久,也试过很多方法,效果都不好,是不是得用别的函数优化呢?现在没有用非线性约束

messenger 发表于 2009-12-13 15:51:29

从你的代码中也没看出Dec_ratio与Fre有关系来,Fre求出来以后,后面根本没有用到。

balou 发表于 2009-12-13 16:12:01

Fre在工程上有要求,程序优化的目标是E_decoup,达到Dec_ratio的要求,而工程上Fre又得满足要求,就是不知道在怎么在程序中约束Fre,请您指点

axi.001 发表于 2009-12-13 16:42:22

确实优化目标函数y里看不出来用了Fre,好像不用对其进行优化…而且函数y里只有六个变量,而作者前面说是要优化12个,没看明白。

balou 发表于 2009-12-13 16:47:51

Fre , E_decoup都是计算得到的结果,优化的目标是E_decoup,而Fre又有上下限约束的要求。十二个初始变量是用来求出Fre , E_decoup的

axi.001 发表于 2009-12-13 17:14:31

上网不方便,我用的手机,我觉得要是先不考虑优化Fre,你现在这个程序能对12个x进行优化吗?

axi.001 发表于 2009-12-13 17:27:48

先看看目标函数y里,有什么问题没有再考虑fre优化

balou 发表于 2009-12-13 19:01:40

效果还可以啊,基本能达到优化目标。 6# axi.001

messenger 发表于 2009-12-13 19:52:00

这个问题比较复杂。将Fre的上、下限转换一下,比如b<Fre<a,转换为min Fre-(a+b)/2,加上原来的目标函数,转化为多目标优化试试

balou 发表于 2009-12-13 22:17:27

我试过,效果是有的,就是不能完全满足约束,请问有没有别的函数可以解决这种情况的,或者别的优化方法。 9# messenger

messenger 发表于 2009-12-14 12:44:30

那就没啥好办法了,也许你的问题在这种条件下就是不能完全满足约束

wanglu 发表于 2009-12-14 18:41:08

楼主这个问题我想用Forcal试一下,但我看不懂matlab代码,楼主能否用一般的数学语言描述一下?

chenyb 发表于 2009-12-18 23:22:48

不好意思,前段时间出差了。这个问题现在没时间深入探讨了,效果还可以就算了,多谢大家帮忙。 12# wanglu
页: [1]
查看完整版本: 请问如何对部分计算结果进行上下限约束