请问如何对部分计算结果进行上下限约束
最近编写一个计算振动特性的函数,用了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(一行六列的矩阵) 也有上下线约束,请问如何对这个中间变量约束呢? 使用非线性约束结果不好收敛,而且他不是初始的优化对象,只是中间变量,请问有什么方法解决这 个问题,我被困扰了好久,也试过很多方法,效果都不好,是不是得用别的函数优化呢?现在没有用非线性约束 从你的代码中也没看出Dec_ratio与Fre有关系来,Fre求出来以后,后面根本没有用到。 Fre在工程上有要求,程序优化的目标是E_decoup,达到Dec_ratio的要求,而工程上Fre又得满足要求,就是不知道在怎么在程序中约束Fre,请您指点 确实优化目标函数y里看不出来用了Fre,好像不用对其进行优化…而且函数y里只有六个变量,而作者前面说是要优化12个,没看明白。 Fre , E_decoup都是计算得到的结果,优化的目标是E_decoup,而Fre又有上下限约束的要求。十二个初始变量是用来求出Fre , E_decoup的 上网不方便,我用的手机,我觉得要是先不考虑优化Fre,你现在这个程序能对12个x进行优化吗? 先看看目标函数y里,有什么问题没有再考虑fre优化 效果还可以啊,基本能达到优化目标。 6# axi.001 这个问题比较复杂。将Fre的上、下限转换一下,比如b<Fre<a,转换为min Fre-(a+b)/2,加上原来的目标函数,转化为多目标优化试试 我试过,效果是有的,就是不能完全满足约束,请问有没有别的函数可以解决这种情况的,或者别的优化方法。 9# messenger 那就没啥好办法了,也许你的问题在这种条件下就是不能完全满足约束 楼主这个问题我想用Forcal试一下,但我看不懂matlab代码,楼主能否用一般的数学语言描述一下? 不好意思,前段时间出差了。这个问题现在没时间深入探讨了,效果还可以就算了,多谢大家帮忙。 12# wanglu
页:
[1]