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