在Matlab中使用多个变量求解优化的最佳方法?

时间:2013-07-10 08:53:12

标签: optimization matlab equation-solving multiple-variable-return

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

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

1 个答案:

答案 0 :(得分:1)

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

您对该功能有何了解,可以使用渐变方法,线性化问题,还是修复大多数变量?如果没有,请在决定对所有100个变量真正感兴趣之前再三思考,然后简化问题。


现在,如果无法做到这一点,请阅读:

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