2017-01-05 17 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

Я пробовал, но я использую sas ue, и у него нет Proc optmodel – Sopon

ответ

0

В документации предусмотрено an example of how to specify a linear constraint matrix. Для вашего примера используйте матрицу 3 x 12.

  • В первой строке (столбцы 1:10) помещены ограничения по нижним границам для параметров.
  • Во второй строке (столбцы 1:10) помещены любые ограничения сверху для параметров.
  • На третьей строке поместите все в столбцы 1:10. Поместите 0 в столбце 11, чтобы указать знак EQUAL. Поместите 0 в 12-й столбец, чтобы указать значение ограничения.

код выглядит следующим образом:

/* 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; 

Последняя строка определяет коэффициенты выражения матрицы с * х = 0, где с = {1 1 ... 1} содержит из третий ряд.

+0

Привет, я внес некоторые незначительные изменения в свой код и добавил в ваше предложение, но у меня все еще есть этот «ОШИБКА: (выполнение) Недопустимый операнд для операции». проблема. Что может быть причиной этой ошибки? Очень ценю помощь. – Sopon

+0

В общем, вы не должны редактировать свой вопрос, чтобы включить ответ. Это затрудняет будущим читателям видеть исходную проблему и голосовать за ответы. У вас теперь есть другая проблема, возможно, ошибка в арифметическом вычислении. В журнале SAS должен отображаться номер строки, в которой происходит ошибка. – Rick

 Смежные вопросы

  • Нет связанных вопросов^_^