算法中的问题

2次查看(最近30天)
Panagiotis Veneris
Panagiotis Veneris 2021年6月19日
你好,
我是并行计算的新手,我正在尝试并行化我的(相对密集的)代码,以使它运行得更快。然而,我面临着很多我无法解决的问题。代码如下:
对政策功能的初步猜测
c_pol = max(cmin, r*ones(S,1) * b_grid);
c_poli = c_pol;%的下一个迭代
猜测V_t+1
负载CRRA.mat%从CRRA箱中装载c_pol和n_pol,以原始GL代码(在终端SS部分开始前检查行)
v_pol = (1 / (1-bet)) * (c_pol。^ (1-gam) / (1-gam)) + pssi * (((1-n_pol)。^ (1-eta)) / (1-eta));
v_poli = v_pol;%的下一个迭代
差异= 1;
dif > tol_pol
ui =公关* (((-v_pol)。^ (t1)。* (c_pol。^ (gam)));
UI = UI(:,b_grid> = -phi);
v_u = Pr *((-v_pol).^(1-alpha));
V_un = v_u(:,b_grid>= -phi);
V_con = v_u(:,b_grid < -phi);
s = 1: s这里我需要并行化
c = ((1 + r) *注* ((v_un(年代,:))。^(α/(1α)。* ui(年代,:)))。^ (1 / gam);
N = max(0,1 - fac(s)*c.^gameta);
b = b_grid (b_grid > =φ)/ (1 + r) + c -θ(s) * n - z(年代);
v = c。^ (1-gam)。* ((1 / (1-gam))) + pssi *(((其它)。^ (1-eta)) / (1-eta)) -赌* ((v_un(年代,:))。^(1 /(1α)));
如果b(1) >φ
c_c = linspace(cl(s),c(1),IC);% * * *
N_c = max(0,1 - fac(s)*c_c.^gameta);
B_c = - (1+r) + c_c - (s)*n_c - z(s);
六世= cl (1,1) ^ (1-gam)。* ((1 / (1-gam))) + pssi * (((1-n_c)。^ (1-eta)) / (1-eta)) -赌* ((v_un(1,1))。^(1 /(1α)));
v_c = linspace(六世(1),v (1), Ic);
b = [b_c(1:Ic-1), b];
c = [c_c(1:Ic-1), c];
v = [v_c(1:Ic-1), v];
结束
C_poli (s,:) = interp1(b, c, b_grid,)“线性”“extrap”);%真实c_t + 1
V_poli (s,:) = interp1(b, v, b_grid,“线性”“extrap”);%真实v_t + 1
v_poli (v_poli > 0) = 1 e-6;
结束
%检查收敛性
C_poli = max(C_poli, cmin);
V_poli = min(V_poli, cmin);
Dif1 = max(max(abs(c_poli - c_pol)));
dif2 = max (max (abs (v_poli-v_pol)));
dif = max ([dif1 dif2]);
% 更新
c_pol = c_poli;
v_pol = v_poli;
结束
尝试使用“parfor”,我得到以下错误“无法分类变量'v_poli'在parfor循环体”,我不知道如何修复。
任何帮助都将不胜感激

接受的答案

沃尔特·罗伯森
沃尔特·罗伯森 2021年6月19日
改变
V_poli (s,:) = interp1(b, v, b_grid,“线性”“extrap”);%真实v_t + 1
v_poli (v_poli > 0) = 1 e-6;
v_polis = Interp1(b,v,b_grid,“线性”“extrap”);%真实v_t + 1
V_POLIS(V_POLIS> 0)= - 1E-6;
: v_poli (s) = v_polis;
否则你正在试图测试 所有 v_poli(),包括由其他循环迭代创建的行。
5个评论
Panagiotis Veneris
Panagiotis Veneris 2021年7月1日
%管家
%关闭所有;
清晰;
clc;
%=========================================================================
% 1。设置参数
%=========================================================================
方便的参数从劳动力供应方程作为全局
全局的z fac
%固定参数
gam = 4;EIS的倒数%
弗里希= 1;平均弗里希最后。
r = 2.5/400;% ss利率
RA = 10;%风险规避
α= 1-RA /访问;% a=0 (RA=gam)降低为CRRA病例
%校准目标
不= 0.4;平均工作时数%
nu_Y = 0.4;每GDP的收益
B_4Y = 1.6;%流动财富每年GDP
D1_4Y = 0.18;在初始ss中,债务占年度GDP的比例为% HH
D2_4Y = 0.08;s航站楼的债务占年GDP的比例
休闲曲线紧随其后
= 1/frisch * (1 - NE) / NE;
Gameta = gam / eta;
%的数值参数
麦克斯特= 500;%校准中最大的迭代次数
cmin = 1 e-6;%消费下限
tol_pol = 1平台以及;策略功能的%容忍LVL
tol_dist = 1e-10;%容差LVL用于分配
tol_mkt = 1 e-6;市场出清的容许LVL %
tol_cali = 1e-4;%容差LVL用于校准
%资产网格
我= 200;债券网格点的百分比
Ic = 100;% Ic =2;
Bmin = -2;%下限
bmax = 50;%上界
b_grid = bmin + ((1:I)/I)。^2 * (bmax - bmin);%密度为低值
db = 0.01;% MPC步长
收入冲击过程
Load Inc_Process%Loads X,Pr,Pr
Tauchen方法生成的使用状态的12-状态马尔可夫链
% x: log生产率(实际工资)
% Pr:转移矩阵
% pr:不变分布
%增加失业
θ= [0;exp (x)];
S =长度(θ);生产率的州数百分比(生产率/实际工资为13个州)
鳍= 0.8820;%求职概率
9月= 0.0573;%分离概率
%新转换矩阵
Pr = [1-fin, fin* Pr;9月* (s - 1, - 1), (1-sep) *公关];
找到新的不变分布
Pr = [0, Pr];
差异= 1;
而dif> tol_dist
革命制度党=公关*公关;
dif = max (abs (pri-pr));
Pr = pri;
结束
%校准参数的初始猜测,NE ~ Y
打赌= 0.8 ^ (1/4);%的折扣因素
nu = nu_Y * NE;%的UI的好处
B = b_4y * ne * 4;债券净供给%
phi1 = D1_4Y * NE * 2;%借款约束在初始ss = 0.1440
phi2 = D2_4Y * NE * 2;%借款限制在终端ss = 0.0640
pssi = NE^(-gam) * (1-NE)^%从劳动负效用,就像代表代理人
%设置rerun_initial = 1立即校准。
%rerun_initial = 1;
%rerun_terminal = 1;
%=========================================================================
% 2。在初始稳定状态下进行校准
%=========================================================================
%if reun_initial == 1
%负载标准;
%结束
%设置相关借款限制
phi = phi1;
%预先配置
cl = ones(1, S);%消费在借款限制
n_pol = 0 (S, I);%劳动政策
y_pol = 0 (S, I);%生产政策
b_pol = 0 (S, I);%的储蓄政策
mpcs = 0 (S, I);% mpc
抽搐
disp(“计算初始平衡…”);
Parfor it = 1:maxit
%更新(政府)预算限制
(1 - pr(1)) /(1+r) /(1 - pr(1))%劳动税
z = [nu, -tau*ones(1,S-1)];%全部转让方案(纸制tau波浪线)
找到状态空间的下界的消费:当两者都在今天
%和明天代理人在借款限额->约束是有约束力的
t和t+1都是%
Fac = (pssi ./ theta) ^ (1/);
for s = 1: s %循环生产率状态(13)
cl (s) = fzero(“find_cl”,…%的目标
[CMIN,100],......%的分型间隔
[],……%的选项
S, - r);状态,资产,利率
结束
%a)解决消费政策
%----------------------------------
对政策功能的初步猜测
c_pol = max(cmin, r*ones(S,1) * b_grid);%猜测c_t + 1
c_poli = c_pol;%的下一个迭代
猜测V_t+1
负载CRRA。mat %从CRRA案例中装载c_pol和n_pol,以原始GL代码(在终端SS部分开始前检查行)
v_pol = (1 / (1-bet)) * (c_pol。^ (1-gam) / (1-gam)) + pssi * (((1-n_pol)。^ (1-eta)) / (1-eta));% guess for V_t+1 using c_pol, n_pol from CRRA case
% v_pol = (c_pol。^ (1-gam) / (1-gam)) + pssi * (((1-n_pol)。^ (1-eta)) / (1-eta));%和上面一样有效
v_poli = v_pol;%的下一个迭代
差异= 1;
而dif > tol_pol
明天的期望边际效用
ui =公关* (((-v_pol)。^ (t1)。* (c_pol。^ (gam)));
UI = UI(:,b_grid> = -phi);
v_u = Pr *((-v_pol).^(1-alpha));
V_un = v_u(:,b_grid>= -phi);
V_con = v_u(:,b_grid < -phi);
% parfor s = 1: s
对于s = 1:s
%不受约束
c = ((1 + r) *注* ((v_un(年代,:))。^(α/(1α)。* ui(年代,:)))。^ (1 / gam);% c_t
N = max(0,1 - fac(s)*c.^gameta);% n_t
b = b_grid (b_grid > =φ)/ (1 + r) + c -θ(s) * n - z(年代);% b_t
v = c。^ (1-gam)。* ((1 / (1-gam))) + pssi *(((其它)。^ (1-eta)) / (1-eta)) -赌* ((v_un(年代,:))。^(1 /(1α)));% v_t
%约束
如果b(1) > -
c_c = linspace(cl(s),c(1),IC);
N_c = max(0,1 - fac(s)*c_c.^gameta);
B_c = - (1+r) + c_c - (s)*n_c - z(s);
六世= cl (1,1) ^ (1-gam)。* ((1 / (1-gam))) + pssi * (((1-n_c)。^ (1-eta)) / (1-eta)) -赌* ((v_un(1,1))。^(1 /(1α)));%值函数的下界
v_c = linspace(六世(1),v (1), Ic);受约束的%值函数(v_t)
b = [b_c(1:Ic-1), b];%总b_t
c = [c_c(1:Ic-1), c];%总c_t
v = [v_c(1:Ic-1), v];%总v_t
结束
c_poli(s,:) = Interp1(b,c,b_grid,'linear','instrap');%true c_t + 1> 0到处都是
v_poli(年代)= interp1 (b, v, b_grid,“线性”,“extrap”);% true v_t+1 <0
v_poli (v_poli > 0) = 1 e-6;
%并行化部分
%c_polis = interp1(b,c,b_grid,'linear','indrap');
% c_poli(年代,:)= c_polis;
%v_polis = interp1(b, v, b_grid, 'linear', ' extrp ');% true v_t+ 1%
%v_polis(v_polis> 0)= - 1E-6;
% v_poli(年代,:)= v_polis;
结束
%检查收敛性
C_poli = max(C_poli, cmin);%对消费实施非负约束
V_poli = min(V_poli, cmin);% % % %检查! !也许我们应该用最小值
Dif1 = max(max(abs(c_poli - c_pol)));
dif2 = max (max (abs (v_poli-v_pol)));
dif = max ([dif1 dif2]);
% 更新
c_pol = c_poli;
v_pol = v_poli;
结束
%保存其他策略功能和mpc
%parfor s = 1: s % parallelize
for s = 1: s
n_pol(年代)= max (0, 1 - fac (s) * c_pol(年代,:)。^ gameta);
Y_pol (s,:) = theta(s) * n_pol(s,:);
b_pol(年代)= max ((1 + r) * (b_grid + y_pol(年代,:)- c_pol(年代:)+ z (s)),φ);
mpc(年代)= (interp1 (b_grid, c_pol(年代,:),b_grid + db,“线性”,“extrap”)——c_pol(年代,:))/ db;
结束
% B)找到不变分布(迭代probb)反式。求键不变分布的矩阵)
%--------------------------------------------------------------------------------------------------------
%将权重与相邻网格点分配到距离
[~, ib_pol] = histc(b_pol, b_grid);
ib_pol (ib_pol < 1) = 1;
魏= (b_pol - b_grid (ib_pol)。/ (b_grid (ib_pol + 1) - b_grid (ib_pol));
%从均匀分布开始迭代资产转移矩阵
差异= 1;
Pd = =(s,i)/(s * i);期间T,S:产品的%资产分布(统一)。国家,我:收入国家
而dif> tol_dist
pdi = 0 (S, I);%初始化期t+1资产分配
对于s = 1: s %在周期t的生产力网格上循环
for i = 1: i %在周期t内循环资产网格
对于si = 1:S %在周期t+1的生产力网格上循环
pdi (si ib_pol (s i)) =(1 -魏(s i)) *公关(年代,si) * pd (s i) + pdi (si, ib_pol (s i));
pdi (si ib_pol (s i) + 1) =魏(s i) *公关(年代,si) * pd (s i) + pdi (si, ib_pol (s i) + 1);
结束
结束
结束
%检查收敛性
Dif = max(max(abs(pdi - pd)));
%确保分发将(SUM)集成到1
pdi = pdi / sum(sum(pdi));
结束
%c)检查市场清算和校准
%--------------------------------------------
债券市场清算,i指当前迭代
= sum(sum(pd) .* b_grid);
res_mkt = abs(B - Bi);
%校准统计,i指当前迭代
= sum(sum(pd .* y_pol));国内生产总值(GDP) %
NEi =总和(和(pd。* n_pol。* (n_pol > 0))) /笔(金额(pd。* (n_pol > 0)));平均工作时数%
B_4Yi = Bi / Yi / 4;%的债务比率
Di = -sum(sum(pd) .* min(b_grid, 0));
D_4Yi = Di / Yi / 4;%的债务比率
nu_Yi = nu / Yi;% UI效益比
res_cali = max (abs ([B_4Yi、D_4Yi nu_Yi, NEi] - [B_4Y, D1_4Y nu_Y, NE]));
%报告收敛
disp(['迭代',num2str(IT)]);
disp(['Bond mkt clearing: ', num2str(B - Bi)]);
disp(['流动财富:',num2str(B_4Yi - B_4Y)]);
disp(['Debt to GDP: ', num2str(D_4Yi - D1_4Y)]);
disp(['UI受益:',num2str(nu_Yi - nu_Y)]);
disp(['平均小时:',num2str(NEi - NE)]);
disp ('-----------------------------------------------')
检查两者的收敛性,必要时进行更新
If (res_cali < tol_cali) && (res_mkt < tol_mkt)
打破;
其他的
%的折扣因素
btemp =日志(1-bet);
btemp = btemp - 1*(Bi - B_4Y*4*Yi);
BET = 1 - EXP(-BTEMP);
% rest将基于这些更新
/ / D_4Yi; / / D_4Yi;
nu_d = nu_Y * Yi;
pssi_d = pssi * ((1-NE) / (1-NEi))^eta;
* (ph_d - ph_d);
Nu = Nu + 1 * (nu_d - Nu);
pssi_d = 1 * (pssi_d - Pssi); / /
%更新总量
B = B + 0.1 * (B - B);债券净供给%
结束
结束
%统计数字
Y1 = sum(sum(pd .* y_pol));国内生产总值(GDP) %
C1 = sum(sum(pd .* c_pol));%的消费
D1 = -sum(sum(pd) .* min(b_grid, 0));%的债务
N1 = sum(sum(pd .* n_pol));劳动供给%(含失业)
MPC1 = sum(sum(pd .* mpcs));% MPC
%保存结果
phi1 =φ;
r1 = r;
pd1 = pd;
c_pol1 = c_pol;
b_pol1 = b_pol;
v_pol1 = v_pol;
%图1在纸上
图;
i = (b_grid> -phi) & (b_grid < 50*Y1);%的域
次要情节(1、2、1)
绘图(b_grid(ii)/(4 * y1),c_pol(2,ii),b_grid(ii)/(4 * y1),c_pol(8,ii),' - ','linewidth',1.3);
标题(“消费”);
框;网格;
%set(gca,'fontsize',14);
轴([-2 13 0 .6])
次要情节(1、2、2)
绘图(b_grid(ii)/(4 * y1),n_pol(2,2),b_grid(ii)/(4 * y1),n_pol(8,ii),' - ','linewidth',1.3);
标题(“劳工供应”);
传奇(' \θ^ 2 ',' \θ^ 8 ');
框;网格;
%set(gca,'fontsize',14);
轴([13 - 2。1。7)
SET(GCF,'位置',[440 378 700 300]);
set(gcf,'PaperPosition', [0 0 14 6]);
集(gcf、“PaperSize”[6]14日);
图= GCF;
saveas(图,“fig1-policies.pdf”);
这就是整个剧本。理解什么时候(和什么地方)我可以从并行化中获益是非常有用的,因为在我看来,我已经并行化的部分(参见%parfor命令)导致开销,使代码几乎慢了7倍(执行408秒vs 2661秒)。

登录评论。

更多的答案(0)

社区寻宝

在MATLAB中心找到宝藏,并发现社区如何可以帮助你!

开始狩猎!

翻译的