在编写目标函数时(尤其是一些比较复杂的优化问题),除了自变量,我们还需要传入一些非自变量的参数。针对这一问题,有三种解决方法,分别是:匿名函数、嵌套函数、全局变量。
1、匿名函数
创建一个.m文件,文件名parameterfun.m
function y = parameterfun(x,a,b,c)
y = (a - b*x(1)^2 + x(1)^4/3)*x(1)^2 + x(1)*x(2) + ...
(-c + c*x(2)^2)*x(2)^2;
创建main.m文件
a = 4; b = 2.1; c = 4; % Assign parameter values
x0 = [0.5,0.5];
f = @(x)parameterfun(x,a,b,c);
[x,fval] = fminunc(f,x0)
在命令行中输入main,即可得到结果

2、嵌套函数
创建一个.m文件,文件名runnested.m
function [x,fval] = runnested(a,b,c,x0)
[x,fval] = fminunc(@nestedfun,x0);
% Nested function that computes the objective function
function y = nestedfun(x)
y = (a - b*x(1)^2 + x(1)^4/3)*x(1)^2 + x(1)*x(2) +...
(-c + c*x(2)^2)*x(2)^2;
end
end
创建main.m文件
a = 4; b = 2.1; c = 4;% Assign parameter values
x0 = [0.5,0.5];
[x,fval] = runnested(a,b,c,x0)
在命令行中输入main,即可得到结果

3、全局变量
将非自变量的变量声明为全局变量
创建一个.m文件,文件名globalfun
function y = globalfun(x)
global a b c
y = (a - b*x(1)^2 + x(1)^4/3)*x(1)^2 + x(1)*x(2) + ...
(-c + c*x(2)^2)*x(2)^2;
创建main.m文件
global a b c;
a = 4; b = 2.1; c = 4; % Assign parameter values
x0 = [0.5,0.5];
[x,fval] = fminunc(@globalfun,x0)
在命令行中输入main,即可得到结果

参考:https://ww2.mathworks.cn/help/optim/ug/passing-extra-parameters.html
网友评论