2015-04-30 19 views
2

我有以下問題:Matlab優化,其中客觀是由一個固定點公式隱含給出

max CEQ(w)s.t. (0,1)中的w,除了由CEQ(w)= F(CEQ(w))形式的不動點方程給出外,我對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 

即,在循環中,我修復瓦特,解決定點方程和存儲用於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); 
+0

這看起來像一個不錯的辦法。你在哪裏遇到麻煩? – Peter

+0

我的建議不起作用。似乎fzero函數不想被視爲w的函數。例如,如果我鍵入CEQ_DA(0.5),我會得到fzero命令的錯誤:沒有足夠的輸入參數。 (顯然是因爲它仍然需要兩個輸入)。循環的東西需要很長時間,並不是很精確。 – marky2k

回答

1

您建議的解決方案非常接近。換句話說,您將fp定義爲兩個參數的函數,並且希望CEQ_DA是w的函數,該函數解決了CEQ的fp與給定w的問題。唯一的問題是fzero不知道要解決哪個fp參數,因爲它不能通過名稱匹配匿名函數參數和fp參數。

答案又是一個更匿名函數的fzero裏面,把fp(CEP,w)fp_w(CEP),這將是對solveable CEQ

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

是的,這是有道理的。謝謝 ! – marky2k