-1

我希望最小化(使用 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通过改变Omegafor Omega >0with来最小化

  • lambda- 标量
  • Passetcovar- <8 x 8 双>
  • tau - 标量
  • Pmat- <3 x 8 双>
  • Omega-标量
  • Q- <3 x 1 双>
  • Pi- <8 x 1 双>
4

4 回答 4

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);

它显示一个简单的图形并打印:

本地最小值:-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.
于 2013-07-30T16:29:18.643 回答
3

首先,是sigma行向量吗?如果不是,那么f也是一个向量。你在尝试多目标优化吗?那就fminsearch无济于事了。

其次,fminsearch使用前请阅读文档。f应该是将输入向量映射到标量的函数。此外,它需要一个起点x0

因此,编写一个函数f,接收omega并返回一个标量目标函数值。另外,找出一个可行的x0(即 的起始值omega)。

第三,fminsearch不允许约束。f你可以Infomega <= 0. 我会推荐fmincon

你的函数应该是这样的。确保所有其他变量,如PMap,tau等。可全球访问。否则,您将需要一个匿名函数来传递给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,.....)

其中......代表所有其他变量。然后您可以通过以下方式使用匿名函数

g = @(omega)f(omega,PMap,sigma,.....);

现在您可以使用ginfminconfminsearch.

于 2013-07-30T16:30:05.853 回答
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)

如果您看到没有极端峰值,并且该函数温和地接近局部最小值(而不是在那里跳跃),这可能是一个不错的方法。

如果您对函数行为感到满意,您可以通过设置rangeMinrangeMax仅评估您感兴趣的区域来提高准确性。如果您对行为不满意,您可以尝试增加是否有stepNumber帮助。

于 2013-08-09T09:55:42.553 回答
1

这个目标并不是那么复杂。但是你写它看起来很复杂。

首先,欧米茄是一个标量!为什么要写 inv(omega)?除以 omega 是一个更好的主意,因为它不会涉及反函数的开销。

接下来,tau 是一个已知的常数标量,Passetcovar 也是如此。为什么每次调用函数时都要计算矩阵的逆矩阵 (tau*Passetcovar)?不仅如此,您还可以在一行中计算相同的逆矩阵三次。学习预先计算这些东西。它将为您节省很多时间和很多麻烦。

不管怎样,你对 inv 很着迷。它在一行中被调用了 6 次,并且大多数调用都是多余的。

让我们重写你的那一行。首先,预先计算 inv(Passetcovar),将整个事情传递给你的目标,所以你只需要做一次。

注意基本身份:

inv(k*A) = inv(A)/k

这对任何非零标量 k 都有效。

IP = inv(Passetcovar);

同样,不要在每次调用目标函数时重复 inv(Passetcovar) 的计算。相反,在开始优化之前计算一次。

所以计算变得更容易阅读:

wcalc = IP./lambda*inv(IP./tau + PMat(i,:)'*PMat(i,:)/omega)*(IP*Pi./tau + PMat(i,:)'*Q(i,:)/omega);

编辑:

最后我们知道 Pi 是一个向量。我想它必须是一个 8x1 向量,以便数组乘法符合。

我们可以通过分解出一些常数并在方便的地方插入括号来节省更多的除法和乘法。请注意,通过首先计算矩阵*向量乘法,然后乘以 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。现在这是一个标量。

我建议首先绘制函数,只是为了了解它的形状,看看什么可能是 omega 的一个好的起始值。因此,通过在 myfun 周围包装一个函数句柄,ezplot 将很好地绘制绘图,这里对于 omega 的范围为 [0,100]。如果不合理,请选择您自己的 omega 上限。

ezplot(@(omega) myfun3(wk,omega,lambda,Passetcovar,tau,PMat,i,Pi,Q),[0,100])

因此,简单的解决方案是使用 fminbnd,为上限提供一些合理但足够大的值。fminbnd 的一个好处是它不需要起始值。您需要为 omega 选择一个合理的上限。关键是,使用旨在最小化标量函数的工具。不需要像 fmincon 这样的通用优化器,并且需要一个起始值。

finalomega = fminbnd(@(omega) myfun3(wk,omega,lambda,Passetcovar,tau,PMat,i,Pi,Q),[0,100])

您还可以使用在文件交换中找到的fminsearchbnd 。它可以最小化仅受下限约束的函数,但 fminsearchbnd 将需要 omega 的起始值。

于 2013-08-29T13:22:27.873 回答