fmincon函数求解过程中出现无解的情况

求最优解问题的抛出:

求这个函数的最小值 function f = myfun(x)

                        f = (pi*(x(3)+2)*x(2)*x(1)^2)/4;
运行后返回(约束在最后面有写)
Warning: Trust-region-reflective method does not currently solve this type of problem,
 using active-set (line search) instead. 
> In fmincon at 439
Solver stopped prematurely.
fmincon stopped because it exceeded the function evaluation limit,
options.MaxFunEvals = 300 (the default value).
x =
    4.0499
   14.0013
    1.0013
FVAL =
  541.3289

说是这个trust……解不了这个问题,那么该怎么改一下?help过没发现怎么改……

非线性约束 function [c,ceq] = mycon(x)
         k=1.6*(x(1)/x(2))^0.14;     %曲度系数
         F=13;                       %最大力
         f=20.2416;                  %气门最大升程
         G=8100;                     %切变模量
         w=1500;                     %凸轮轴转速
         c(1) =8*k*F*x(2)/(pi*x(1)^3)-51;   %切应力
         c(2) =((x(3)+2-0.5)+1.2*f)/x(2)-5.3 ; %稳定性约束
         c(3) =((G*x(1)^4*1.2*f/(8*x(2)^3*x(3)))*8*k*x(2))/(pi*x(1)^3);   %极限切应力?
         c(4) =10*w-3.56*10^5*x(1)/(x(2)^2*x(3)) ;         %无共振
         ceq = [];
主函数 [x,FVAL] = fmincon(@myfun,[2.5; 21; 7],[4 -1 0;-18 1 0],[0;0],[],[],[2.2;16;3],[3.5;28;Inf],@mycon(x))


解决方案:

主要问题:
1、关于Trust-region-reflective算法的警告
该类方法不适用于存在非线性约束的情况,所以用警告的方式提示你使用别的方法。如果不介意看到警告信息,直接忽略无妨;如果不想看到警告,主程序可以这样调用:
opt=optimset('Algorithm', 'active-set',);
x0=[2.5 21   7];
[x,FVAL] = fmincon(@myfun,x0,[4 -1 0;-18 1 0],[0;0],[],[],[2.2;16;3],[3.5;28;Inf],@mycon,opt)
 
2、程序现在最大的问题是,你给出的初始解不在可行域内,也就是说,不满足你的所有约束条件(很容易验证,不满足非线性不等式约束c(x)<=0)。
 
通过更进一步的分析,我们可以看到,你的非线性约束条件的第四个完全没可能满足:
    c(4) =10*w-3.56*10^5*x(1)/(x(2)^2*x(3)) 
在这个式子中,在考虑x1-x3上下界的条件下,为了尽量使得c(4)的取值小,显然应该取x(1)=3.5,x(2)=16,x(3)=3,计算出c(4)=1.3378e+004,最小值为正数,不可能满足约束。
 
至此,可以得到结论:你所给的约束条件是冲突的,可行解集合为空,无论用什么优化算法都不可能求出结果的。
 
顺便再说一句,第三个约束条件也是可疑的,因为我对于x1、x2的取值区间,以及x3在100000以内的数取了很多值(几万个)都没有发现满足第三个约束条件的可行解。



你可能感兴趣的:(fmincon函数求解过程中出现无解的情况)