我正在尝试以数值方式计算许多方程和变量(100+)的系统的解。到目前为止,我尝试了三件事:
- 我现在知道 p(i) 的向量(包含大部分内生变量)正在减少。因此,我只给出了一些起点,然后当我看到特定的 p 太低(高)时,我的猜测增加(减少)。当然,这总是以另一个被固定为条件,但事实并非如此。这最终应该会起作用,但是我在有限时间内达到解决方案既不高效也不明显。它在将系统减少到 4-6 个变量时起作用。
- 我可以围绕彼此创建 100 多个循环,并为每个循环使用二等分。这最终会引导我找到解决方案,但是需要很长时间来编程(因为我不知道如何在彼此周围创建 n 个循环而不必实际编写循环 - 这也很糟糕,因为我想增加/减少变量的数量很容易)并执行。
- 我正在尝试 fminsearch,但正如预期的那样浪费了大量的变量 - 没门!
我会很感激任何想法......这是代码(这是我尝试过的 fminsearch):
这是运行文件:
clear all
clc
% parameter
z=1.2;
w=20;
lam=0.7;
tau=1;
N=1000;
t_min=1;
t_max=4;
M=6;
a_min=0.6;
a_max=0.8;
t=zeros(1,N);
alp=zeros(1,M);
p=zeros(1,M);
p_min=2;
p_max=1;
for i=1:N
t(i)= t_min + (i-1)*(t_max - t_min)/(N-1);
end
for i=1:M
alp(i)= a_min + (i-1)*(a_max - a_min)/(M-1);
p(i)= p_min + (i-1)*(p_max - p_min)/(M-1);
end
fun=@(p) david(p ,z,w,lam,tau,N,M,t,alp);
p0=p;
fminsearch(fun,p0)
这是程序文件:
function crit=david(p, z,w,lam,tau,N,M,t,alp)
X = zeros(M,N);
pi = zeros(M,N);
C = zeros(1,N);
Xa=zeros(1,N);
Z=zeros(1,M);
rl=0.01;
rh=1.99;
EXD=140;
while (abs(EXD)>100)
r1=rl + 0.5*(rh-rl);
for i=1:M
for j=1:N
X(i,j)=min(w*(1+lam), (alp(i) * p(i) / r1)^(1/(1-alp(i))) * t(j)^((z-alp(i))/(1-alp(i))));
pi(i,j)=p(i) * t(j)^(z-alp(i)) * X(i,j)^(alp(i)) - r1*X(i,j);
end
end
[C,I] = max(pi);
Xa(1)=X(I(1),1);
for j=2:N
Xa(j)=X(I(j),j);
end
EXD=sum(Xa)- N*w;
if (abs(EXD)>100 && EXD>0)
rl=r1;
elseif (abs(EXD)>100 && EXD<0)
rh=r1;
end
end
Ya=zeros(M,N);
for j=1:N
Ya(I(j),j)=t(j)^(z-alp(I(j))) * X(I(j),j)^(alp(I(j)));
end
Yi=sum(Ya,2);
if (Yi(1)==0)
Z(1)=-50;
end
for j=2:M
if (Yi(j)==0)
Z(j)=-50;
else
Z(j)=(p(1)/p(j))^tau - Yi(j)/Yi(1);
end
end
zz=sum(abs(Z))
crit=(sum(abs(Z)));