我想在MATLAB中使用fminunc
函数优化一个无约束多变量问题。这里有一个例子:
最小化函数f(w)=x'Ax
创建一个文件myfun.m:
function f = myfun(x)
f = x'*A*x + b'x
然后调用fminunc
在x0
:附近找到myfun
的最小值
[x,fval] = fminunc(@myfun,x0).
我的问题是,在我的算法中,myfun.m中的矩阵A
和向量b
不是固定的,但可以在循环中更改,所以我无法手动键入它们。如何将值传递给A
和b
?
有几个选项可以将额外的参数传递给目标函数。对于像您这样的简单函数,您可以创建一个匿名函数,该函数将在创建时保存A
和b
的值:
A = myMatA();
b = myVecb();
myfun = @(x) x.'*A*x + b.'*x;
[x,fval] = fminunc(myfun,x0); % use no @ with an anonymous function
另外两个选项是全局变量(没错!)和嵌套函数。嵌套函数版本如下所示:
function [x,fval] = myopt(A,B,x0)
[x,fval] = fminunc(@myfunnested,x0);
function y = myfunnested(x)
y = x.'*A*x + b.'*x;
end
end
但我认为你不会用fminunc
来解决x'Ax + b'x
的最小化。。。