Я пытаюсь вычислить численные решения для системы многих уравнений и переменных (100+). Я пробовал до сих пор три вещи:Оптимальная оптимизация решения с несколькими переменными в Matlab?
- Я теперь, когда вектор p (i) (который содержит большинство эндогенных переменных) уменьшается. Таким образом, я дал просто некоторые отправные точки, а затем увеличивал (уменьшая) свою догадки, когда видел, что конкретный p был слишком низким (высоким). Конечно, это всегда было обусловлено тем, что другое фиксировано, что не так. Это должно в конечном итоге работать, но оно не является ни эффективным, ни очевидным, что я достигаю решения за конечное время. Тем не менее, он работал при уменьшении системы до 4-6 переменных.
- Я мог бы создавать 100 + петли вокруг друг друга и использовать деление пополам для каждого цикла. Это в конечном итоге приведет меня к решению, но возьмет возраст как для программирования (поскольку я понятия не имею, как создавать n петель вокруг друг друга, не имея при этом необходимости писать циклы, что также плохо, поскольку я хотел бы увеличить/уменьшить количество переменных легко) и выполнить.
- Я искал 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)));
Эй, благодарю вас за комментарий. Проблема в том, что я не могу использовать градиентный подход (поскольку градиенты зависят от решения всей задачи), он нелинейный и я не могу фиксировать переменные. ngrid также не представляется возможным, так как тогда мне нужно было бы оценить при всех возможных отображениях других переменных (N = 1000). И это слишком много. Я написал теперь цикл для 8 переменных, чтобы посмотреть, сколько времени потребуется.Но моя догадка длинна, и добавление большего числа переменных увеличивает время экспоненциально. Что вы имели в виду с местным оптимумом, я не понял вашу стратегию по этой идее. –
Ну, возможно, вы можете исправить переменные N-5, оптимизировать оставшиеся 5, чтобы получить локальный оптимум, использовать это как отправную точку, исправить другие переменные N-5, оптимизировать остальные остальные 5 ... и повторить это несколько сотен раз , - Если у вашей функции есть хотя бы некоторые приятные свойства, вы не можете ожидать хороший способ найти отличное решение. –