2013-02-14 192 views
0

我是編程的新手。我有大約100個數據集,每個都有2列。我想,以適應COL1數據COL2數據的冪函數,即MATLAB:在for循環中使用fmincon

variable(col1) = parameter1 x (variable(col2))^ parameter2 

(say a (x^b)). 

現在我想用最優化函數fmincon並獲得兩個參數的值。我想對所有的100個數據集重複這一點,因此希望將這個fmincon包含在一個for循環中,在該for循環中我一次調用一個數據集中的數據。我已盡全力,我無法得到如何做到這一點。

有什麼建議嗎?

+0

從下面的評論到回答,似乎這個問題與數據集和'for'循環無關。這是關於如何使用fmincon的問題。因此,它措辭不佳,我建議它關閉或根本編輯。 – Shai 2013-02-14 20:27:35

回答

0

可以調用第一列數據集kXk和第二個Yk(大小m x 1)。如果我沒有理解你的問題,然後爲每個數據集k {XkYk}你正在尋找兩個標量akbk這樣

Yk == ak * Xk.^bk所有元素1..m

由於有多個方程/約束比參數(僅有兩個參數的m方程)我們尋求最小二乘解。

從公式產量

log Yk == log ak + bk * log Xk 

定義新的變量YYk <- log(Yk)XXk <- log(Xk)我們雙方以log線性方程log akbk - 這can be solved easily沒有fmincon或其他優化工具。
事實上,如果我們追加列向量XXk全部爲一(即XXk(:,2)=1)的另一列,我們可以以矩陣形式寫我們的系統現在

XXk * [ b ; log(ak)] == YYk 

一些Matlab代碼:

N = 100; % number of data sets 
a = zeros(1, N); % pre allocate room for all ak 
b = zeros(1, N); % pre allocate room for all bk 
for k = 1 : N 
    % get the data here: Xk = ???, Yk = ??? 
    XXk = log(Xk); 
    XXk(:,2) = 1; % add all ones column 
    YYk = log(Yk); 
    tmp = XXk \ YYk 
    a(k) = exp(tmp(2)); 
    b(k) = tmp(1); 
end 
+0

非常感謝您的回覆。我錯過了我的問題中的一個重要成分。我想使用fmincon,因爲我對其中一個標量(參數)有一些限制。否則,我同意使用log的線性化方程。 – user1957000 2013-02-14 19:54:26

+0

@ user1957000可惜你沒有提到你的問題中的這個微小的細節。但基本上,在每次迭代時,您都有'for'循環遍歷數據集'k','Xk'和'Yk' - 只需插入'fmincon'並完成它。 – Shai 2013-02-14 20:03:56

+0

多數民衆贊成在我面臨的問題..fmincon作爲一個輸入功能,但功能需要一些輸入和返回一些輸出。但在我的情況下,我沒有任何輸入的功能,而是我必須通過優化找到這些值。我不知道我有多清楚,但是如果您可以提供上面給出的代碼片段,則會非常有幫助。預先感謝.. – user1957000 2013-02-14 20:20:41