[問題] 關於lsqnonlin

看板MATLAB作者 (ilovecurl)時間13年前 (2012/06/19 21:41), 編輯推噓3(305)
留言8則, 2人參與, 最新討論串1/1
我現在想要利用lsqnonlin函數,跑出一個向量X,使估計的相關係數矩陣Rho1(X) 和相關係數矩陣Rho差距最小,但是程式run下去,到跑出結果要超過一小時 且會出現如下之訊息: 我想知道到底發生了什麼問題,或是我哪裡寫錯了? 請各位高手指點一下,感激不盡!!! Local minimum possible. lsqnonlin stopped because the final change in the sum of squares relative to its initial value is less than the default value of the function tolerance. <stopping criteria details> 或是這個訊息 Solver stopped prematurely. lsqnonlin stopped because it exceeded the function evaluation limit, options.MaxFunEvals = 4200 (the default value). 我的程式碼如下: X0是執行lsqnonlin所要代入之初始值,最後希望求出使估計之相關係數矩陣最接近 實際相關係數矩陣的X X0 = normrnd(0,1,1,42); [X, resnorm] = lsqnonlin('fact',X0); fact是我要呼叫的函數名稱,內容如下: function reb = fact(X) Rho = xlsread('correlation'); %讀入真正的相關係數矩陣 B = [cos(X(1)), cos(X(2))*sin(X(1)), sin(X(1))*sin(X(2)); cos(X(3)), cos(X(4))*sin(X(3)), sin(X(3))*sin(X(4)); cos(X(5)), cos(X(6))*sin(X(5)), sin(X(5))*sin(X(6)); cos(X(7)), cos(X(8))*sin(X(7)), sin(X(7))*sin(X(8)); cos(X(9)), cos(X(10))*sin(X(9)), sin(X(9))*sin(X(10)); cos(X(11)), cos(X(12))*sin(X(11)), sin(X(11))*sin(X(12)); cos(X(13)), cos(X(14))*sin(X(13)), sin(X(13))*sin(X(14)); cos(X(15)), cos(X(16))*sin(X(15)), sin(X(15))*sin(X(16)); cos(X(17)), cos(X(18))*sin(X(17)), sin(X(17))*sin(X(18)); cos(X(19)), cos(X(20))*sin(X(19)), sin(X(19))*sin(X(20)); cos(X(21)), cos(X(22))*sin(X(21)), sin(X(21))*sin(X(22)); cos(X(23)), cos(X(24))*sin(X(23)), sin(X(23))*sin(X(24)); cos(X(25)), cos(X(26))*sin(X(25)), sin(X(25))*sin(X(26)); cos(X(27)), cos(X(28))*sin(X(27)), sin(X(27))*sin(X(28)); cos(X(29)), cos(X(30))*sin(X(29)), sin(X(29))*sin(X(30)); cos(X(31)), cos(X(32))*sin(X(31)), sin(X(31))*sin(X(32)); cos(X(33)), cos(X(34))*sin(X(33)), sin(X(33))*sin(X(34)); cos(X(35)), cos(X(36))*sin(X(35)), sin(X(35))*sin(X(36)); cos(X(37)), cos(X(38))*sin(X(37)), sin(X(37))*sin(X(38)); cos(X(39)), cos(X(40))*sin(X(39)), sin(X(39))*sin(X(40)); cos(X(41)), cos(X(42))*sin(X(41)), sin(X(41))*sin(X(42))]; Rho1 = B*B'; %用來近似真正的相關係數的相關係數估計矩陣 for i=1:1:21 for j=1:1:21 reb(21*(i-1)+j) = Rho1(i,j) - Rho(i,j); end end end -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.34.30.120

06/20 07:25, , 1F
每次讀檔太花時間
06/20 07:25, 1F

06/20 07:25, , 2F
先在主程式讀進記憶體,然後丟入fact
06/20 07:25, 2F

06/20 09:46, , 3F
那有關於那個訊息是怎麼回事,有頭緒嗎?
06/20 09:46, 3F

06/20 09:55, , 4F
有兩個訊息,上面那個意思就是ok了,正常收斂
06/20 09:55, 4F

06/20 09:55, , 5F
下面是指說經過4200次疊代,還是沒找出一個滿意的結果
06/20 09:55, 5F

06/20 09:56, , 6F
我建議依你的判斷猜一下初始值,不要用亂數
06/20 09:56, 6F

06/20 09:59, , 7F
然後最後兩個for 迴圈改用向量運算,不要用迴圈
06/20 09:59, 7F

06/20 12:28, , 8F
ok,thanks!!!!
06/20 12:28, 8F
文章代碼(AID): #1Fu85nbE (MATLAB)