Practice Midterm Exam 1

Main.MidtermExam History

Hide minor edits - Show changes to markup

March 19, 2023, at 07:30 PM by 195.234.150.11 -
Changed line 5 from:
to:
Changed line 10 from:
to:
March 19, 2023, at 07:28 PM by 195.234.150.11 -
Deleted lines 3-4:

Midterm Exam 1

March 19, 2023, at 07:28 PM by 195.234.150.11 -
Changed line 1 from:

(:title Midterm Exam for Dynamic Optimization:)

to:

(:title Practice Midterm Exam 1:)

March 19, 2023, at 07:05 PM by 195.234.150.11 -
Changed line 5 from:

Midterm Exam 2015

to:

Midterm Exam 1

February 18, 2021, at 10:19 PM by 10.35.117.248 -
Added lines 17-51:

(:toggle hide numpy button show="Show Python Code":) (:div id=numpy:) (:source lang=python:)

  1. Matrix solution for Orthogonal Collocation on Finite Elements

import numpy as np

  1. Solve A x = b
  2. Matrix A

A = np.array()

  1. Column vector b

b = np.array([2,0,2,0,0,0,0,0])

  1. Solve A x = b as x = A^-1 * b

sol = np.linalg.solve(A,b)

print('States with Orthogonal Collocation') print(['x11 = ' + str(sol[0])]) print(['x21 = ' + str(sol[1])]) print(['x12 = ' + str(sol[2])]) print(['x22 = ' + str(sol[3])]) print(' ') print('Derivatives with Orthogonal Collocation') print(['d(x11)/dt = ' + str(sol[4])]) print(['d(x21)/dt = ' + str(sol[5])]) print(['d(x12)/dt = ' + str(sol[6])]) print(['d(x22)/dt = ' + str(sol[7])]) (:sourceend:) (:divend:)

Added lines 263-264:
February 15, 2018, at 05:39 PM by 199.201.64.144 -
Added lines 25-256:

(:toggle hide gekko2 button show="Show GEKKO (Python) Code":) (:div id=gekko2:) (:source lang=python:) import gekko import numpy as np import matplotlib.pyplot as plt

  1. Write data

boat = '''time,rpm,x 0.00,0.00,0.00 1.00,4007.30,0.00 2.00,4076.12,3.96 3.00,4032.04,9.59 4.00,5018.40,8.84 5.00,5033.08,25.65 6.00,5085.69,33.06 7.00,2084.71,38.92 8.00,2002.84,51.49 9.00,2082.02,64.40 10.00,2091.07,78.46 11.00,2074.44,88.33 12.00,2002.35,89.96 13.00,2013.06,107.71 14.00,0.00,117.54 15.00,0.00,121.15 16.00,0.00,131.14 17.00,0.00,130.36 18.00,0.00,138.19 19.00,0.00,147.58 20.00,0.00,150.32 21.00,0.00,155.60 22.00,0.00,155.86 23.00,0.00,152.69 24.00,0.00,163.63 25.00,0.00,167.09 26.00,0.00,166.98 27.00,0.00,170.07 28.00,0.00,172.09 29.00,0.00,170.63 30.00,0.00,175.21 '''

fid = open('boat.csv','w') fid.write(boat) fid.close()

  1. Model
  2. initialize model

m = gekko.GEKKO()

  1. set time

m.time = np.linspace(0,30,31)

  1. set parameters

m_boat = m.Param(value=500) dens = m.Param(value=1000) Cd = m.Param(value=0.05) Ac = m.Param(value=0.8)

m_passengers = m.FV(value=400) RPM = m.MV(lb=0,ub=5000)

  1. Variables

Fd = m.Var(value=0) #drag force Fp = m.Var(value=0) #propeller force x = m.CV(value=0) #position v = m.CV(value=0) #velocity a = m.Var(value=0) #acceleration

  1. Equations

m.Equation(Fd == 1/2 * dens * v**2 * Cd * Ac) m.Equation(Fp == 40 * m.sqrt(RPM)) m.Equation(x.dt() == v) m.Equation(v.dt() == a) m.Equation((m_boat+m_passengers)*a == Fp - Fd)

  1. Simulation

m.options.IMODE = 4 #simulation m.options.NODES = 3 m.options.TIME_SHIFT = 0 #allow resolving without timeshift

  1. don't use .MEAS to update values

RPM.FSTATUS = 0 m_passengers.FSTATUS = 0 v.FSTATUS = 0 x.FSTATUS = 0

  1. set RPM to jump from 0 to 5000 at time=1

RPM.value = np.ones(np.size(m.time))*5000 RPM.value[0:5]=0

  1. initially set passengers to 0

m_passengers.value = 0

m.solve(disp=False)

plt.figure(1) plt.plot(m.time,v.value,'k--') print("Velocity at time 6: ", v.value[10])

  1. add passengers

m_passengers.value = 400

m.solve(disp=False) plt.plot(m.time,v.value,'r-') print("Velocity at time 6: ", v.value[10])

  1. Estimation
  2. initialize model

m = gekko.GEKKO()

  1. set time

m.time = np.linspace(0,30,31)

  1. set parameters

m_boat = m.Param(value=500) dens = m.Param(value=1000) Cd = m.Param(value=0.05) Ac = m.Param(value=0.8)

m_passengers = m.FV(value=400) RPM = m.MV(lb=0,ub=5000)

  1. Variables

Fd = m.Var(value=0) #drag force Fp = m.Var(value=0) #propeller force x = m.CV(value=0) #position v = m.CV(value=0) #velocity a = m.Var(value=0) #acceleration

  1. Equations

m.Equation(Fd == 1/2 * dens * v**2 * Cd * Ac) m.Equation(Fp == 40 * m.sqrt(RPM)) m.Equation(x.dt() == v) m.Equation(v.dt() == a) m.Equation((m_boat+m_passengers)*a == Fp - Fd)

  1. load data from csv

m.time, RPM.value, x.value = np.loadtxt('boat.csv', delimiter=',',skiprows=1,unpack=True) time, RPM_data, x_data = np.loadtxt('boat.csv', delimiter=',',skiprows=1,unpack=True)

  1. set options

m.options.IMODE = 5 #Dynamic estimation m.options.EV_TYPE = 2 RPM.STATUS = 0 v.STATUS = 0 m_passengers.STATUS = 1 x.STATUS = 1 x.WMODEL = 0

m.solve(disp=False)

plt.figure(2) plt.subplot(3,1,1) plt.plot(m.time,x.value,'r-') plt.scatter(m.time,x_data) plt.ylabel('x') plt.subplot(3,1,2) plt.plot(m.time,v.value,'k--') plt.ylabel('v') plt.subplot(3,1,3) plt.plot(m.time,RPM.value,'b-') plt.scatter(m.time,RPM_data) plt.ylabel('RPM') plt.xlabel('time')

print("Passenger weight: ", m_passengers.value[0])

  1. Control
  2. initialize model

m = gekko.GEKKO()

  1. set time

m.time = np.linspace(0,30,31)

  1. set parameters

m_boat = m.Param(value=500) dens = m.Param(value=1000) Cd = m.Param(value=0.05) Ac = m.Param(value=0.8)

m_passengers = m.FV(value=400) RPM = m.MV(lb=0,ub=5000)

  1. Variables

Fd = m.Var(value=0) #drag force Fp = m.Var(value=0) #propeller force x = m.CV(value=0) #position v = m.CV(value=0) #velocity a = m.Var(value=0) #acceleration

  1. Equations

m.Equation(Fd == 1/2 * dens * v**2 * Cd * Ac) m.Equation(Fp == 40 * m.sqrt(RPM)) m.Equation(x.dt() == v) m.Equation(v.dt() == a) m.Equation((m_boat+m_passengers)*a == Fp - Fd)

m.options.IMODE = 6 #dynamic control m.options.CV_TYPE = 1

m_passengers.STATUS = 0 RPM.STATUS = 1 x.STATUS = 0 v.STATUS = 1 m_passengers.value = 400 a.UB = 1 v.SPHI = 10.1 v.SPLO = 9.9

m.solve(disp=False)

plt.figure(3) plt.subplot(3,1,1) plt.plot(m.time,RPM.value,'b-') plt.ylabel('RPM') plt.subplot(3,1,2) plt.plot(m.time,v.value,'k--') plt.ylabel('v') plt.subplot(3,1,3) plt.plot(m.time,a.value,'g-') plt.ylabel('a') plt.xlabel('time') plt.show() (:sourceend:) (:divend:)

Changed line 5 from:

Midterm Exam

to:

Midterm Exam 2015

May 22, 2015, at 06:27 AM by 45.56.3.184 -
Changed lines 28-30 from:

(:htmlend:)

to:

(:htmlend:)

Note: the solution (zip) files are correct. The video uses nodes=2, causing numerical integration error that gives a different estimated weight of the passengers.

May 20, 2015, at 05:11 PM by 45.56.3.184 -
Added line 17:
May 20, 2015, at 05:10 PM by 45.56.3.184 -
Changed lines 10-11 from:

Solution: Orthogonal Collocation

to:
Changed lines 21-23 from:

Solution: Simulation, MHE, and MPC

to:
May 19, 2015, at 12:05 AM by 10.10.150.47 -
Changed lines 10-11 from:

Solution for Orthogonal Collocation

to:

Solution: Orthogonal Collocation

Changed lines 16-17 from:

Solution for Simulation, MHE, and MPC

to:

Solution: Simulation, MHE, and MPC

(:html:) <iframe width="560" height="315" src="https://www.youtube.com/embed/NR76GRnCB2g" frameborder="0" allowfullscreen></iframe> (:htmlend:)

May 18, 2015, at 11:34 PM by 10.10.150.47 -
Added lines 10-11:

Solution for Orthogonal Collocation

Added lines 15-16:

Solution for Simulation, MHE, and MPC

May 18, 2015, at 11:33 PM by 10.10.150.47 -
Changed lines 10-12 from:
to:

(:html:) <iframe width="560" height="315" src="https://www.youtube.com/embed/9uneug4cUrs" frameborder="0" allowfullscreen></iframe> (:htmlend:)

May 15, 2015, at 07:10 PM by 10.10.148.40 -
Added lines 1-11:

(:title Midterm Exam for Dynamic Optimization:) (:keywords Python, MATLAB, Simulink, nonlinear control, model predictive control, exam, midterm:) (:description Mid-term exam for dynamic estimation and optimization as a graduate-level course.:)

Midterm Exam