关于MATLAB的非线性约束求最值的问题

关于用matlab求非线性不等式约束求最值的问题,尝试使用二分法解决,问题描述主要如下图所示

img

我使用了fmincon函数,代码如下

fun=@(x)(x(1)-1)*(psi(x(1))-psi(x(1)+x(2)))+(x(2)-1)*(psi(x(2))-psi(x(1)+x(2)))-log(beta(x(1),x(2)));
nonlcon=@sttwo;
A=[];
b=[];
Aeq=[];
beq=[];
lb=[0 0];
ub=[Inf Inf];
x0=[1 1];
options=optimoptions('fmincon','Display','notify','Algorithm','interior-point');
[x,fval,exitflag]=fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options);

其中非线性约束函数sttwo如下

function [c,ceq]=sttwo(x)
c=[0.5-x(1)/(x(1)+x(2));
   1/34-x(1)/(x(1)+x(2)+29)];
ceq=[];
end

而我最终运行结果[a,b]=[1.004,0.996],而真正答案是[0.9063,0.8156],请问代码应该如何编写?

img


增加下加options.MaxIter和options.TolX的值看看

看出来了,fun是目标函数,nonlcon是非线性约束函数,A、b、Aeq、beq、lb和ub是约束条件,x0是初始点,options是优化选项。在nonlcon函数中,c是约束条件,ceq是等式约束条件。

该代码段部分展示了一个非线性约束优化问题的约束条件。该问题的目标是求解使得目标函数最小的变量值,同时满足一定的约束条件。其中,不等式约束条件为空,而等式约束条件通过两个函数ceq(1)和ceq(2)来表示。该问题的完整求解代码需要进一步构造和补充。

检查非线性约束函数的正确性:首先需要确认非线性约束函数 sttwo 的正确性,可以将其单独测试一下,看看求解器是否能够正确地返回满足约束条件的解。

调整初始点 x0:初始点 x0 的选择可能会影响求解结果,可以尝试不同的初始值,看看是否能够得到更接近真实答案的解。

调整求解器参数:fmincon 函数提供了多个参数可供调节,例如迭代次数、容许误差等,可以尝试调整这些参数,以获得更好的求解效果。具体参数的含义和取值范围可以参考 MATLAB 文档。

尝试其他求解器:如果以上方法都无法得到满意的结果,可以尝试使用其他的求解器进行求解,例如 patternsearch、fminunc 等,以获得比较好的求解效果。

回答部分参考、引用ChatGpt以便为您提供更准确的答案:

根据您提供的截图,您在使用Adams Car进行稳态回转定半径工况的仿真时,设置了纵向加速度目标为0.02g(即0.1962 m/s²)。然而,您观察到仿真曲线上的纵向加速度不断增加,与设定值不符。

可能的原因是系统存在一些误差和不确定性因素,导致实际仿真结果与设定值略有偏差。以下是一些可能的影响因素:

  1. 模型参数误差:仿真模型中的参数可能存在一定的误差。这包括车辆的质量、惯性特性、轮胎特性等参数,这些参数的不准确性可能导致仿真结果与理论值有所偏差。
  2. 控制算法误差:Adams Car中的控制算法可能存在一定的误差。纵向控制算法的执行过程中可能受到噪声、采样率等因素的影响,从而导致实际纵向加速度与设定值有所偏差。
  3. 仿真设置误差:在仿真过程中,可能存在一些设置误差。例如,初始条件、边界条件、仿真时间步长等设置可能会对仿真结果产生影响。

针对这种情况,建议您进行以下步骤:

  1. 检查模型参数:确保模型中的车辆参数和轮胎参数等与实际情况相符,并且尽可能准确。
  2. 调整控制算法:尝试不同的纵向控制算法或调整控制参数,以减小误差。
  3. 优化仿真设置:检查仿真设置,包括初始条件、边界条件和仿真时间步长等,确保它们与实际应用场景匹配,并尽量减小误差。

请注意,以上只是一些可能的原因和建议,具体情况需要根据您的实际仿真模型和参数来进行分析和调整。

MATLAB用fmincon函数求非线性约束下的最优化问题


%方式一:分成多个文件
function f=fminxy(t)
x=t(1);y=t(2);
f=x*x*x-y*y*y+2*x*x+x*y;
end
%%以上代码生成fminxy文件
function [c d]=fcontr(t)
x=t(1);y=t(2);
c=x*x+y*y-6;
d=x*y-2;
end
%%以上文件生成fcontr文件
>> [x,fval,exitflag]=fmincon('fminxy',[1 2],[],[],[],[],[],[],'fcontr')
%fmincon(    fun,    x0, A, b,Aeq,beq,lb,ub, nonlcon) A是初始值,fmincon的初始值x0可以任意取,只要保证为实数就行。
x =
    0.8740     2.2882      %函数最小值时x,y的值
fval =
   -7.7858                        %函数最小值
exitflag =
     1                               %一阶最优性条件满足容许范围,既是结果正确

%方式二:整合成一个文件
function  x= findOpt(a,b) 
x=fmincon(@(t) fminxy(t),[a b],[],[],[],[],[],[],@(t) fcontr(t))
end
 
function f=fminxy(t)
x=t(1);y=t(2);
f=x*x*x-y*y*y+2*x*x+x*y;
end
 
function [c d]=fcontr(t)
x=t(1);y=t(2);
c=x*x+y*y-6;
d=x*y-2;
end
%以上代码生成findOpt文件
>> x=findOpt(2,2)
x =
    0.8740   2.2882

非线性的最值求解问题,包括有约束和无约束最优化求解,其中有约束最优化问题,即求取一组x,使得目标函数 f(x)为最小,且满足约束条件G(x)≤0 。约束条件可以进一步细化为:线性不等式约束、线性等式约束、非线性不等式约束、非线性等式约束以及x的下界和上界。
求有约束条件下最小值的函数为:
[ xmin,fmin ]= fmincon (filename,x0,A,b,Aeq,beq,Lbnd,Ubnd,NonF,option)
其中,xmin 、fmin 、filename 、x0 和 option 的含义与求最小值函数相同。

检查调整一下初始条件、边界条件、仿真时间步长等参数,不同的参数会影响输出结果