Pyomo DAE对ipopt进行可行性问题的调用没有与方程式相同的未知数

时间:2019-03-22 19:22:06

标签: pyomo ipopt

我正在运行pyomo.dae论文中发现的pyomo.dae的传热示例问题:

p。Nicholson,B.,Siirola,J.D.,Watson,JP。等。数学。编比较(2018)10:187。https://doi.org/10.1007/s12532-017-0127-0

从纸上复制并粘贴代码后,我已经能够正确运行代码。

result = this.value - that.value; //insert actual logic here

由于这是一个完全指定的问题,所以我希望方程式的数量等于未知数的数量。但是,ipopt的输出告诉我,未知数比方程式多60个。这对我来说似乎不正确。 pyomo是否正确解释了微分边界条件?我是否正确安装了ipopt?

下面是我从ipopt获得的输出。

from pyomo.environ import *
from run_util import choose_executable  # my executable path on my machine
from pyomo.dae import *

m = ConcreteModel()
m.pi = Param(initialize=3.1416)
m.t = ContinuousSet(bounds=(0, 2))
m.x = ContinuousSet(bounds=(0, 1))
m.u = Var(m.x, m.t)
# Declare derivatives in the model
m.dudx = DerivativeVar(m.u, wrt=m.x)
m.dudx2 = DerivativeVar(m.u, wrt=(m.x, m.x))
m.dudt = DerivativeVar(m.u, wrt=m.t)

# Declare PDE
def _pde(m, i, j):
    if i == 0 or i == 1 or j == 0:
        return Constraint.Skip
    return m.pi ** 2 * m.dudt[i, j] == m.dudx2[i, j]
m.pde = Constraint(m.x, m.t, rule=_pde)

def _initcon(m, i):
    if i == 0 or i == 1:
        return Constraint.Skip
    return m.u[i, 0] == sin(m.pi * i)
m.initcon = Constraint(m.x, rule=_initcon)

def _lowerbound(m, j):
    return m.u[0, j] == 0
m.lowerbound = Constraint(m.t, rule=_lowerbound)

def _upperbound(m, j):
    return m.pi * exp(-j) + m.dudx[1, j] == 0
m.upperbound = Constraint(m.t, rule=_upperbound)
m.obj = Objective(expr=1)

# Discretize using Finite Difference and Collocation
discretizer = TransformationFactory('dae.finite_difference')
discretizer2 = TransformationFactory('dae.collocation')
discretizer.apply_to(m, nfe = 25,wrt = m.x,scheme = 'BACKWARD')
discretizer2.apply_to(m, nfe = 20,ncp = 3,wrt = m.t)

solver = SolverFactory('ipopt', executable=choose_executable())
results = solver.solve(m, tee=True)

1 个答案:

答案 0 :(得分:0)

优化求解器的方程不必多于未知数。

让我们举个例子:

max z = x1 + x2 + x3

受制于 x1 + 2 * x2 + 3 * x3 = 15

在这里,如您所见,这是一个具有3个未知数(3个变量)和一个等式约束(等式)的最大化问题,求解器无论如何都会解决它。解决方案是x1 = 15,x2 = x3 =0。z=15。

如何?求解器只需要找到 best 可行解即可。他们不求解方程,而是优化值,这是一个非常关键的区别。

在这里,您的问题是线性的,线性求解器使用使用线性属性的快捷方式。但是非线性求解器也存在,它们是更好的例子,可以解释为什么求解器不需要比变量更多的方程式。您可以简单地要求他们找到抛物线函数的最低点。问题变为minx²,不需要约束。该解决方案可以在任何地方,并且可行(但非最佳)解决方案的数量是无限的。求解器使用许多方法来解决这个简单的问题,但是通常,求解器并没有做代数运算,而是遵循一种算法,该算法允许他们通过多次尝试和错误找到最低点(如果算法是很好)。可以将其视为盲人和聋哑人,他试图在洞中找到最深处。一些线索会帮助他找到它,例如他站立的地方的陡峭程度。他不需要知道孔是x²,但无论如何他都会找到它,并且不需要约束或方程式。他只需要知道他所处位置的陡峭程度即可。可以将其与梯度进行比较,并且可以使用许多方法来获得它。是的,可以使用代数导数来计算梯度,但有时,使用邻居解近似一个点就足够了(将其与盲人进行比较,可以向前看地面是否更高或更低)。

那么,对于线性问题,这是否意味着只能找到一种解决方案?否。让我们以这个问题为例:

最大x1 + x2

受制于 x1 + x2 <= 10

然后,x1 + x2 = 10的x1和x2的所有组合将是最佳解决方案。通常,解在数学上应该正确,看起来应该像x1 = k,x2 = 10-k,但是由于解算器是数字机器,因此它们通常会给出他们发现的满足最优条件的第一个解。如果求解器发现x1 = 2,x2 = 8,它将对此感到满意,并将返回此解决方案,说它是最优的,而且是正确的。

要记住的关于优化问题的另一个关键是,它可以在一组可行解中找到最优解,而求解方程式就是要找到一个唯一的可行解。虽然(x1 = 1,x2 = 3)并不是先前问题的最佳解决方案,但它仍然是可行的解决方案,并且与最佳解决方案一样有效。有时,很难找到最佳解决方案,而最终可能只有好的和有效的解决方案候选者而不是最佳解决方案。它们不会像最佳解决方案那样出色或客观,但是至少您会拥有它们。