0

Я пытаюсь вычислить численные решения для системы многих уравнений и переменных (100+). Я пробовал до сих пор три вещи:Оптимальная оптимизация решения с несколькими переменными в Matlab?

  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 

[email protected](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

Прежде всего, я рекомендую ndation: используйте свой мозг.

Что вы знаете о функции, можете ли вы использовать подход градиента, линеаризовать проблему или, возможно, исправить большинство переменных? Если нет, подумайте дважды, прежде чем решите, что вы действительно заинтересованы во всех 100 переменных и, возможно, упростите проблему.


Теперь, если это не представляется возможным прочитать:

  • Если вы нашли способ быстро получить локальный оптимум, можно просто обернуть петлю вокруг него, чтобы попробовать различные отправные точки и надежды вы найдете хороший оптимум.
  • Если вам действительно нужно сделать много циклов (и переменной величины), я полагаю, это можно сделать с рекурсией, но это нелегко объяснить.
  • Если вы просто хотите сделать фиксированное количество петель внутри друг друга, это легко сделать в excel (подсказка: переменные контура можно назвать t1, t2 ...)
  • Если вам действительно нужно оценить функция во множестве точек, возможно, создавая все точки сначала, используя ndgrid, а затем оценивая их все одновременно, предпочтительнее. (Излишне говорить, что это не будет хорошим решением для 100 нетривиальных переменных)
+0

Эй, благодарю вас за комментарий. Проблема в том, что я не могу использовать градиентный подход (поскольку градиенты зависят от решения всей задачи), он нелинейный и я не могу фиксировать переменные. ngrid также не представляется возможным, так как тогда мне нужно было бы оценить при всех возможных отображениях других переменных (N = 1000). И это слишком много. Я написал теперь цикл для 8 переменных, чтобы посмотреть, сколько времени потребуется.Но моя догадка длинна, и добавление большего числа переменных увеличивает время экспоненциально. Что вы имели в виду с местным оптимумом, я не понял вашу стратегию по этой идее. –

+0

Ну, возможно, вы можете исправить переменные N-5, оптимизировать оставшиеся 5, чтобы получить локальный оптимум, использовать это как отправную точку, исправить другие переменные N-5, оптимизировать остальные остальные 5 ... и повторить это несколько сотен раз , - Если у вашей функции есть хотя бы некоторые приятные свойства, вы не можете ожидать хороший способ найти отличное решение. –