利用fmincon在MATLAB中实现非线性约束下的最大化

利用fmincon在MATLAB中实现非线性约束下的最大化,matlab,math,constraints,solver,nonlinear-optimization,Matlab,Math,Constraints,Solver,Nonlinear Optimization,我试图解决最大化函数s.t.14约束和15个变量。 有些是线性的,有些不是。它们都是等式(没有不等式) 我尝试过使用“fsolve”和“solve”,使用拉格朗日(最终得到29个方程和30个变量)-但效果不太好 我转到了fmincon。我在一个名为objectfun.m的文件中设置了一个带有目标函数的脚本: function f = objectfun(x,I,rho) % SWAPPING VARIABLE NAMES FOR READABILITY: w = x(1); t = x(2);

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

我尝试过使用“fsolve”和“solve”,使用拉格朗日(最终得到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);
问题是: 解决办法是胡说八道。我把这些方程式看了很多遍——让我们假设它们是好的!(请……[=)

  • 我是否为我的问题选择了正确的应用程序(fmincon)
  • 结构或代码是否有问题
  • 你对如何让我的生活轻松一点有什么建议吗
  • 我计划使用不同的参数值对解决方案进行迭代。对于给定的集合,是否有任何方法来验证解决方案,只是为了看看解决方案是否正确

  • 提前感谢!!!

    以下是您可以做的一些事情:

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

  • 非常感谢!边界-我在约束函数中加入了不等式约束(特别是在“c”中)?我一定会尝试Gams,谢谢你的建议。不。使用lb,ub。fmincon上的帮助页面提供了有关如何使用它的帮助。