【问题标题】:Best way solving optimization with multiple variables in Matlab?在Matlab中解决多变量优化的最佳方法?
【发布时间】:2013-07-08 03:00:56
【问题描述】:

我正在尝试以数值方式计算一个包含许多方程和变量 (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)));

【问题讨论】:

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


    【解决方案1】:

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

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


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

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

    【讨论】:

    • 您好,谢谢您的评论。问题是我不能使用梯度方法(因为梯度取决于整个问题的解决方案),它是非线性的,我无法修复变量。 ngrid 也不可行,因为我需要评估其他变量的所有可能映射(N = 1000)。这有点过分了。我现在为 8 个变量编写了一个循环,看看需要多长时间。但我的猜测很长,添加更多变量会成倍增加时间。你对局部最优是什么意思,我没有理解你关于那个想法的策略。
    • 好吧,也许你可以修复 N-5 个变量,优化剩下的 5 个以获得局部最优,以此为起点,修复另一个 N-5 个变量,优化剩下的 5 个......并重复数百次。 -- 除非你的函数至少有一些很好的属性,否则你不能指望一个很好的方法来找到一个很好的解决方案。
    猜你喜欢
    • 2021-05-09
    • 2014-05-21
    • 2018-04-06
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多