我希望最小化(使用fmincon或类似)以下函数:
function Difference= myfun3(wk,omega,lambda,Passetcovar,tau,PMat,i,Pi,Q)
wcalc=inv(lambda* Passetcovar)*inv(inv(tau * Passetcovar)+ PMat(i,:)'*inv(omega)*PMat(i,:))*(inv(tau * Passetcovar)*Pi+ PMat(i,:)'*inv(omega)*Q(i,:));
Difference=sum((wk-wcalc).^2);
end
wk
和wcalc
是< 8 x 1 double>列向量,其中wk是已知的,wcalc由上式给出。
如何通过Difference
改变Omega
Omega >0
答案 0 :(得分:3)
您通常需要关于函数的一些事情,以确保局部最小值实际上是全局最小值(例如,函数是凸的)。是这种情况吗?
假设它是,或者您只想找到局部最小值,请考虑以下示例:
clear all
close all
clc
f = @(x) (x+3).^2;
x = linspace(-5,5,100);
y = f(x);
plot(x,y);
ymin = fminsearch(f, 0);
printf('Local min found at: %f\n', ymin);
显示一个简单的图形并打印:
Local min found at: -3.000000
请注意,您必须指定搜索的起点。在这种情况下,我使用0.当你只给fminsearch
一个参数时,它期望参数是一个结构,它看起来不像你正在使用。
来自help fminsearch
:
X = fminsearch(PROBLEM) finds the minimum for PROBLEM. PROBLEM is a
structure with the function FUN in PROBLEM.objective, the start point
in PROBLEM.x0, the options structure in PROBLEM.options, and solver
name 'fminsearch' in PROBLEM.solver. The PROBLEM structure must have
all the fields.
您可能想要这种用法:
X = fminsearch(FUN,X0) starts at X0 and attempts to find a local minimizer
X of the function FUN. FUN is a function handle. FUN accepts input X and
returns a scalar function value F evaluated at X. X0 can be a scalar, vector
or matrix.
答案 1 :(得分:3)
首先,sigma
是行向量吗?如果没有,那么f
也是一个向量。你在尝试多目标优化吗?然后fminsearch
无济于事。
其次,在使用之前阅读fminsearch
的文档。 f
应该是一个将输入向量映射到标量的函数。此外,它还需要一个起点x0
。
因此,编写一个函数f
,它接收omega
并返回一个标量目标函数值。另外,找出一个可行的x0
(即omega
的起始值)。
第三,fminsearch
不允许约束。您可以通过f
返回Inf
或omega <= 0
时的某些内容来破解它。我建议fmincon
。
你的功能应该是这样的。确保所有其他变量,如PMap,tau
等。全球可访问。否则,您需要anonymous function传递给fminsearch
。
obj = f(omega)
wcalc=inv(lambda* sigma)*inv(inv(tau * sigma)+ PMap(i,:)'*inv(Omega)*PMap(i,:))*(inv(tau * sigma)*pi+ PMap(i,:)'*inv(Omega)*Q(i,:));
obj = sigma*(wk-wcalc).^2;
然后使用fmincon
。假设您有omega
的起始值。
fmincon(f,omega,[],[],[],[],0,Inf);
添加了[]
,因为我们只想使用此表单从下面绑定您的解决方案。
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)
你的f
看起来像这样吗?
obj = f(omega,PMap,sigma,.....)
......
表示所有其他变量。然后,您可以按以下方式使用anonymous functions。
g = @(omega)f(omega,PMap,sigma,.....);
现在,您可以在g
或fmincon
中使用fminsearch
。
答案 2 :(得分:2)
由于你有一个相当复杂的功能,并且只想改变1个标量,我会说:考虑使用蛮力。
以下是如何执行此操作的示例(假设已定义所有必需变量)。
rangeMin = 0;
rangeMax = 10; %Put an assumed upper bound for Omega here
stepNumber = 10000;
Omega = linspace(rangeMin, rangeMax, stepNumber);
result = Inf(size(Omega))
for t = 1:length(Omega)
wcalc(t)=inv(lambda* sigma)*inv(inv(tau * sigma)+ PMap(i,:)'*inv(Omega(t))*PMap(i,:))*(inv(tau * sigma)*pi+ PMap(i,:)'*inv(Omega(t))*Q(i,:));
end
wcalcMin = min(wcalc)
OmegaMin = find(wcalc == wcalcMin)
如果你想看看这个功能实际上是什么样的,你现在可以做到
plot(wcalc)
如果你发现没有极端尖峰,并且该功能轻轻接近局部最小值(而不是跳到那里),这可能是一个不错的方法。
如果您对功能行为感到满意,可以通过将rangeMin
和rangeMax
设置为仅评估您感兴趣的区域来提高准确度。如果您对此行为不满意,可以尝试增加stepNumber
是否有帮助。
答案 3 :(得分:1)
这个目标并不是那么复杂。但你写的看起来很复杂。
首先,欧米茄是一个标量!为什么要写inv(omega)呢?除以omega是一个更好的主意,因为它不会涉及反函数的开销。
接下来,tau是一个已知的常数标量,就像Passetcovar一样。为什么每次调用函数时计算矩阵的反函数(tau * Passetcovar)?不仅如此,你还可以在一行中计算相同的逆矩阵三次。学会预先计算这些东西。它会为你节省很多时间和许多麻烦。
无论如何,你对inv有一种痴迷。它在一行中被调用了6次,而且大多数调用都是多余的。
让我们重写你的那一行。首先,预先计算inv(Passetcovar),将整个事物传递到你的目标中,所以你只需要做一次。
请注意基本身份:
inv(k*A) = inv(A)/k
对任何非零标量k都有效。
IP = inv(Passetcovar);
同样,每次调用目标函数时都不要重复inv(Passetcovar)的计算。而是在开始优化之前将其计算为ONCE。
因此,计算变得有点简单:
wcalc = IP./lambda*inv(IP./tau + PMat(i,:)'*PMat(i,:)/omega)*(IP*Pi./tau + PMat(i,:)'*Q(i,:)/omega);
编辑:
最后我们了解到Pi是一个向量。我想它必须是一个8x1向量,才能使数组乘法符合。
我们可以通过分解一些常数,并在方便的位置插入一个parens来节省一些除法和乘法。注意,通过计算矩阵*向量乘以FIRST,然后乘以IP,我们将8x8 * 8x8乘法转换为8x8 X 8x1乘法。对于像这样的小阵列,差异并不大,但值得记住这个想法。
wcalc = IP*(inv(IP + tau*PMat(i,:)'*PMat(i,:)/omega)*(IP*Pi + PMat(i,:)'*Q(i,:)/omega*tau))/(lambda*tau^2);
目标是最小化wcalc和wk之间的平方和,受正面欧米茄影响。现在这是一个标量。
我建议首先绘制函数,只是为了了解它的形状,并看看omega可能是一个很好的起始值。因此,通过在myfun周围包裹一个函数句柄,ezplot可以很好地完成这个图,这里的欧米茄范围为[0,100]。如果这是不合理的,请选择你自己的欧米茄上限。
ezplot(@(omega) myfun3(wk,omega,lambda,Passetcovar,tau,PMat,i,Pi,Q),[0,100])
因此,简单的解决方案是使用fminbnd,为上限提供一些合理但足够大的值。关于fminbnd的一个好处是它不需要起始值。您需要为欧米茄选择合理的上限。关键是,使用一种旨在最小化标量函数的工具。不需要像fmincon这样的常规优化器,并且需要起始值。
finalomega = fminbnd(@(omega) myfun3(wk,omega,lambda,Passetcovar,tau,PMat,i,Pi,Q),[0,100])
您还可以使用在文件交换中找到的fminsearchbnd。它可以最小化仅受下限约束的函数,但fminsearchbnd将需要omega的起始值。