Matlab优化,其中目标由不动点方程隐式给出



我有以下问题:

max-CEQ(w)s.t.w在(0,1)中,并且我对CEQ(w)一无所知,除了它是由形式为CEQ(w)=F(CEQ(V))的不动点方程给出的。如果我固定一个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);

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

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

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

最新更新