我正在尝试添加一个约束,该约束指定在优化中,求解器必须在设定的持续时间内选择 u 的值,并且只能在设定的时间后切换。例如,假设我有一个只能每 10 秒切换一次输入值的机械设备。然后,我希望优化器考虑到这一点。我将在这里附上代码:
for it_i in range(0, N-1, equivalence_samples):
print("N: {}".format(N))
for it_j in range(0, equivalence_samples - 1):
if (it_i + it_j + 1) > N-1:
print("Breaking")
break
else:
constraint_u0 = prog.AddConstraint(u[0, it_i + it_j] == u[0, it_i + it_j + 1]) # add equivalence constraints
constraint_u1 = prog.AddConstraint(u[1, it_i + it_j] == u[1, it_i + it_j + 1]) # add equivalence constraints
print('Constraint_u_PE: {}'.format(constraint_u0))
print('Constraint_u_NI: {}'.format(constraint_u1))
我已经实现了这一点,我希望这是一个可行的解决方案。有时它似乎在工作,而其他时候却没有。
我将展示一些输出约束的照片,然后是一个不工作的例子。
然后,这里的图表清楚地表明切换时间之间存在一些界限,但这些值并不相等。我也附上了生成这个图的代码。
u_sol = result.GetSolution(u)
u_time = np.linspace(0, N-1, num = N)
# u_sol_trajectory = PiecewisePolynomial.ZeroOrderHold(u_time, u_sol)
plt.figure()
plt.plot(u_time, u_sol[0, :], 'o')
plt.plot(u_time, u_sol[1, :], 'o')
plt.xlabel('time steps')
plt.ylabel('u [mcg/min]')
plt.legend(['u_PE', 'u_NI'])


