假设你的参数为:C,其声明和调用方法如下
nonlfunm
function f=nonlfun(x,C)
f=-2x(1) -3 x(2) -5 x(3);
nonlconm
function [c,ceq]=nonlcon (x,C)
ceq=[x(1)^2+ x(2)^2+x(3)^2-1];
c=[];
[x,fval]=fmincon(@nonlfun,[1,1,1],[],[],[],[],[0,0,0],[1,1,1], @nonlcon,C)
这样就可以实现带参数求优化,我没有调试,希望对你有帮助。
1 把[x,fval]=fmincon('fun',x0,A,b,Aeq,beq,VLB,VUB,'mycon')
改为
[x,fval]=fmincon('fun',x0,A,b,Aeq,beq,VLB,VUB)
我不是太清楚你为什么要加mycon没用吧。
2 目标函数加负号(因为fmincon是求最小值)
function f=fun(x)
f=-(34854x(1)+62879x(3)+56932x(4))/(34854x(1)-4952x(2)+62879x(3)+56932x(4)-24846x(5));
3 命令行
x0=[1;0;0;0;0];
A=[];b=[];
Aeq=[1 1 1 1 1];beq=[1];
VLB=[0 0 0 0 0];
VUB=[1 1 1 1 1];
[x,fval]=fmincon('fun',x0,A,b,Aeq,beq,VLB,VUB);
xmin=x
fmin=-fval
有三个函数把小数转化成整数:floor,ceil,round。floor是比原数小的ceil是比原数大的round是四舍五入根据你的规划条件看则样取比较合适,如果你担心转完以后超出规划区域,用一些判断语句来解决
这个函数的基本形式为
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
其中fun为你要求最小值的函数,可以单写一个文件设置函数,如以上给的例子中。
1如果fun中有N个变量,如x y z, 或者是X1, X2,X3, 什么的,自己排个顺序,在fun 中统一都是用x(1),x(2)x(n) 表示的。
2 x0, 表示初始的猜测值,大小要与变量数目相同
3 A b 为线性不等约束,Ax <= b, A应为nn阶矩阵,学过线性代数应不难写出A和b
4 Aeq beq为线性相等约束,Aeqx = beq。 Aeq beq同上可求
5 lb ub为变量的上下边界,正负无穷用 -Inf和Inf表示, lb ub应为N阶数组
6 nonlcon 为非线性约束,可分为两部分,非线性不等约束 c,非线性相等约束,ceq
可按下面的例子设置
function [c,ce] = nonlcon1(x)
c = -x(1)+x(2)^2-4;
ce = []; % no nonlinear equality constraints
7,最后是options,可以用OPTIMSET函数设置,见上例
具体可见OPTIMSET函数的帮助文件。
对于优化控制,MATLAB提供了18个参数,这些参数的具体意义为:
options(1)-参数显示控制(默认值为0)。等于1时显示一些结果。
options(2)-优化点x的精度控制(默认值为1e-4)。 options = optimset('TolX',1e-8)
options(3)-优化函数F的精度控制(默认值为1e-4)。options = optimset('TolFun',1e-10)
options(4)-违反约束的结束标准(默认值为1e-6)。
options(5)-算法选择,不常用。
options(6)-优化程序方法选择,为0则为BFCG算法,为1则采用DFP算法。
options(7)-线性插值算法选择,为0则为混合插值算法,为1则采用立方插算法。
options(8)-函数值显示 (目标—达到问题中的Lambda )
options(9)-若需要检测用户提供的梯度,则设为1。
options(10)-函数和约束估值的数目。
options(11)-函数梯度估值的个数。
options(12)-约束估值的数目。
options(13)-等约束条件的个数。
options(14)-函数估值的最大次数(默认值是100×变量个数) options(15)-用于目标—达到问题中的特殊目标。
options(16)-优化过程中变量的最小有限差分梯度值。
options(17)- 优化过程中变量的最大有限差分梯度值。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)