2017-01-05 96 views
0
proc iml; 
start f_prob(beta) global(one_m_one, pone_m_one); 

p = nrow(one_m_one); 
td = j(p,3,0.); 
a = 1; 
do i = 1 to p; 
    td[i,1] = exp((one_m_one[i,1])*(beta[1]) + (one_m_one[i,2])*(beta[2]) + (one_m_one[i,3])*(beta[3]) + (one_m_one[i,4])*(beta[4]) + (one_m_one[i,5])*(beta[5]) + (one_m_one[i,6])*(beta[6]) + (one_m_one[i,7])*(beta[7]) + (one_m_one[i,8])*(beta[8]) + (one_m_one[i,9])*(beta[9]) + (one_m_one[i,10])*(beta[10])); 
    do j = a to 11+a; 
     td[i,2] = td[i,2] + exp((pone_m_one[j,1])*(beta[1]) + (pone_m_one[j,2])*(beta[2]) + (pone_m_one[j,3])*(beta[3]) + (pone_m_one[j,4])*(beta[4]) + (pone_m_one[j,5])*(beta[5]) + (pone_m_one[j,6])*(beta[6]) + (pone_m_one[j,7])*(beta[7]) + (pone_m_one[j,8])*(beta[8]) + (pone_m_one[j,9])*(beta[9]) + (pone_m_one[j,10])*(beta[10])); 
    end; 
    a = a + 12; 
end; 
td[,3] = td[,1]/td[,2]; 
f = 1; 
do i = 1 to p; 
    f = f*td[i,3]; 
end; 
return(f); 

finish f_prob; 

/* Set up the constraints: sum(x)=0 */ 
/*  x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 SIGN VALUE */ 
con = {. . . . . . . . . . . ., /* specify lower bounds */ 
     . . . . . . . . . . . ., /* specify upper bounds */ 
     1 1 1 1 1 1 1 1 1 1 0 0}; /* constraints */ 


beta0 = j(1,10,0); 
optn = {1,4}; 

call nlpnra(rc, result, "f_prob", beta0, optn) blc=con; 

嗨,我想優化函數f有10個參數在它的所有10個參數的總和爲零。SAS Proc IML優化

任何人都可以建議如何編寫最後部分的代碼,以便我可以優化f並獲得我想要的結果?提前致謝。

+0

在'f_prob'中你似乎有一個循環遍歷'j',但'j'沒有出現在循環表達式中。另外:你有'proc optmodel'? – Leo

+0

哎呀,我已經做了更改,以包括循環中的j。感謝您指出。 Proc optmodel能更好地工作嗎? – Sopon

+0

我已經嘗試過了,但是我使用的是se ue,它沒有Proc optmodel – Sopon

回答

0

該文檔提供了an example of how to specify a linear constraint matrix。例如,使用3 x 12矩陣。

  • 在第一行(列1:10)上放置參數的任何下界約束。
  • 在第二行(列1:10)中放置參數的任何上限約束。
  • 在第三行,把所有的列都放在1:10列。在第11欄中加上0表示等號。在第12列中放置0表示約束的值。

的代碼看起來是這樣的:

/* Set up the constraints: sum(x)=0 */ 
/*  x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 SIGN VALUE */ 
con = {. . . . . . . . . . . ., /* specify lower bounds */ 
     . . . . . . . . . . . ., /* specify upper bounds */ 
     1 1 1 1 1 1 1 1 1 1 0 0}; /* constraints */ 
call nlpnra(rc, result, "f_prob", beta, optn) blc=con; 

最後一行指定矩陣表達式C * X = 0,其中c = {1 1 ... 1}包含的係數第三排。

+0

嗨,我已經對我的代碼做了一些小的修改,並添加了你的建議,但我仍然有這個「錯誤:(執行)操作無效操作數。」問題。什麼可能是這個錯誤的原因?真的很感謝幫助。 – Sopon

+0

一般來說,你不應該編輯你的問題來包含答案。這使得未來的讀者很難看到原始問題並投票回答問題。 您現在有一個不同的問題,可能是算術計算中的錯誤。 SAS日誌應該顯示錯誤發生的行號。 – Rick