source: branches/dev-5819/Python/src/tests_jmodelica/optimization/test_realtime_mpc.py @ 13800

Last change on this file since 13800 was 13800, checked in by randersson, 8 weeks ago

#5819 Merged trunk into branch

File size: 4.4 KB
Line 
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3
4# Copyright (C) 2015 Modelon AB
5#
6# This program is free software: you can redistribute it and/or modify
7# it under the terms of the GNU General Public License as published by
8# the Free Software Foundation, version 3 of the License.
9#
10# This program is distributed in the hope that it will be useful,
11# but WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13# GNU General Public License for more details.
14#
15# You should have received a copy of the GNU General Public License
16# along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18"""
19Tests the real time MPC base class.
20"""
21
22import os
23import math
24
25import numpy as N
26from tests_jmodelica import testattr, get_files_path
27
28try:
29    from pyjmi.optimization.realtimecontrol import ParameterChanges, MPCSimBase
30    from pyjmi.optimization.casadi_collocation import BlockingFactors
31except (NameError, ImportError):
32    pass
33
34
35def check_result(results, ref):
36    for key in ref:
37        assert abs(ref[key] - results[key][-1]) < 1e-2, abs(ref[key] - results[key][-1])
38       
39
40@testattr(casadi_base = True)
41def test_realtime_mpc():
42    start_values = {'_start_phi': 0, '_start_v': 0, '_start_z': 0}
43    par_changes = ParameterChanges({1: {'z_ref': 5}})
44    ref = {'phi': 0.936978004043,
45           'z': 4.25919322427,
46           'v': 3.40523065632,
47           'u': -0.0597209819244,
48           'time': 2.0}
49
50    path = os.path.join(get_files_path(), 'Modelica', 'bnb.mop')
51    mpc = MPCSimBase(path, 'Ball_Beam.Ball_Beam_MPC',
52                     'Ball_Beam.Ball_Beam_MPC_Model', 0.05, 1, 2,
53                     start_values, {}, ['phi', 'v', 'z'], ['u'], None,
54                     par_changes)
55    results, _ = mpc.run()
56    check_result(results, ref)
57
58@testattr(casadi_base = True)
59def test_realtime_mpc_ia():
60    start_values = {'_start_h1': 0, '_start_h2': 0,
61                    '_start_h3': 0, '_start_h4': 0}
62    ref = {'h1': 5.41158639648,
63           'h2': 5.14179296558,
64           'h3': 7.6831333579,
65           'h4': 8.66958129138,
66           'u1': 10.0,
67           'u2': 10.0,
68           'time': 5.0}
69    mpc_opts = {'blocking_factors': BlockingFactors(
70        {'u1': [1]*30, 'u2': [1]*30}, du_quad_pen = {'u1': 0.1, 'u2': 0.1})}
71   
72    path = os.path.join(get_files_path(), 'Modelica', 'quadtank.mop')
73    mpc = MPCSimBase(path, 'QuadTank.QuadTank_MPC',
74                     'QuadTank.QuadTank_MPC_Model', 1, 30, 5, 
75                     start_values, {}, ['h1', 'h2', 'h3', 'h4'],
76                     ['u1', 'u2'], mpc_options=mpc_opts)
77    T = 1
78    dt = 1
79    mu = math.exp(-float(dt)/T)
80    k = mpc.solver.op.get('k')
81    A = mpc.solver.op.get('A')
82    gamma = mpc.solver.op.get('gamma')
83    B = k/A*dt*N.array([[gamma  , 0      ],
84                        [0      , gamma  ],
85                        [0      , 1-gamma],
86                        [1-gamma, 0      ]])
87    M = N.linalg.inv(B.T.dot(B)).dot(B.T)
88    mpc.enable_integral_action(mu, M, u_e = [1.0, -1.0])
89    results, _ = mpc.run()
90    check_result(results, ref)
91
92@testattr(casadi_base = True)
93def test_realtime_mpc_cg():
94    start_values = {'_start_px': 0, '_start_py': 0, '_start_l': 1,
95                    '_start_vx': 0, '_start_vy': 0, '_start_der_l': 0,
96                    '_start_tx': 0, '_start_ty': 0,
97                    '_start_wx': 0, '_start_wy': 0}
98    par_changes = ParameterChanges({1: {'lx_ref': 0.5,
99                                        'ly_ref': 1.0,
100                                        'lz_ref': -0.5}})
101    ref = {'px': 0.346932431817,
102           'py': 0.694178183248,
103           'ul': 0.11764811976,
104           'vx': 0.263449683258,
105           'vy': 0.520923008414,
106           'der_l': 0.237609752809,
107           'tx': 0.153826374643,
108           'ty': 0.29862921556,
109           'wx': 1.20408324142,
110           'wy': 2.20145775869,
111           'ux': -0.0554289031676,
112           'uy': -0.11787736265,
113           'ul': 0.117369869311,
114           'time': 2.0}
115   
116    path = os.path.join(get_files_path(), 'Modelica', 'crane.mop')
117    mpc = MPCSimBase(path, 'Crane.Crane_MPC', 'Crane.Crane_MPC_Model',
118                     0.2, 2, 2, start_values, {},
119                     ['px', 'py', 'vx', 'vy', 'l', 'der_l', 'tx', 'ty', 'wx', 'wy'],
120                     ['ux', 'uy', 'ul'], None,  par_changes)
121    mpc.enable_codegen()
122    results, _ = mpc.run()
123    check_result(results, ref)
124   
Note: See TracBrowser for help on using the repository browser.