I implemented the following model in with Pyomo, where I fix the value of y equal to -5:
<code>import pyomo.environ as pyo
from pyomo.opt import SolverFactory
opt = pyo.SolverFactory('glpk')
S = pyo.ConcreteModel()
S.dual = pyo.Suffix(direction=Suffix.IMPORT_EXPORT)
S.x = pyo.Var(within=NonNegativeReals)
S.y = pyo.Var()
S.obj = pyo.Objective(expr= S.x, sense=minimize)
S.cc = pyo.ConstraintList()
S.cc.add(2*S.x >= 3-S.y)
S.y.fix(-5.0)
opt.solve(S)
print(value(S.x))
print(value(S.y))
print(S.dual[S.cc[1]])
</code>
<code>import pyomo.environ as pyo
from pyomo.opt import SolverFactory
opt = pyo.SolverFactory('glpk')
S = pyo.ConcreteModel()
S.dual = pyo.Suffix(direction=Suffix.IMPORT_EXPORT)
S.x = pyo.Var(within=NonNegativeReals)
S.y = pyo.Var()
S.obj = pyo.Objective(expr= S.x, sense=minimize)
S.cc = pyo.ConstraintList()
S.cc.add(2*S.x >= 3-S.y)
S.y.fix(-5.0)
opt.solve(S)
print(value(S.x))
print(value(S.y))
print(S.dual[S.cc[1]])
</code>
import pyomo.environ as pyo
from pyomo.opt import SolverFactory
opt = pyo.SolverFactory('glpk')
S = pyo.ConcreteModel()
S.dual = pyo.Suffix(direction=Suffix.IMPORT_EXPORT)
S.x = pyo.Var(within=NonNegativeReals)
S.y = pyo.Var()
S.obj = pyo.Objective(expr= S.x, sense=minimize)
S.cc = pyo.ConstraintList()
S.cc.add(2*S.x >= 3-S.y)
S.y.fix(-5.0)
opt.solve(S)
print(value(S.x))
print(value(S.y))
print(S.dual[S.cc[1]])
The solution for this model is x = 4, y = -5 and the dual variable = -0.5.
Then I consider an equivalent model where we substitute the constraint with 2*S.x >= 8.
<code>import pyomo.environ as pyo
from pyomo.opt import SolverFactory
opt = pyo.SolverFactory('glpk')
S = pyo.ConcreteModel()
S.dual = pyo.Suffix(direction=Suffix.IMPORT_EXPORT)
S.x = pyo.Var(within=NonNegativeReals)
S.y = pyo.Var()
S.obj = pyo.Objective(expr= S.x, sense=minimize)
S.cc = pyo.ConstraintList()
S.cc.add(2*S.x >= 8)
S.y.fix(-5.0)
opt.solve(S)
print(value(S.x))
print(value(S.y))
print(S.dual[S.cc[1]])
</code>
<code>import pyomo.environ as pyo
from pyomo.opt import SolverFactory
opt = pyo.SolverFactory('glpk')
S = pyo.ConcreteModel()
S.dual = pyo.Suffix(direction=Suffix.IMPORT_EXPORT)
S.x = pyo.Var(within=NonNegativeReals)
S.y = pyo.Var()
S.obj = pyo.Objective(expr= S.x, sense=minimize)
S.cc = pyo.ConstraintList()
S.cc.add(2*S.x >= 8)
S.y.fix(-5.0)
opt.solve(S)
print(value(S.x))
print(value(S.y))
print(S.dual[S.cc[1]])
</code>
import pyomo.environ as pyo
from pyomo.opt import SolverFactory
opt = pyo.SolverFactory('glpk')
S = pyo.ConcreteModel()
S.dual = pyo.Suffix(direction=Suffix.IMPORT_EXPORT)
S.x = pyo.Var(within=NonNegativeReals)
S.y = pyo.Var()
S.obj = pyo.Objective(expr= S.x, sense=minimize)
S.cc = pyo.ConstraintList()
S.cc.add(2*S.x >= 8)
S.y.fix(-5.0)
opt.solve(S)
print(value(S.x))
print(value(S.y))
print(S.dual[S.cc[1]])
The solution for this model is x = 4, y = -5 and the dual variable = 0.5.
Why the dual variable has different results if the model is semantically the same?