关于fmincon函​数中非线性约束函数定​义的问题?

8 views (last 30 days)
对于x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)这个函数中的参数nonlcon,在给的例子里是如下的:
function [c,ceq] = circlecon(x)
c = (x(1)-1/3)^2 + (x(2)-1/3)^2 - (1/3)^2;
ceq = [];
然后引用的时候@circlecon就好了。
这里的c给了一个表达式,但是我在应用的过程中想要用求解得到的一个参数表达式
我是这样写的:
xx=fmincon(objfun,xx0,A,b,Aeq,beq,lb,ub,@noncon)
function [c,ceq] = noncon(xx)
c = [];
ceq=f2(xx(1),xx(2));
end
其中f2是之前求解得到的参数表达式通过matlabFunction转换后的形式。
会显示:
函数或变量 'f2' 无法识别。
出错 fifth>noncon (第 64 行)
ceq=f2(xx(1),xx(2));
出错 fmincon (第 654 行)
[ctmp,ceqtmp] = feval(confcn{3},X,varargin{:});
出错 fifth (第 61 行)
xx=fmincon(objfun,xx0,A,b,Aeq,beq,lb,ub,@noncon)
请问这要怎么样解决呢?谢谢了!

Accepted Answer

腾龙娱乐在线客服17787482287
你的f2是在主代码部分定义的,而自定义函数noncon,只能调用给定的输入,即xx,或者在该函数以及主代码中都声明为全局变量的那些信息。想要调用另外一个句柄,你得在输入位置上追加,比如自定义约束函数改为
function [c,ceq] = noncon( xx, f2 ) % 其余部分略
同时主代码的 fmincon 中 @noncon 也要改为相应的 @( x ) noncon( x, f2 )
fmincon函数(超链接,自己点进去看) 的“非线性约束”示例,就可以改写为
  1. clear; clc; close all; rng default;
  2. fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
  3. f2 = @(x) (x(1)-1/3)^2 + (x(2)-1/3)^2 - (1/3)^2;
  4. lb = [0,0.2];
  5. ub = [0.5,0.8];
  6. A = [];
  7. b = [];
  8. Aeq = [];
  9. beq = [];
  10. x0 = [1/4,1/4];
  11. nonlcon = @( x ) circlecon( x, f2 );
  12. x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub, nonlcon )
  13. function [ c, ceq ] = circlecon( x, FuncHandle )
  14. c = FuncHandle( x );
  15. ceq = [];
  16. end
这个将函数句柄作为参数传递进自定义约束函数的写法,与示例中直接在自定义约束函数中写出约束的具体表达式,是等效的。

More Answers (0)

Categories

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!