0
我正在嘗試計算多個方程和變量(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個...並重復這個幾百次。 - 除非你的函數至少有一些不錯的屬性,否則你不能指望找到一個好的解決方案。 –