Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用openopt和scipy求解具有动态约束的非线性优化系统时的误差_Python_Numpy_Scipy_Nonlinear Optimization - Fatal编程技术网

Python 用openopt和scipy求解具有动态约束的非线性优化系统时的误差

Python 用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',u=0约束的非线性最优控制问题。 鉴于: fx=ut-u0t^2 u0t是提供给系统的初始输入 hx=y't-积分qrtut*yt+yt=0一个非线性微分方程 -2 我尝试使用openopt和scipy将问题转化为python代码:

现在的问题是,用一个正的初始值y0运行代码,比如y0=10,代码将得到令人满意的结果。 但如果给出y0=0或负y0=-1,nlp问题将是有缺陷的,即: 未获得可行解1约束等于NaN,MaxRestrain=0,objFunc=NaN 此外,考虑分段线性初始值u0,如果将除0以外的任何数字放在t<3处函数的第一个范围,则意味着:
我的第一个想法是,你似乎在解决一个二维最优控制问题,就像它是一个一维问题一样

约束动力学$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()