fmincon выдает ошибку при вводе аргументов - PullRequest
0 голосов
/ 03 мая 2019

Я работаю над проблемой оптимизации, где я хочу максимизировать полезность при поиске по переменным lx_init и kx_init. Каждый раз, когда я решаю проблему с помощью fmincon, появляется другая. Ошибка сейчас ..

"Недостаточно входных аргументов." «Ошибка в начальной оценке целевой функции. FMINCON не может продолжаться».

Я пытался отследить ошибку в режиме отладки, но отследить мою ошибку оказалось сложно. Функция может быть оценена сама по себе и вывести значение, поэтому я знаю, что ошибка в функции fmincon. Мой опыт работы с Matlab очень минимален. Я уверен, что есть другие синтаксические ошибки, в которых я виновен и слишком наивен, чтобы видеть. Я предоставлю все переменные, чтобы код мог быть воспроизведен.

Второй вопрос: я хочу максимизировать значение моей полезности здесь, но также найти значения x и y, заданные после того, как утилита будет максимизирована. Тем не менее, мы также максимизируем lx_init и kx_init. Как получить функцию, возвращающую x и y? Сейчас он просто возвращает значение утилиты.

Вот моя функция, которую я оптимизирую

function [utility, x, y] = utility_with_prod(gamma_X, gamma_Y, alpha_LX, alpha_KX, alpha_LY, alpha_KY, alpha_uX, sigma_U, sigma_X, sigma_Y, L_bar, K_bar, lx_init, kx_init)
   % X's production function
   x = gamma_X*((alpha_LX*lx_init^((sigma_X-1)/sigma_X)) + ((alpha_KX)*kx_init^((sigma_X-1)/sigma_X)))^(sigma_X/(sigma_X-1));

   % Y's production function
   y = gamma_Y*((alpha_LY*(L_bar-lx_init)^((sigma_Y-1)/sigma_Y)) + ((alpha_KY)*(K_bar-kx_init)^((sigma_Y-1)/sigma_Y)))^(sigma_Y/(sigma_Y-1));

   % utility function with nested production function
   utility = -(((alpha_uX*x^((sigma_U-1)/sigma_U)) + ((1-alpha_uX)*y^((sigma_U-1)/sigma_U)))^(sigma_U/(sigma_U-1)));
end

Вот мои начальные значения

sigma_U= 0.5038;
sigma_X= 0.5029;
sigma_Y= 0.5029;

alpha_uX= 0.000236017865342454;

alpha_LX= 0.180813595922536;
alpha_KX= 0.819186404077464;
gamma_X= 1.768587207836113;

alpha_LY= 0.505368332690592;
alpha_KY= 0.494631667309408;
gamma_Y= 1.999942066647923;

lx_init = 1;
kx_init = 2;
L_bar = 3;
K_bar = 3;
x0 = [lx_init, kx_init];

и оптимизация

utility = @(lx_init, kx_init)utility_with_prod(gamma_X, gamma_Y, alpha_LX, alpha_KX, alpha_LY, alpha_KY, alpha_uX, sigma_U, sigma_X, sigma_Y, L_bar, K_bar, lx_init, kx_init)

[optimal_lx_kx, utility_max, exitflag] = fmincon(utility, x0, [],[]) 

1 Ответ

1 голос
/ 03 мая 2019
  • x0 в fmincon - это вектор, это матрица n на 1 или 1 на n, здесь 1 на 2 ---> x0 = [lx_init, kx_init];

  • Функциональная ручка @(lx_init, kx_init) отличается от @([lx_init, kx_init]).

    @([lx_init, kx_init]) принимает только один вход.

    @(lx_init, kx_init) принимает только два входа, не более, не менее

  • Также входная переменная не должна иметь предопределенного значения

  • Измените @(lx_init, kx_init) на @(x), где x(1) = lx_init и x(2) = kx_init

Подводя итог

utility = @(lx_init, kx_init)utility_with_prod(gamma_X, gamma_Y, alpha_LX,alpha_KX, alpha_LY, alpha_KY, alpha_uX, sigma_U, sigma_X, sigma_Y, L_bar, K_bar, lx_init, kx_init)

заменяется на

utility = @(x)utility_with_prod(gamma_X, gamma_Y, alpha_LX, alpha_KX, alpha_LY, alpha_KY, alpha_uX, sigma_U, sigma_X, sigma_Y, L_bar, K_bar, x(1), x(2))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...