首页 文章

使用fmincon在MATLAB中在非线性约束下最大化

提问于
浏览
0

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

我尝试使用'fsolve'和'solve',使用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);

问题:解决方案是无稽之谈 . 我多次研究方程式 - 让我们假设它们是好的! (请... [=]

  • 我是否为我的问题(fmincon)选择了正确的应用程序?

  • 结构或代码是否有问题?

  • 您对如何让我的生活更轻松有任何建议吗?

  • 我计划使用不同的参数值迭代解决方案 . 有没有办法验证解决方案,对于给定的集合,只是为了查看解决方案是否正确?

提前致谢!!!

1 回答

  • 0

    您可以执行以下操作:

    • 为所有变量提供合理的界限 . 这将阻止求解器进入无意义的区域,以及无法评估函数(和渐变)的区域 .

    • 提供更好的起点 .

    • 提供渐变 . 除非您拥有可以自动区分的系统,否则提供正确且精确的渐变通常很重要 . (有些求解器也可能需要二阶导数) .

    • 如果您有针对给定数据集的已知解决方案,请将其作为初始点传递,并查看会发生什么 . 此外,您可以通过将下限和上限设置为等于此已知解决方案来修复此解决方案,然后查看会发生什么 .

    • 尝试更强大的建模系统/解算器 . 例如 . 带有CONOPT的GAMS通常用于经济建模,并提供自动区分,并在出现问题时提供更好的反馈 . 这是一个小问题,因此您应该能够使用免费的学生/演示版本(http://gams.com/download/)运行它 . 其他建议也可以在这里应用 .

相关问题