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

首先我的r推薦:使用你的大腦。

你對函數有什麼瞭解,你可以使用梯度方法,線性化問題,或者修復大部分變量?如果沒有,在你決定對所有100個變量真正感興趣並且可能簡化問題之前,請三思。現在


,如果這是不可能的閱讀:

  • 如果你找到一種方式來迅速獲得局部最優,你可以簡單地換一個循環圍繞它來嘗試不同的出發點和希望你會發現一個很好的最佳。
  • 如果你真的需要做大量的循環(以及可變數量),我認爲它可以用遞歸完成,但是不容易解釋。
  • 如果你只是很快想在對方內做一個固定數量的循環,這可以很容易地在Excel中完成(提示:循環變量可以被稱爲t1,t2 ...)
  • 如果你真的需要評估一個功能在很多點上,可能首先使用ndgrid創建所有點,然後一次評估它們都是可取的。 (不用說,這不會是一個很好的解決方案,爲100個非平凡的變量)
+0

嘿,謝謝你的評論。問題是我不能使用漸變方法(因爲漸變取決於整個問題的解決方案),它是非線性的,我無法修復變量。 ngrid也不可行,因爲我需要評估其他變量(N = 1000)的所有可能映射。這有點太過分了。我現在寫了一個8個變量的循環,看看需要多長時間。但是我的猜測很長,增加更多變量會以指數方式增加時間。你說什麼意思與當地的最佳,我沒有把握你的想法的戰略。 –

+0

那麼,也許你可以修復N-5變量,優化剩餘的5個以獲得局部最優,以此爲起點,修復另一個N-5變量優化剩餘的其他5個...並重復這個幾百次。 - 除非你的函數至少有一些不錯的屬性,否則你不能指望找到一個好的解決方案。 –

相關問題