1

動的 ( h(x, x', u) = 0 ) 制約 を受ける非線形最適制御問題を解こうとしています。
f
(x) = (u(t) - u(0)(t))^2 # u0(t) は、システムに提供される初期入力
h(x) = y'(t) - 積分(sqrt (u(t))*y(t) + y(t)) = 0 # 非線形微分方程式
-2 < y(t) < 10 # システム状態はこの範囲に限定される
-2 < u(t) < 10 # システム状態はこの範囲に制限されます
u0(t) # 任意の区分線形関数として定義されます

openopt と scipy を使用して、問題を Python コードに変換しようとしました。

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()

問題は、 y0 = 10のように正の初期値 y0 でコードを実行すると、満足のいく結果が得られることです。しかし、y0 = 0または負のy0 = -1を与えると 、nlp 問題は不足し、次のように
述べます 区分的
線形の初期 u0 で、関数 at の最初の範囲に 0 以外の数値を入力すると、次のよう になります 。 何か案は ? 前もって感謝します。t < 3
u0 = np.piecewise(t, [t < 3, and_(3 <= t, t < 6), 6 <= t], [2, lambda t: t - 3, lambda t: -t + 9])

u0 = np.piecewise(t, [t < 3, and_(3 <= t, t < 6), 6 <= t], [0, lambda t: t - 3, lambda t: -t + 9])


4

1 に答える 1