2017-10-04 1 views
1

저는 pyomo와 함께 작업 중이며 이미 정의 된 모델을 가지고 있습니다. 객관적인 함수가 있어야합니다. 모델이 풀린 후에는 목적 함수에 특정 매개 변수가 첨부됩니다. 그래서 만약 다중 인덱스 변수 [x1, x2, x3]을 가지고 있다면, 제 2 차 목적 함수는 다음과 같이 보일 것입니다 : (x1^2 + 13*x2^2 + 10*x3^2) + (2*x1 +......).pyomo에서 어떻게 객관적인 함수에서 2 차 미분을 추출 할 수 있습니까?

내 질문은 : 실제로 내가 목표에서 문자열 형식으로이 표현식에 액세스 할 수있는 주어진 모든 변수에 대해이 함수의 두 번째 파생물을 구하는 방법은 무엇입니까?

답변

1

Pyomo에서 두 가지 방법으로 파생 정보를 얻을 수 있습니다.

단일 지점에서 숫자 파생물을 사용해야하는 경우 Pyomo에서 생성 한 NL 파일을 사용할 수있는 "gjh_asl_json"도구 (https://github.com/ghackebeil/gjh_asl_json)와 같은 도구를 사용하여 Jacobian 및 Hessian 정보가있는 JSON 파일을 생성 할 수 있습니다.

당신이 상징적 인 파생 상품을 원하는 경우에, Pyomo 당신은 또한 sympy가 설치되어 제공, 직접 사람들을 제공 할 수 있습니다 : 모두는 당신에게 같은 줄 것이다 당신의 표현이, 차 미분 기호 및 숫자입니다 주어진 물론

from pyomo.core.base.symbolic import differentiate 
from pyomo.core.base.expr import identify_variables 
# assuming model.objective is your Objective component 
varList = list(identify_variables(model.objective.expr)) 
firstDerivs = differentiate(model.objective.expr, wrt_list=varList) 
# Note this calculates d^2/dx_i^2; if you want the full Hessian matrix 
# (\delta^2/{\delta x_i \delta x_j}) replace "wrt=v" with "wrt_list=varList" 
secondDerivs = [ differentiate(firstDerivs[i], wrt=v) for i,v in enumerate(varList) ] 

, 대답.

+0

감사합니다. –

+0

불행히도 '잘못된 구문'오류로 실패합니다. 내 표현은 파서가 너무 복잡하거나 변수 이름에 문제가있다. 너무 우아한 해결책 인 것 같아서 너무 좋지 않다. –

+0

'잘못된 구문'오류에 대해 좀 더 자세히 설명해 주시겠습니까? –

관련 문제