Algorithm 大型模型的求解与求解

Algorithm 大型模型的求解与求解,algorithm,wolfram-mathematica,Algorithm,Wolfram Mathematica,我是Mathematica的新手,在2010年MacBook Pro上运行版本7 我试图解决大量公司的经济问题,每个公司都有一个最大的生产配额,即生产权。这些公司的规模各不相同,规模较大的公司比规模较小的公司效率更高。配额是有市场的,因此低效的小公司可以关闭,把配额权卖给大公司;配额价格k必须内生计算 问题如下:对于从2到3的少量公司n,只有Solve起作用,而NSolve给我{},即没有解决方案。 公司数量中等,从4家到7家,只有NSolve起作用。 有8家和9家公司,NSolve生产{}。

我是Mathematica的新手,在2010年MacBook Pro上运行版本7

我试图解决大量公司的经济问题,每个公司都有一个最大的生产配额,即生产权。这些公司的规模各不相同,规模较大的公司比规模较小的公司效率更高。配额是有市场的,因此低效的小公司可以关闭,把配额权卖给大公司;配额价格k必须内生计算

问题如下:对于从2到3的少量公司n,只有Solve起作用,而NSolve给我{},即没有解决方案。 公司数量中等,从4家到7家,只有NSolve起作用。 有8家和9家公司,NSolve生产{}。 有10到16家公司,NSolves运作良好。 由于17岁及以上的公司数量越来越多,评估一直没有结束,我最终放弃了,我等了15分钟

我的希望是与成千上万的公司合作。我的问题是1我如何系统地让Mathematica收敛到任意大系统的解,2为什么Solve不适用于小系统

两点意见:

1你会注意到我建立模型的方式有些笨拙,首先是对k的猜测k0,它决定了哪些公司正在运营,哪些公司正在关闭。然后,对于运营公司列表,我计算利润最大化的劳动力数量、总产出和均衡k。如果k与k0不同,我用k0=k重新开始计算。然而,如何创建一个更优雅的一步程序是一个单独的问题,我不认为这与模型尺寸限制有关

2如果我为11家公司求解模型,然后尝试为13家公司求解,Mathematica最终会没完没了地运行。但如果我先解12家公司,那么解13家公司只需几秒钟。因此,尽管笔记本开头有ClearAll[Global`*]语句,Mathematica似乎从一个更好的起点开始

我已经准备好谦卑了:

代码如下:

ClearAll["Global`*"]
(* Aggregate Quota Allocation *)
alloc=1000000;
(* Number of firms; *)
nv=4;
(* Equal quota allocation to each firm; *)
qbar = alloc/nv;
(* Firm sizes vary in amount of capital from smallest to largest;*)
vsmin=0 ;
vsmax=900000 ;
(* Assume discrete uniform distribution of firm sizes;*)
dvs=(vsmax-vsmin)/(nv-1) ;
(* List all firms by size; *)
listvs=Table[vs,{vs,vsmin,vsmax,dvs}]  ;
(* A firm's capital cost per annum is 10 percent of capital size;*)
g=0.1 ;
(* Avoidable fixed cost of operation;*)
f=5000 ;
(* Parameters of production function (same for all firms);*)
a=0.01 ;
alpha=0.7 ;
(* Price of output; *)
p=5;
(* Price of labor (daily wage);*)
wa=100 ;
(* Firm vs is a profit maximizer setting optimal number of days of operation tl[vs] ;
Firms that are too small are better off leasing their quota allocation to larger ones; 
The quota leasing price k is computed endogenously;
Firms will exit if "netprofitstay" is less than 0;
We are looking for threshold firm, whose size nvs1 is just above threshold size vs0;
All firms who size is nvs1 or larger are operating, the others are shutting down;
For now, we are setting the problem up as a manual loop, setting k0 = "k opt" 
from previous computation ; *)

k0=4.891714989052472` ;

profitstay0[tl0_,vs0_]:= (p-k0)(a vs0 tl0^alpha) - wa tl0 + k0 qbar - g vs0 - f  ;
netprofitstay0[tl0_,vs0_]:=(p-k0)(a vs0 tl0^alpha) - wa tl0 - f  ;
sol0:=NSolve[{D[profitstay0[tl0,vs0],tl0]==0 ,netprofitstay0[tl0,vs0]==0} ,{tl0,vs0}]  ;
vs1:=vs0/.Last[sol0] 
nvs0:=Part[Nearest[listvs,vs1],1] ;
nvs1:=If[nvs0<vs1,nvs0+dvs,nvs0] ;
(* List of firms who operate when k=k0; *)
listvsop:=Table[vs,{vs,nvs1,vsmax,dvs}]  ;

(* Production function;*)
eq[tl[vs_],vs_]:=a vs tl[vs]^alpha ;
(* Profit; *)
profitstay[k_,tl[vs_],vs_]:=(p-k) eq[tl[vs],vs] - wa tl[vs] + k qbar - g vs - f  ;
(* List of first-order conditions for a maximum; *)
foc:=Table[D[profitstay[k,tl[vs],vs],tl[vs]]==0,{vs,listvsop}]  ;
(* List of all endogenous variables; *)
variables:=Flatten[{k,Table[tl[vs],{vs,listvsop}]},1] ;
Print[variables] ;
(* List of all equations, including the one specifying that aggregate quota demand = aggregate
quota supply; *)
equations:=Flatten[{foc,Sum[eq[tl[vs],vs],{vs,listvsop}]==alloc }] ;
Print[equations] ;

(* Find solution;*)
NSolve[equations,variables]

如果我只是尝试按原样运行您的代码,我会收到一长串错误,这些错误似乎是由于获取了一个空的解决方案列表,然后尝试获取最后一个解决方案,从最后一个解决方案创建表,等等。您是否看到了所有这些错误?亲爱的比尔,我把这个论坛上发布的代码复制/粘贴到一个新笔记本上,并顺利运行了它;得到了没有任何错误的解决方案。具体来说,我得到:{{k->4.89171,tl[600000]>155.857,tl[900000]>602.138}谢谢!开始MMA,空笔记本,复制,粘贴,添加$Version,评估,进入[1]:=$Version Out[1]=9.0 for Microsoft Windows 64位2013年1月25日在[2]:=ClearAll。。。Last::nolast:{}的长度为零,没有最后一个元素。>>ReplaceAll::reps:{Last[{}]}既不是替换规则列表,也不是有效的分派表,因此不能用于替换。>>一次又一次等不知道。既然你能用,也许你能找到他的解决办法。Thanks@Bill当前位置我不确定是什么原因导致您的案例中出现错误。我能想到的唯一主要区别是软件版本。2009年2月19日,我在这款家庭/度假笔记本电脑上运行7.0 for Mac OS X x86 64位版本,而不是之前声称的版本8。进一步的输出是响应第一个Print[]命令的{k,tl[600000],tl[900000]},响应第二个Print[]命令的{-100+4200.5-k/tl[600000]^0.3==0,-100+6300.5-k/tl[900000]^0.3==06000.tl[600000]^0.7+9000.tl[900000]^0.7==1000000},然后是前面所述的解决方案。最好的,同样的问题现在已经发布在Mathematica stackexchange论坛上,所以我们可能想在这里结束它。谢谢