2012-02-25 106 views
0

非常感謝,首先。第一個代碼運行良好:
函數f = malibu(m1,m2,m3,k,l,t) f =(m1。* k +(m1 + m2)。* l)。* exp(-m3。*噸); end矢量化函數fminsearch

function loglik= modelmalibu(p) 
global k l t x n m2 m3; 
f =malibu(p,m2,m3,k,l,t); 
if f==0; 
    loglik0=0; 
else 
loglik0=(x.*log(f)+(n-x).*log(1-f));%minus likelihood 
end 
loglik=sum(-loglik0); 
end 

clear all; 
global n t x k l m2 m3; 
m1=0.1; 
m2=0.2; 
m3=0.3; 
t=[1 3 6 9 12 18]'; 
k=[1 1 2 3 3 4]'; 
l=[0 0 1 3 4 5]'; 
y=meltem(m1,m2,m3,k,l,t); 
n=100;%trial 
x=y.*n;%correct replies 
pstart=0.3; 
[p1,modelvalue]=fminsearch(@modelmalibu,pstart); 

但是,類似的代碼更多的變量給出了錯誤。

function w=anemon(m1,m2,m3,X,Y,k,l) 
w=(m1.*k+(m1+m2).*l)+X.*exp(-m3.*Y); 
end 

function loglik= modelanemon(p) 
global n x m2 m3 X Y k l ; 
f =anemon(p,m2,m3,X,Y,k,l); 
if f==0; 
    loglik0=0; 
else 
loglik0=(x*log(f)+(n-x)*log(1-f));%minus likelihood 
end 
loglik=sum(-loglik0); 
end 

clear; 
global n x Ydata kdata ldata m1 m2 m3; 
%parameters 
m1=0.002; 
m2=0.0001; 
m3=7; 
%given data 
Xdata=[1 3 6 9 10 12]'; 
Ydata=[11 13 41 81 121 181]'; 
kdata=[1 1 2 4 5 4]'; 
ldata=[1 1 3 3 4 5]'; 
y=anemon(m1,m2,m3,Xdata,Ydata,kdata,ldata); 
n=10; 
x=y.*n; 
pstart=2; 
[pbest,modelvalue]=fminsearch(@modelanemon,pstart); 

我其實是試圖用你的建議,但如果我會寫的不平等,而不是˚F== 0,第一個代碼塌下來爲好。

+0

看起來你所有的「Mfile」只包含註釋。你在這些文件的每一行前都有真正的「%」。如果是這種情況,那麼你的代碼沒有太大的作用。否則,請修改您的帖子。 – Kavka 2012-02-26 03:01:11

+0

@Kavka,謝謝你的評論。我只想強調M-Files的一部分,但是我在你的評論後看到這個想法有多混亂。我按照你的建議編輯它。 – user1018331 2012-02-26 08:32:28

+0

我有一個問題,理解你的問題是什麼。你能澄清嗎? - 也許在一個小片段,或一個具體的例子。 – bdecaf 2012-02-26 08:58:36

回答

1

我認爲你在混合兩個概念。

矢量化:確實指出如何編寫代碼,以便它可以使用CPU中的某些加速功能。它與fminsearch無關。見:http://en.wikipedia.org/wiki/Vectorization_(parallel_computing

我想你要寫你的函數,使它接受一個向量作爲輸入。最簡單的方法是隻用一個函數處理這樣:

fh = @(x) my_complicated_function(const1, const2, x(1), x(2), x(3)) 

在這種情況下my_complicated_function有5個輸入,你把第一個2常數和輸入3暗淡矢量對另外3 Fminsearch將與合作。

你會打電話

x_opt = fminsearch(fh, [1,2,3]) 

除了一些提示代碼:

  • 不要使用==對數字的比較 - 去如。 abs(x1-x2)<0.1而不是
  • interpanemon看起來很奇怪 - 它不會做什麼人會說插值,如果你看 - 在每次迭代中重新計算p,所以只有最後一次計算纔會生效。因爲它看起來應該輸出一個固定值 - 沒有使用優化。
  • 使用預先計算的Z可能不是您想要的。它已經決定你的最佳狀態。如果使用線性優化,則最佳值必須已經在Z中 - 無需進行插值。
  • 在你的情況下,調用可能看起來像:

    min_p = fminsearch(@(X)interpanemon(5,YDATA中,x,M2,M3,Z,X,Y,KDATA,LDATA),1)

總的來說,它看起來非常不尋常 - 如果你想解釋這些想法,這真的可以幫助你爲什麼選擇這樣做。如果以更簡單的形式重述問題,也可能有所幫助。

+0

,非常感謝您的幫助。顯然,我是一個白癡,但我仍然不太瞭解。如果我不打擾你,請你解釋一下:在開始時我假設我沒有任何數據。我創建函數anemon(m1,m2,m3,X,Y,k,l),藉助這個函數我在網格上創建一個函數Z(i,j,k,l) Y(j)),然後我確定網格點之間的點Xstar,Ystar的函數,並寫入interpanemon(Xstar,Ystar,m1,m2,m3,Z,X,Y,k,l)。爲了儘量減少interpanemon(5,Ydata,p,m2,m3,Z,X,Y,kdata,ldata)fminsearch應該爲p做,但是:(。 – user1018331 2012-02-26 12:53:41

+0

hmmm ...起初我看到你的代碼存在一些問題。我添加了一些提示: – bdecaf 2012-02-26 13:15:17

+0

變量數我得到了麻煩:(函數w = anemon(m1,m2,m3,X,Y,k,l) w =(m1。* k +(m1 + m2)。* l )+ X. * EXP(-m3 * Y); end'和模型'函數loglik = modelanemon(p) 全球NX平方米立方米XY KL; F =銀蓮花(p,M2,M3,X,Y, K,L); 如果f == 0; loglik0 = 0;否則 loglik0 =(x * log(f)+(n-x)* log(1-f));%減去似然性 結束 loglik = sum(-loglik0); end'不能用下面的腳本 – user1018331 2012-02-26 20:26:02