我在excel中有数据,我用它来进行优化分析。在excel中,使用求解器很简单:我可以选择带公式的单元格,然后选择需要更改的单元格并添加约束,然后最小化。但是,当谈到Matlab的优化过程时,我迷失了方向。文档似乎只提供了分析简单单行函数的优化问题示例,如f(x)= - (x1)(x2)(x3)。我无法弄清楚如何在我自己的案例中应用这些例子。
我想要最大化的功能相对复杂。作为输入,它采用了许多标量变量以及包含计算中使用的数据的多个结构。
我的问题是我试图通过改变三个标量变量来最大化函数的值,同时保持其他输入变量不变(因为它们是数据)。更具体地说,我的功能类似于:
function x = NameOfFunction (w1, w2, w3, a, b, c, Structure1, Structure2, Structure3)
我想通过仅更改变量w1,w2和w3来最大化x。换句话说,我想让Matlab告诉我最大化x的w1,w2和w3的值,同时保留所有其他变量。非常感谢任何见解。
答案 0 :(得分:5)
您可能最终会在MATLAB中找到fmincon
或fminunc
的解决方案。例如,使用fminunc
因为它的语法不那么混乱,您可以先在一个名为“NameOfFunction.m”的单独文件中定义成本函数:
function cost = NameOfFunction(w, a, b, c, Structure1, Structure2, Structure3)
% Your code goes here, just remember that you return a scalar-valued cost from
% this function.
请注意,fminunc
及类似内容会尝试最小化此费用函数。如果您需要最大化它,那么最后将最终成本乘以-1
。接下来,在主文件中创建函数句柄:
h = @(w)NameOfFunction(w, a, b, c, Structure1, Structure2, Structure3);
其中w
是您要优化的变量的向量:
w = [w1, w2, w3];
这基本上掩盖了你的所有输入的功能,只是你想要优化的功能w
,就fminunc
而言。这样,您就可以将参数a
,b
,c
,Structure
,Structure2
和Structure3
传递给费用函数{{1没有NameOfFunction
触摸它们。现在,您可以通过对向量fminunc
fminunc
w
并且w0 = [w1_init, w2_init, w3_init];
[w, fval] = fminunc(h, w0);
应该找到fminunc
向量的最佳值,以便最小化(注意,它会找到最小值)您的成本函数。
在这种情况下,您最有可能使用w
。如果您的约束是在您正在优化的每个参数的上限和下限的形式,那么将它们放入向量中:
fmincon
使用ub = [w1_upper, w2_upper, w3_upper];
lb = [w1_lower, w2_lower, w3_lower];
调用与之前相同的句柄:
fmincon
上面的四个[w, fval] = fmincon(h, w0, [], [], [], [], lb, ub);
只是您未使用的参数的占位符。 []
也可以处理更复杂的约束;查看文档(在本讨论开始时链接)以获取更多详细信息。