使用fmincon

时间:2016-02-27 16:19:57

标签: matlab math constraints solver nonlinear-optimization

我正在尝试解决最大化函数s.t. 14个约束和15个变量。 其中一些是线性的,一些不是。它们都是方程式(没有不等式)。

我尝试使用&fsolve'和'解决',使用lagrange(最终得到29个方程式和30个变量) - 这样做并没有那么好......

我转到了fmincon。我在一个名为objectfun.m的文件中设置了一个带有目标函数的脚本:

function f = objectfun(x,I,rho)

% SWAPPING VARIABLE NAMES FOR READABILITY:
w = x(1);
t = x(2);
beta = x(3);
r = x(4);

% VALUE FUNCTION TO BE MINIMIZES:
f = -(rho*w*(1-t)+beta+I*(1+(1-t)*r));

我已经设置了另一个约束:

function [c, ceq] = confun(x,...
    Bs,Bu,sigma_s,sigma_u,rho,c_bar,I,A,alpha)

% SWAPPING VARIABLE NAMES FOR READABILITY:
w = x(1);
t = x(2);
beta = x(3);
r = x(4);
vum = x(5);
vsm = x(6);
ms = x(7);
cstar = x(8);
zs = x(9);
zu = x(10);
H = x(11);
K = x(12);
Y = x(13);
L = x(14);
mu = x(15);

% INEQUILITY CONSTRAINTS:
c = [];

% EQUALITY CONSTRAINTS:
ceq = [ms-Bs*vsm^sigma_s;               % 1
    mu-Bu*vum^sigma_u;                  % 2
    (1+r*(1-t))*cstar-(1-rho)*w*(1-t);  % 3
    zs-cstar/c_bar;                     % 4
    zu-1+zs;                            % 5
    H-(cstar^2)/(2*c_bar);              % 6
    I-K-H;                              % 7
    A*(K^alpha)*(L^(1-alpha))-Y;        % 8
    L-(zs+rho*zu+ms+rho*mu);            % 9
    w-(1-alpha)*A*(K/L)^alpha;          % 10
    r-alpha*A*(K/L)^(alpha-1);          % 11
    t*Y-beta*(1+ms+mu);                 % 12
    vum-rho*w*(1-t)-beta;               % 13
    vsm-w*(1-t)-beta];                  % 14

主要剧本:

%% Parameters:
Bs =0.0;
Bu =0.0;
sigma_s = 1.5;
sigma_u = 1.5;
rho = 0.33;
c_bar = 6;
I = 3;
A = 1;
alpha = 0.33;

%% Numeric Solution:
x0 = 0.5*ones(length(var_names),1);

objective = @(x)objectfun(x,I,rho);

constraints = @(x)confun(x,...
    Bs,Bu,sigma_s,sigma_u,rho,c_bar,I,A,alpha);

options = optimoptions(@fmincon);

[s,fval] = fmincon(objective,x0,[],[],[],[],[],[],constraints,options);

问题: 解决方案是胡说八道。我多次查看方程式 - 让我们假设他们的好处! (请...... [=]

  1. 我是否为我的问题选择了正确的应用程序(fmincon)?
  2. 结构或代码是否有问题?
  3. 您对如何让我的生活更轻松有任何建议吗?
  4. 我计划使用不同的参数值迭代解决方案。有没有办法验证解决方案,对于给定的集合,只是为了查看解决方案是否正确?
  5. 提前致谢!!!

1 个答案:

答案 0 :(得分:0)

您可以执行以下操作:

  1. 为所有变量提供合理的界限。这将阻止求解器进入无意义的区域,以及无法评估函数(和渐变)的区域。
  2. 提供更好的起点。
  3. 提供渐变。除非你有一个可以自动区分的系统,否则提供正确和精确的渐变通常很重要。 (有些求解器也可能需要二阶导数)。
  4. 如果您有针对给定数据集的已知解决方案,请将其作为初始点传递,并查看会发生什么。此外,您可以通过设置等于此已知解决方案的下限和上限来修复此解决方案,然后查看当时会发生什么。
  5. 尝试更强大的建模系统/解算器。例如。带有CONOPT的GAMS通常用于经济建模,并提供自动区分,并在出现问题时提供更好的反馈。这是一个小问题,因此您应该能够使用免费的学生/演示版本(http://gams.com/download/)运行它。其他建议也可以在这里应用。