0

多くの方程式と変数 (100 以上) のシステムの解を数値的に計算しようとしています。私はこれまでに3つのことを試しました:

  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