Exemplo n.º 1
0
def main():
    m = create_model(4.5, 1.0)
    opt = pyo.SolverFactory('ipopt')
    results = opt.solve(m, tee=True)

    nlp = PyomoNLP(m)
    x = nlp.init_primals()
    y = compute_init_lam(nlp, x=x)
    nlp.set_primals(x)
    nlp.set_duals(y)

    J = nlp.extract_submatrix_jacobian(pyomo_variables=[m.x1, m.x2, m.x3],
                                       pyomo_constraints=[m.const1, m.const2])
    H = nlp.extract_submatrix_hessian_lag(
        pyomo_variables_rows=[m.x1, m.x2, m.x3],
        pyomo_variables_cols=[m.x1, m.x2, m.x3])

    M = BlockMatrix(2, 2)
    M.set_block(0, 0, H)
    M.set_block(1, 0, J)
    M.set_block(0, 1, J.transpose())

    Np = BlockMatrix(2, 1)
    Np.set_block(
        0, 0,
        nlp.extract_submatrix_hessian_lag(
            pyomo_variables_rows=[m.x1, m.x2, m.x3],
            pyomo_variables_cols=[m.eta1, m.eta2]))
    Np.set_block(
        1, 0,
        nlp.extract_submatrix_jacobian(pyomo_variables=[m.eta1, m.eta2],
                                       pyomo_constraints=[m.const1, m.const2]))

    ds = spsolve(M.tocsc(), -Np.tocsc())

    print("ds:\n", ds.todense())
    #################################################################

    p0 = np.array([pyo.value(m.nominal_eta1), pyo.value(m.nominal_eta2)])
    p = np.array([4.45, 1.05])
    dp = p - p0
    dx = ds.dot(dp)[0:3]
    x_indices = nlp.get_primal_indices([m.x1, m.x2, m.x3])
    x_names = np.array(nlp.primals_names())
    new_x_sens = x[x_indices] + dx
    print("dp:", dp)
    print("dx:", dx)
    print("Variable names: \n", x_names[x_indices])
    print("Sensitivity based x:\n", new_x_sens)

    #################################################################
    m = create_model(4.45, 1.05)
    opt = pyo.SolverFactory('ipopt')
    results = opt.solve(m, tee=False)
    nlp = PyomoNLP(m)
    new_x = nlp.init_primals()[nlp.get_primal_indices([m.x1, m.x2, m.x3])]
    print("NLP based x:\n", new_x)

    return new_x_sens, new_x
Exemplo n.º 2
0
def getZ(nlp, parm_vars):
    # Get the Z matrix to compute reduced hessian
    parm_vars_name = [x.name for x in parm_vars]
    non_parm_vars = [
        x for x in nlp.get_pyomo_variables() if x.name not in parm_vars_name
    ]

    Ji = nlp.extract_submatrix_jacobian(
        pyomo_variables=parm_vars,
        pyomo_constraints=nlp.get_pyomo_constraints())
    Jd = nlp.extract_submatrix_jacobian(
        pyomo_variables=non_parm_vars,
        pyomo_constraints=nlp.get_pyomo_constraints())
    #print("Ji")
    #print(Ji.todense())
    #print("Jd")
    #print(Jd.todense())

    Zd = spsolve(Jd.tocsc(), Ji.tocsc())
    Z = BlockMatrix(2, 1)
    Z[0, 0] = Zd
    Z[1, 0] = identity(len(parm_vars))
    #print("Z")
    #print(Z.todense())

    # reorder variables to the order in hessian
    zorder = getvarorder(nlp, parm_vars, non_parm_vars)
    Zorder = Z.tocsc()[zorder, :].todense()
    #print("Zorder")
    #print(Zorder)

    return Zorder
Exemplo n.º 3
0
J = nlp.evaluate_jacobian()
H = nlp.evaluate_hessian_lag()

M = BlockSymMatrix(2)
M[0, 0] = H
M[1, 0] = J

Np = BlockMatrix(2, 1)
Np[0, 0] = nlp.extract_submatrix_hessian_lag(
    pyomo_variables_rows=nlp.get_pyomo_variables(),
    pyomo_variables_cols=[m.eta1, m.eta2])
Np[1, 0] = nlp.extract_submatrix_jacobian(
    pyomo_variables=[m.eta1, m.eta2],
    pyomo_constraints=nlp.get_pyomo_constraints())

ds = spsolve(M.tocsc(), Np.tocsc())
print(nlp.variable_names())

#################################################################

p0 = np.array([pyo.value(m.nominal_eta1), pyo.value(m.nominal_eta2)])
p = np.array([4.45, 1.05])
dp = p - p0
dx = ds.dot(dp)[0:nlp.n_primals()]
new_x = x + dx
print(new_x)

#################################################################
m = create_model(4.45, 1.05)
opt = pyo.SolverFactory('ipopt')
results = opt.solve(m, tee=True)
Exemplo n.º 4
0
M = BlockMatrix(2, 2)
M.set_block(0, 0, H)
M.set_block(1, 0, J)
M.set_block(0, 1, J.transpose())

Np = BlockMatrix(2, 1)
Np.set_block(
    0, 0,
    nlp.extract_submatrix_hessian_lag(pyomo_variables_rows=[m.x1, m.x2, m.x3],
                                      pyomo_variables_cols=[m.eta1, m.eta2]))
Np.set_block(
    1, 0,
    nlp.extract_submatrix_jacobian(pyomo_variables=[m.eta1, m.eta2],
                                   pyomo_constraints=[m.const1, m.const2]))

ds = spsolve(M.tocsc(), -Np.tocsc())

print("ds:\n", ds.todense())
#################################################################

p0 = np.array([pyo.value(m.nominal_eta1), pyo.value(m.nominal_eta2)])
p = np.array([4.45, 1.05])
dp = p - p0
dx = ds.dot(dp)[0:3]
x_indices = nlp.get_primal_indices([m.x1, m.x2, m.x3])
x_names = np.array(nlp.variable_names())
new_x = x[x_indices] + dx
print("dp:", dp)
print("dx:", dx)
print("Variable names: \n", x_names[x_indices])
print("Sensitivity based x:\n", new_x)