0

我正在尝试以数值方式计算许多方程和变量(100+)的系统的解。到目前为止,我尝试了三件事:

  1. 我现在知道 p(i) 的向量(包含大部分内生变量)正在减少。因此,我只给出了一些起点,然后当我看到特定的 p 太低(高)时,我的猜测增加(减少)。当然,这总是以另一个被固定为条件,但事实并非如此。这最终应该会起作用,但是我在有限时间内达到解决方案既不高效也不明显。它在将系统减少到 4-6 个变量时起作用。
  2. 我可以围绕彼此创建 100 多个循环,并为每个循环使用二等分。这最终会引导我找到解决方案,但是需要很长时间来编程(因为我不知道如何在彼此周围创建 n 个循环而不必实际编写循环 - 这也很糟糕,因为我想增加/减少变量的数量很容易)并执行。
  3. 我正在尝试 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)));
4

1 回答 1

1

首先我的建议是:用你的大脑。

你对函数了解多少,你能使用梯度方法,线性化问题,或者修复大部分变量吗?如果没有,请三思而后行,然后再决定是否对所有 100 个变量都真正感兴趣,并可能会简化问题。


现在,如果这不可能,请阅读以下内容:

  • 如果你找到了一种快速获得局部最优值的方法,你可以简单地在它周围环绕一个循环来尝试不同的起点,并希望你能找到一个好的最优值。
  • 如果你真的需要做很多循环(和可变数量),我想它可以通过递归来完成,但这并不容易解释。
  • 如果您只是想快速地在彼此内部创建固定数量的循环,这可以在 excel 中轻松完成(提示:循环变量可以称为 t1,t2 ...)
  • 如果你真的需要在很多点上评估一个函数,可能首先使用创建所有点ndgrid,然后一次评估它们是可取的。(不用说这对于 100 个非平凡变量来说不是一个很好的解决方案)
于 2013-07-10T09:35:19.310 回答