Python 用openopt和scipy求解具有动态约束的非线性优化系统时的误差
我试图解决一个受动态hx,x',u=0约束的非线性最优控制问题。 鉴于: fx=ut-u0t^2 u0t是提供给系统的初始输入 hx=y't-积分qrtut*yt+yt=0一个非线性微分方程 -2Python 用openopt和scipy求解具有动态约束的非线性优化系统时的误差,python,numpy,scipy,nonlinear-optimization,Python,Numpy,Scipy,Nonlinear Optimization,我试图解决一个受动态hx,x',u=0约束的非线性最优控制问题。 鉴于: fx=ut-u0t^2 u0t是提供给系统的初始输入 hx=y't-积分qrtut*yt+yt=0一个非线性微分方程 -2
我的第一个想法是,你似乎在解决一个二维最优控制问题,就像它是一个一维问题一样 约束动力学$hx,x',t$实际上是一个二阶常微分方程 yt-sqrtut*yt+yt=0 从这一点开始,我将以标准方式将我的系统改写为二维一阶系统 我的第二个想法是,您似乎在每个时间步独立优化$ut$,而问题是全局优化$u$,整个函数。因此,如果有任何问题,对NLP的调用应该在for循环之外 有专门的最佳控制开源工具箱: 从肾盂学角度讲,有JModellica: 另外,我还成功地在C中使用了:ACADO++
import numpy as np
from scipy.integrate import *
from openopt import NLP
import matplotlib.pyplot as plt
from operator import and_
N = 15*4
y0 = 10
t0 = 0
tf = 10
lb, ub = np.ones(2)*-2, np.ones(2)*10
t = np.linspace(t0, tf, N)
u0 = np.piecewise(t, [t < 3, and_(3 <= t, t < 6), 6 <= t], [2, lambda t: t - 3, lambda t: -t + 9])
p = np.empty(N, dtype=np.object)
r = np.empty(N, dtype=np.object)
y = np.empty(N, dtype=np.object)
u = np.empty(N, dtype=np.object)
ff = np.empty(N, dtype=np.object)
for i in range(N):
t = np.linspace(t0, tf, N)
b, a = t[i], t[i - 1]
integrand = lambda t, u1, y1 : np.sqrt(u1)*y1 + y1
integral = lambda u1, y1 : fixed_quad(integrand, a, b, args=(u1, y1))[0]
f = lambda x1: ((x1[1] - u0[i])**2).sum()
h = lambda x1: x1[0] - y0 - integral(x1[0], x1[1])
p[i] = NLP(f, (y0, u0[i]), h=h, lb=lb, ub=ub)
r[i] = p[i].solve('scipy_slsqp')
y0 = r[i].xf[0]
y[i] = r[i].xf[0]
u[i] = r[i].xf[1]
ff[i] = r[i].ff
figure1 = plt.figure()
axis1 = figure1.add_subplot(311)
plt.plot(u0)
axis2 = figure1.add_subplot(312)
plt.plot(u)
axis2 = figure1.add_subplot(313)
plt.plot(y)
plt.show()