2014-06-20 44 views
0

我有一個函數可以在matlab中優化f,函數依賴於我想要的變量x =(x(1),x(2))優化和兩個不需要優化的參數n和c。換句話說,我有一個n和c值的矩陣,我想爲每個n和c找到最優的x值。 這裏是我的代碼:通過函數句柄傳遞附加參數在Matlab中進行優化

clear all; 
clc; 
close all; 
[email protected](x,n,c)n*x(1)+(x(2)+3*c)/(x(1)+c); 
for n=1:10 
    for c=1:20 
     x=zeros(length(n),length(c)); 
     fun{n,c}[email protected](x)f(x,n,c); 
     options=optimset('Algorithm','interior-point') 
     x(n,c)=fmincon(fun{n,c},[0;0],[1 0;-1 0;0 1;0 -1],[40;0;40;0],[],[],[],[],[],options); 
    end 
end 

??? Subscripted assignment dimension mismatch. 

Error in ==> forloop2 at 10 
     x(n,c)=fmincon(fun{n,c},[0;0],[1 0;-1 0;0 1;0 
     -1],[40;0;40;0],[],[],[],[],[],options); 
Any helps? Thank you so much! 

回答

0

我怕你實際上並沒有問一個問題,但這裏有一個答案:

function myOptimization 
clear all; 
clc; 
close all; 

results=cell(10,20); 
for n=1:10 
    for c=1:20 
     options=optimset('Algorithm','interior-point'); 
     fmincon(@(x)fun(x,n,c),[0;0],[1 0;-1 0;0 1;0 -1],[40;0;40;0],[],[],[],[],[],options); 
     resultingCoordinates=fmincon(@(x)fun(x,n,c),[0;0],[1 0;-1 0;0 1;0 -1],[40;0;40;0],[],[],[],[],[],options); 
     results{n,c}=resultingCoordinates; 
    end 
end 
results 
end 

function f=fun(x,n,c) 
f=n*x(1)+(x(2)+3*c)/(x(1)+c); 
end 

您在原始的代碼由至少3個錯誤。首先,x(n,c)= fmincon ...不起作用,因爲fmincon返回一個具有最佳座標的矢量作爲第一個輸出參數。因此,您正嘗試將向量分配給矩陣「x」中的單個位置,這是您的錯誤的來源。我將最佳座標放在單元格數組中,以便我可以存儲所有輸出座標。如果你想把最佳的「f值」作爲矩陣分配給你的結果,你可以使用[〜,f(n,c)] = fmincon ...。其次,即使你想保存座標,「x」對於你的輸出矩陣來說也是一個非常糟糕的名字。它可能會導致錯誤,因爲它用於表示目標函數的輸入,而不是最佳座標。爲最佳座標或最佳函數值使用不同的名稱,這反映這些是結果。

第三,每次更改參數時,不需要連續重新分配輸出矩陣/單元陣列。你基本上試圖清除每次迭代的結果,如果你想保存它們,這是行不通的。

我也將你的目標函數分解爲一個函數,並且該函數的優化是另一個函數。

我希望這會有所幫助。將來,請嘗試在Stack Overflow上定義一個明確的問題。