【问题标题】:Matlab optimiziation where objective is implicitly given by a fixed point equationMatlab优化,其中目标由不动点方程隐式给出
【发布时间】:2019-07-07 07:08:33
【问题描述】:

我有以下问题:

最大 CEQ(w) s.t. w in (0,1) 而我对 CEQ(w) 一无所知,除了由 CEQ(w) = F(CEQ(w)) 形式的不动点方程给出。如果我固定 w,我可以使用 fzero 函数求解定点方程并获得 CEQ 的值。如果我选择不同的 w,我会得到另一个 CEQ 值。因此,我可以遍历 w 的所有可能值,然后选择给出最高 CEQ 的值。虽然这似乎是不好的编程,我想知道我是否可以在 MATLAB 中更有效地做到这一点:我想将我的定点方程的解建模为 w 的函数,但我不知道如何实现它。

更准确地说,这里是一个示例代码:

clear all
clc

NoDraws = 1000000;
T_hat = 12;
mu = 0.0058;
variance = 0.0017;
rf = 0.0036;
sim_returns(:,T_hat/12) = T_hat*mu + sqrt(T_hat*variance)*randn(NoDraws,1);

A = 5;
kappa=1;
l=0;
theta = 1 - l*(kappa^(1-A) - 1) *(kappa>1);

CEQ_DA_0 = 1.1; 
CEQ_opt = -1000;
w_opt = 0;

W_T = @(w) (1-w)*exp(rf*T_hat) + w*exp(rf*T_hat + sim_returns(:,T_hat/12));
for w=0.01:0.01:0.99
    W=W_T(w);
    fp = @(CEQ) theta*CEQ^(1-A)/(1-A) - mean( W.^(1-A)/(1-A)) + l*mean( ((kappa*CEQ)^(1-A)/(1-A) - W.^(1-A)/(1-A)) .* (W < kappa*CEQ)); 
    CEQ_DA = fzero(fp,CEQ_DA_0);
    if CEQ_DA > CEQ_opt
        CEQ_opt = CEQ_DA;
        w_opt = w;
    end
end

也就是说,在循环中,我固定 w,求解不动点方程并存储 CEQ 的值。如果某个其他 w 为 CEQ 提供了更大的值,则当前最优 w 将被新的 w 替换。我想要的(而不是循环部分)是这样的:

fp = @(CEQ,w) theta*CEQ^(1-A)/(1-A) - mean( W_T(w).^(1-A)/(1-A)) + l*mean( ((kappa*CEQ)^(1-A)/(1-A) - W_T(w).^(1-A)/(1-A)) .* (W_T(w) < kappa*CEQ)); 
CEQ_DA = @(w) fzero(fp,CEQ_DA_0);
[w_opt, fval]=fminbnd(CEQ_DA,0,1);

【问题讨论】:

  • 这看起来是个好方法。你哪里有问题?
  • 我的建议不起作用。似乎 fzero 函数不想被视为 w 的函数。例如,如果我键入 CEQ_DA(0.5),我会收到 fzero 命令的错误:输入参数不足。 (显然是因为它仍然需要两个输入)。循环的东西需要很长时间而且不是很精确..

标签: matlab optimization fixed-point-iteration


【解决方案1】:

您提出的解决方案非常接近。换句话说,您将fp 定义为两个参数的函数,并希望CEQ_DA 成为w 的函数,它为CEQ 求解fp,给定w。唯一的问题是fzero不知道要解决fp的哪个参数,因为它无法通过名称匹配匿名函数参数和fp参数。

答案是 fzero 中的另一个匿名函数,将 fp(CEP,w) 转换为 fp_w(CEP),这对于 CEQ 是可以解决的

CEQ_DA = @(w) fzero(@(CEQ) fp(CEQ, w),CEQ_DA_0);

【讨论】:

  • 是的,这是有道理的。谢谢!
猜你喜欢
  • 2023-04-04
  • 2012-10-25
  • 1970-01-01
  • 2023-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-20
相关资源
最近更新 更多