Uni-Logo
Sie sind hier: Startseite Professuren Diehl, Moritz Events Dateien Direct single shooting solution for example OCP

Direct single shooting solution for example OCP

direct_single_shooting.py — Python Source, 1Kb

Dateiinhalt

from casadi import *
from numpy import *
import matplotlib.pyplot as plt

N = 20      # Control discretization
T = 10.0    # End time

# Declare variables (use scalar graph)
u  = SX.sym("u")    # control
x  = SX.sym("x",2)  # states

# System dynamics
xdot = vertcat( [(1 - x[1]**2)*x[0] - x[1] + u, x[0]] )
qdot = x[0]**2 + x[1]**2 + u**2
f = SXFunction([x,u],[xdot,qdot])
f.init()

# RK4 with M steps
U = MX.sym("U")
X = MX.sym("X",2)
M = 10; DT = T/(N*M)
XF = X
QF = 0
for j in range(M):
    [k1, k1_q] = f([XF,             U])
    [k2, k2_q] = f([XF + DT/2 * k1, U])
    [k3, k3_q] = f([XF + DT/2 * k2, U])
    [k4, k4_q] = f([XF + DT   * k3, U])
    XF += DT/6*(k1   + 2*k2   + 2*k3   + k4)
    QF += DT/6*(k1_q + 2*k2_q + 2*k3_q + k4_q)
F = MXFunction([X,U],[XF,QF])
F.init()

# Formulate NLP (use matrix graph)
nv = N
v = MX.sym("v",nv)

# Objective function
J=0

# Get an expression for the cost and state at end
X = MX([0,1])
for k in range(N):
    [X, qf] = F([X,v[k]])
    J += qf

# Terminal constraints: x_0(T)=x_1(T)=0
g = X

# Allocate an NLP solver
nlp = MXFunction(nlpIn(x=v),nlpOut(f=J,g=g))
solver = NlpSolver("ipopt", nlp)
solver.init()

# Set bounds and initial guess
solver.setInput( 0., "x0")
solver.setInput(-1., "lbx")
solver.setInput( 1., "ubx")
solver.setInput( 0., "lbg")
solver.setInput( 0., "ubg")

# Solve the problem
solver.evaluate()

# Retrieve the solution
u_opt = solver.getOutput("x")

# Plot the results
plt.figure(1)
plt.clf()
plt.step(linspace(0,T,N),u_opt,'-.')
plt.title("Van der Pol optimization - single shooting")
plt.xlabel('time')
plt.legend(['u trajectory'])
plt.grid()
plt.show()

« April 2024 »
April
MoDiMiDoFrSaSo
1234567
891011121314
15161718192021
22232425262728
2930
Benutzerspezifische Werkzeuge