This paper was converted on www.awesomepapers.org from LaTeX by an anonymous user.
Want to know more? Visit the Converter page.

Tuning of Online Feedback Optimization for setpoint tracking in centrifugal compressors

Marta Zagorowska    Lukas Ortmann    Alisa Rupenyan    Mehmet Mercangöz    Lars Imsland Department of Engineering Cybernetics, Norwegian University of Science and Technology, email: {marta.zagorowska,lars.imsland}@ntnu.no Eastern Switzerland University of Applied Sciences, email: lukas.ortmann@ost.ch Department of Chemical Engineering, Imperial College London, email: m.mercangoz@imperial.ac.uk ZHAW Centre for Artificial Intelligence, ZHAW Zürich University of Applied Sciences, Switzerland, email: rupn@zhaw.ch
Abstract

Online Feedback Optimization (OFO) controllers steer a system to its optimal operating point by treating optimization algorithms as auxiliary dynamic systems. Implementation of OFO controllers requires setting the parameters of the optimization algorithm that allows reaching convergence, posing a challenge because the convergence of the optimization algorithm is often decoupled from the performance of the controlled system. OFO controllers are also typically designed to ensure steady-state tracking by fixing the sampling time to be longer than the time constants of the system. In this paper, we first quantify the impact of OFO parameters and the sampling time on the tracking error and number of oscillations of the controlled system, showing that adjusting them without waiting for steady state allows good tracking. We then propose a tuning method for the sampling time of the OFO controller together with the parameters to allow tracking fast trajectories while reducing oscillations. We validate the proposed tuning approach in a pressure controller in a centrifugal compressor, tracking trajectories faster than the time needed to reach the steady state by the compressor. The results of the validation confirm that simultaneous tuning of the sampling time and the parameters of OFO yields up to 87% times better tracking performance than manual tuning based on steady state.

keywords:
Online Feedback Optimization, controller tuning, sampling time
thanks: Research supported by Marie Curie Horizon Postdoctoral Fellowship project RELIC (grant no 101063948).

1 Introduction

OFO controllers steer a system to a locally optimal operating point without explicitly solving a nonlinear constrained optimization problem (Hauswirth et al., 2021a), thus showing similarities with classic approaches like extremum seeking (ES) control (He et al., 2023). Instead of introducing additional perturbations like ES, OFO ensures reaching the optimum by exploiting properties of feedback control and iterative optimization algorithms, typically based on gradients for fast convergence. Thus, OFO implementations require tuning of the parameters of the underlying optimization algorithm, such as the time step between iterations, the length of a step in a single iteration, as well as weighting matrices (Hauswirth et al., 2021a). Successful applications of OFO include electric grids (Ortmann et al., 2023) and compressor stations (Zagorowska et al., 2022) where the parameters of OFO were set experimentally. Gil et al. (2023) proposed an iterative tuning method for the parameters of OFO in a distillation system, iteratively adjusting the step length and weights with a fixed sampling time until the desired convergence of OFO was reached. However, the choice of the sampling time and the proposed tuning method were based on expert knowledge on the effect of the controller on the distillation system and thus application specific. In this work, we propose a method for tuning simultaneously the time step and the parameters of OFO without using explicit knowledge about their impact on the responses of the system.

Tuning of sampling time of controllers is classically done with respect to the timescales of the controlled system (Åström and Hägglund, 1984). Gil et al. (2023) chose the sampling time of OFO so that the controller runs on a slower timescale than the underlying dynamic system, thus ensuring timescale separation (Hauswirth et al., 2021b). Picallo et al. (2022) and Gil et al. (2023) indicated that large sampling time may lead to suboptimal performance of the controller especially in OFO using gradient-based optimization algorithms. At the same time, Belgioioso et al. (2022) have applied OFO with sampling time of minutes in optimization of building climate control operating on a timescale of hours, showing that OFO controllers can work without timescale separation. Thus, to find a trade-off between ensuring timescale separation and the performance of OFO based on gradient descent, we formulate a tuning optimization problem to find a sampling time that satisfies the requirements on the responses of the system.

In this paper, we analyse the impact of parameters of OFO on the performance of the controlled system, indicating that adjustment of the sampling time allows shaping the response of the controlled system. We develop a tuning framework for OFO so that the response of the controlled system has the desired properties with respect to error tracking and oscillatory behaviour. The performance of tuning is shown in an OFO controller for tracking suction pressure in centrifugal compressors without timescale separation.

The paper is structured as follows. Section 2 presents the optimization problem for OFO tuning, which is then applied in Section 3 in a case study of compressor control. Section 4 analyses the impact of parameters on OFO performance, while Section 5 presents the tuning framework and validation results for the compressor. Section 6 presents conclusions and directions for future work.

2 Online Feedback Optimization for dynamic systems

2.1 Dynamic system

The controlled system is described by nonlinear dynamics:

x˙(t)=f(x,u)\dot{x}(t)=f(x,u) (1)

where f:s×psf:\mathds{R}^{s}\times\mathds{R}^{p}\rightarrow\mathds{R}^{s} is continuously differentiable. The inputs upu\in\mathds{R}^{p} are constrained by the physics of the system, b2ub1-b_{2}\leq u\leq b_{1}, bi+pb_{i}\in\mathds{R}_{+}^{p}, i=1,2i=1,2. The outputs yny\in\mathds{R}^{n} are described by a continuously differentiable nonlinear mapping y=g(x,u)y=g(x,u) and g:s×png:\mathds{R}^{s}\times\mathds{R}^{p}\rightarrow\mathds{R}^{n}. We assume that for a constant uu, the system (1) reaches a steady state xs(u)x_{s}(u) such that f(xs,u)=0f(x_{s},u)=0. Then we have:

y=g(xs(u),u)=h(u)y=g(x_{s}(u),u)=h(u) (2)

where h:snh:\mathds{R}^{s}\rightarrow\mathds{R}^{n} is a continuously differentiable nonlinear steady state mapping. We further assume that the outputs yy in (2) are bounded for any bounded inputs uu. We want to design an OFO controller so that the outputs (2) track a setpoint yspy_{sp}.

2.2 Online Feedback Optimization

Online Feedback Optimization (OFO) is designed to solve problems of the form (Picallo et al., 2022):

minu𝒰,y𝒴\displaystyle\min_{u\in\mathcal{U},y\in\mathcal{Y}} Φ(u,y)\displaystyle\quad\Phi(u,y) (3a)
subject to y=h(u)\displaystyle y=h(u) (3b)

where Φ:p×n\Phi:\mathds{R}^{p}\times\mathds{R}^{n}\rightarrow\mathds{R} is a continuously differentiable cost, and 𝒰={up:Aub}\mathcal{U}=\{u\in\mathds{R}^{p}:Au\leq b\}, 𝒴={yn:Cyd}\mathcal{Y}=\{y\in\mathds{R}^{n}:Cy\leq d\}, where Aq×pA\in\mathds{R}^{q\times p}, bqb\in\mathds{R}^{q}, Cl×nC\in\mathds{R}^{l\times n}, and dld\in\mathds{R}^{l} are constant matrices (Häberle et al., 2020). Online Feedback Optimization (OFO) iteratively updates uu in (1) to make yy converge to a local optimum of (3), even if Φ\Phi is non-convex (Häberle et al., 2020).

2.2.1 Optimization algorithm as a dynamic system

In this work, we use an OFO controller with a constant step size α>0\alpha>0 proposed by Häberle et al. (2020) and successfully deployed in a distribution grid by Ortmann et al. (2023):

uk+1=uk+ασ^α(uk,yk)\displaystyle u^{k+1}=u^{k}+\alpha\widehat{\sigma}_{\alpha}(u^{k},y^{k}) (4)

where yky^{k} is the measured system output at time kΔTk\Delta T with constant sampling time ΔT\Delta T and σ^α(uk,yk)\widehat{\sigma}_{\alpha}(u^{k},y^{k}) is the minimizer of the constrained quadratic optimization problem:

minwpw+G1H(uk)Φ(uk,yk)G2\displaystyle\min_{w\in\mathbb{R}^{p}}\left|\left|w+G^{-1}H^{\top}(u^{k})\nabla\Phi^{\top}(u^{k},y^{k})\right|\right|_{G}^{2} (5a)
subject toA(uk+αw)b\displaystyle\text{subject to}\quad A\left(u^{k}+\alpha w\right)\leq b (5b)
C(yk+αh(uk)w)d\displaystyle\qquad\qquad\quad C\left(y^{k}+\alpha\nabla h(u^{k})w\right)\leq d (5c)

where wpw\in\mathbb{R}^{p} is an auxiliary decision variable of size uu and G𝕊+pG\in\mathbb{S}_{+}^{p} is a positive-definite matrix p×pp\times p. The matrix H(uk)=[𝕀puh(uk)]H(u^{k})^{\top}=\left[\mathbb{I}_{p}\ \nabla_{u}h(u^{k})^{\top}\right], and uh(uk)\nabla_{u}h(u^{k})^{\top} is called input-output sensitivity. We assume that the mapping hh is known, and uh\nabla_{u}h can be computed analytically. More general approaches based on online gradient estimation were proposed by He et al. (2023). The matrix 𝕀p\mathbb{I}_{p} is an identity matrix of size p×pp\times p. The gradient of the objective function Φ(u,y)\nabla\Phi(u,y) is:

Φ(u,y)=[Φu1ΦupΦy1Φyn].\nabla\Phi(u,y)=\begin{bmatrix}\frac{\partial\Phi}{\partial u_{1}}&\ldots&\frac{\partial\Phi}{\partial u_{p}}&\frac{\partial\Phi}{\partial y_{1}}&\ldots&\frac{\partial\Phi}{\partial y_{n}}\end{bmatrix}. (6)

2.3 Online operation and tuning

2.3.1 Physical constraints

For tracking, Φ(u,y):=Φ(y,ysp)\Phi(u,y):=\Phi(y,y_{sp}), and if there are no output constraints, finding minimum in (5a) allows steering the system to a local optimum. We assumed in Section 2 that yy is bounded for any uu, so we can remove (5c) from (5). We also note that uu is a control signal with physical limits, so we can remove (5b) from (5a), shifting the constraints from the optimization to the system. Then the control uappliedk+1u_{\text{applied}}^{k+1} is given by a saturation:

uappliedk+1=max{b2,min{b1,uk+1}}u_{\text{applied}}^{k+1}=\max\{-b_{2},\min\{b_{1},u^{k+1}\}\} (7)

where uk+1u^{k+1} is obtained from (4) as:

σ^α(uk,yk)=G1H(uk)Φ(uk,yk).\hat{\sigma}_{\alpha}(u^{k},y^{k})=-G^{-1}H^{\top}(u^{k})\nabla\Phi^{\top}(u^{k},y^{k}). (8)

The physical constraints on the system transform (5a) into OFO with the steepest descent algorithm in (8) (Hauswirth et al., 2021a).

2.3.2 Tuning

The performance of OFO from (4) depends also on α\alpha and GG related to the optimization problem (5a). Assuming GG is a diagonal matrix, Gil et al. (2023) propose an iterative tuning procedure, by increasing α\alpha and decreasing elements of GG with a fixed sampling time until the system starts to oscillate. Thanks to the transformation from (8), it is sufficient to tune the product ν:=αG1\nu:=\alpha G^{-1}, reducing the number of tuned parameters to one. The value of ν\nu affects how the control input changes from iteration kk to k+1k+1 and corresponds to a step size in line search algorithms (Hauswirth et al., 2021a). Thus, a small ν\nu will lead to slow convergence (Bertsekas, 2016) and a sluggish behaviour as the controller will need multiple iterations to reach the optimum. Conversely, a large ν\nu may destabilize the system (Häberle et al., 2020; Hauswirth et al., 2021b).

3 Compressor control

We design an OFO pressure controller in a compressor with nonlinear dynamics (Cortinovis et al., 2015):

p˙s\displaystyle\dot{p}_{s} =a012Vs(minm)\displaystyle={}\frac{a_{01}^{2}}{V_{s}}(m_{\text{in}}-m) (9a)
p˙d\displaystyle\dot{p}_{d} =a012Vd(mmout)\displaystyle={}\frac{a_{01}^{2}}{V_{d}}(m-m_{\text{out}}) (9b)
m˙\displaystyle\dot{m} =A1Lc(Π(m,ω)pspd)\displaystyle={}\frac{A_{1}}{L_{c}}\left(\Pi\left(m,\omega\right)p_{s}-p_{d}\right) (9c)
ω˙\displaystyle\dot{\omega} =1J(ττc)\displaystyle={}\frac{1}{J}(\tau-\tau_{c}) (9d)

where psp_{s} and pdp_{d} are the suction and discharge suction pressures respectively, a01a_{01}, VsV_{s}, A1A_{1}, LcL_{c}, JJ are constant parameters defining the geometry of the compressor, mm is the mass flow through the compressor, ω\omega is the speed of the shaft of the compressor in rad s-1, τ\tau [Nm] is torque provided by a flow controller, τc\tau_{c} is the reaction torque of the compressor, given as τc=δωm\tau_{c}=\delta\omega m (Gravdahl et al., 2002) with δ=0.00729\delta=0.00729 capturing the internal geometry of the compressor (Cortinovis et al., 2015). The compressor map Π\Pi describes the pressure ratio across a compressor as a quadratic function of compressor mass flow and speed (Milosavljevic et al., 2020). The value of minm_{\text{in}} and moutm_{\text{out}} captures the external mass flows on the suction and discharge side, respectively. The mass flows depend on the pressures psp_{s} and pdp_{d}, and external pressures pinp_{\mathrm{in}} and poutp_{\mathrm{out}}:

min\displaystyle{m}_{\mathrm{in}} =0.4kinAin|pinps|\displaystyle=0.4k_{\mathrm{in}}A_{\mathrm{in}}\sqrt{|p_{\mathrm{in}}-p_{s}|} (10a)
mout\displaystyle{m}_{\mathrm{out}} =0.8koutAout|pdpout|\displaystyle=0.8k_{\mathrm{out}}A_{\mathrm{out}}\sqrt{|p_{d}-p_{\mathrm{out}}|} (10b)

where AinA_{\mathrm{in}}, AoutA_{\mathrm{out}}, kin,koutk_{\mathrm{in}},k_{\mathrm{out}} are constant parameters (Milosavljevic et al., 2020). The initial condition for (9) is ps(0)=1.015p_{s}(0)=1.015 bar, pd(0)=1.868p_{d}(0)=1.868 bar, m(0)=60.45m(0)=60.45 kg s-1, ω(0)=647.2\omega(0)=647.2 rad s-1 and corresponds to a steady-state torque τ(0)=323.6\tau(0)=323.6 Nm. To obtain the steady state mapping from (3b), we use ω=τδm\omega=\frac{\tau}{\delta m} (Gravdahl et al., 2002) in (9c) to get ps=pdΠ(m,τδm)=h(τ,m)p_{s}=\frac{p_{d}}{\Pi\left(m,\frac{\tau}{\delta m}\right)}=h(\tau,m) where mm is measured and pdp_{d} is obtained from (10), taking min=moutm_{\text{in}}=m_{\text{out}} for pin=1.05p_{\text{in}}=1.05 bar and pout=1.55p_{\text{out}}=1.55 bar. To put the compressor control problem in the framework from (3), we set: u=τu=\tau, y=psy=p_{s}. The goal is to follow the desired suction pressure setpoint psdp_{sd} with the objective function (3a) formulated as:

Φ(ps)=0.01(pspsd)2.\Phi(p_{s})=0.01(p_{s}-p_{sd})^{2}. (11)

We assume no constraints on the suction pressure psp_{s}, 𝒴:=\mathcal{Y}:=\mathds{R}. The torque τ\tau is physically constrained by b1=1000b_{1}=1000 Nm, b2=300b_{2}=-300 Nm in (7). The bounds on the torque were chosen to ensure that the suction pressure is bounded for the given external conditions.

4 Impact of OFO parameters

\psfrag{dt =0.5}{\hskip 4.2679pt\scalebox{0.45}{$\Delta T${=0.5}} }\psfrag{dt =0.005}{\hskip 4.2679pt\scalebox{0.45}{$\Delta T${=0.005}} }\psfrag{dt =5.0}{\hskip 4.2679pt\scalebox{0.45}{$\Delta T${=5.0}} }\psfrag{dt =0.05}{\hskip 4.2679pt\scalebox{0.45}{$\Delta T${=0.05}} }\psfrag{dt =50.0}{\hskip 4.2679pt\scalebox{0.45}{$\Delta T${=50.0}} }\psfrag{v =1.0}{\hskip 4.2679pt\scalebox{0.45}{$\nu${=1.0}} }\psfrag{v =10.0}{\hskip 4.2679pt\scalebox{0.45}{$\nu${=10.0}} }\psfrag{v =1000.0}{\hskip 2.84526pt\scalebox{0.45}{$\nu${=1000.0}} }\psfrag{v =0.1}{\hskip 4.2679pt\scalebox{0.45}{$\nu${=0.1}} }\psfrag{v =0.001}{\hskip 4.2679pt\scalebox{0.45}{$\nu${=0.001}} }\psfrag{vp}{\tiny$\nu$}\psfrag{dt}{\tiny$\Delta T$}\psfrag{p_s [bar]}{\tiny$p_{s}$ {[bar]}}\psfrag{Torque [Nm]}{\tiny{ Torque [Nm]}}\psfrag{Time [s]}{\tiny{Time [s]}}\psfrag{0}{\scalebox{0.4}{{0}}}\psfrag{200}{\scalebox{0.4}{{200}}}\psfrag{400}{\scalebox{0.4}{{400}}}\psfrag{800}{\scalebox{0.4}{{800}}}\psfrag{1000}{\scalebox{0.4}{{1000}}}\psfrag{50}{\scalebox{0.4}{{50}}}\psfrag{150}{\scalebox{0.4}{{150}}}\psfrag{250}{\scalebox{0.4}{{250}}}\psfrag{500}{\scalebox{0.4}{{500}}}\psfrag{750}{\scalebox{0.4}{{750}}}\psfrag{0.85}{\scalebox{0.4}{{0.85}}}\psfrag{0.95}{\scalebox{0.4}{{0.95}}}\psfrag{1.00}{\scalebox{0.4}{{1.00}}}\psfrag{0.90}{\scalebox{0.4}{{0.90}}}\psfrag{2}{\scalebox{0.4}{{2}}}\psfrag{4}{\scalebox{0.4}{{4}}}\psfrag{6}{\scalebox{0.4}{{6}}}\psfrag{8}{\scalebox{0.4}{{8}}}\psfrag{10}{\scalebox{0.4}{{10}}}\psfrag{12}{\scalebox{0.4}{{12}}}\psfrag{100}{\scalebox{0.4}{{100}}}\psfrag{25}{\scalebox{0.4}{{25}}}\psfrag{75}{\scalebox{0.4}{{75}}}\psfrag{125}{\scalebox{0.4}{{125}}}\psfrag{20}{\scalebox{0.4}{{20}}}\psfrag{30}{\scalebox{0.4}{{30}}}\psfrag{40}{\scalebox{0.4}{{40}}}\psfrag{60}{\scalebox{0.4}{{60}}}\psfrag{70}{\scalebox{0.4}{{70}}}\psfrag{80}{\scalebox{0.4}{{80}}}\psfrag{Setpoint}{\scalebox{0.5}{{Setpoint}}}\includegraphics[width=433.62pt]{ResponsesTest_delta2.eps}
(a) Impact of ΔT\Delta T with ν=1\nu=1
\psfrag{dt =0.5}{\hskip 4.2679pt\scalebox{0.45}{$\Delta T${=0.5}} }\psfrag{dt =0.005}{\hskip 4.2679pt\scalebox{0.45}{$\Delta T${=0.005}} }\psfrag{dt =5.0}{\hskip 4.2679pt\scalebox{0.45}{$\Delta T${=5.0}} }\psfrag{dt =0.05}{\hskip 4.2679pt\scalebox{0.45}{$\Delta T${=0.05}} }\psfrag{dt =50.0}{\hskip 4.2679pt\scalebox{0.45}{$\Delta T${=50.0}} }\psfrag{v =1.0}{\hskip 4.2679pt\scalebox{0.45}{$\nu${=1.0}} }\psfrag{v =10.0}{\hskip 4.2679pt\scalebox{0.45}{$\nu${=10.0}} }\psfrag{v =1000.0}{\hskip 2.84526pt\scalebox{0.45}{$\nu${=1000.0}} }\psfrag{v =0.1}{\hskip 4.2679pt\scalebox{0.45}{$\nu${=0.1}} }\psfrag{v =0.001}{\hskip 4.2679pt\scalebox{0.45}{$\nu${=0.001}} }\psfrag{vp}{\tiny$\nu$}\psfrag{dt}{\tiny$\Delta T$}\psfrag{p_s [bar]}{\tiny$p_{s}$ {[bar]}}\psfrag{Torque [Nm]}{\tiny{ Torque [Nm]}}\psfrag{Time [s]}{\tiny{Time [s]}}\psfrag{0}{\scalebox{0.4}{{0}}}\psfrag{200}{\scalebox{0.4}{{200}}}\psfrag{400}{\scalebox{0.4}{{400}}}\psfrag{800}{\scalebox{0.4}{{800}}}\psfrag{1000}{\scalebox{0.4}{{1000}}}\psfrag{50}{\scalebox{0.4}{{50}}}\psfrag{150}{\scalebox{0.4}{{150}}}\psfrag{250}{\scalebox{0.4}{{250}}}\psfrag{500}{\scalebox{0.4}{{500}}}\psfrag{750}{\scalebox{0.4}{{750}}}\psfrag{0.85}{\scalebox{0.4}{{0.85}}}\psfrag{0.95}{\scalebox{0.4}{{0.95}}}\psfrag{1.00}{\scalebox{0.4}{{1.00}}}\psfrag{0.90}{\scalebox{0.4}{{0.90}}}\psfrag{2}{\scalebox{0.4}{{2}}}\psfrag{4}{\scalebox{0.4}{{4}}}\psfrag{6}{\scalebox{0.4}{{6}}}\psfrag{8}{\scalebox{0.4}{{8}}}\psfrag{10}{\scalebox{0.4}{{10}}}\psfrag{12}{\scalebox{0.4}{{12}}}\psfrag{100}{\scalebox{0.4}{{100}}}\psfrag{25}{\scalebox{0.4}{{25}}}\psfrag{75}{\scalebox{0.4}{{75}}}\psfrag{125}{\scalebox{0.4}{{125}}}\psfrag{20}{\scalebox{0.4}{{20}}}\psfrag{30}{\scalebox{0.4}{{30}}}\psfrag{40}{\scalebox{0.4}{{40}}}\psfrag{60}{\scalebox{0.4}{{60}}}\psfrag{70}{\scalebox{0.4}{{70}}}\psfrag{80}{\scalebox{0.4}{{80}}}\psfrag{Setpoint}{\scalebox{0.5}{{Setpoint}}}\includegraphics[width=433.62pt]{ControlTest_delta2.eps}
(b) Impact of ΔT\Delta T with ν=1\nu=1 on control
\psfrag{dt =0.5}{\hskip 4.2679pt\scalebox{0.45}{$\Delta T${=0.5}} }\psfrag{dt =0.005}{\hskip 4.2679pt\scalebox{0.45}{$\Delta T${=0.005}} }\psfrag{dt =5.0}{\hskip 4.2679pt\scalebox{0.45}{$\Delta T${=5.0}} }\psfrag{dt =0.05}{\hskip 4.2679pt\scalebox{0.45}{$\Delta T${=0.05}} }\psfrag{dt =50.0}{\hskip 4.2679pt\scalebox{0.45}{$\Delta T${=50.0}} }\psfrag{v =1.0}{\hskip 4.2679pt\scalebox{0.45}{$\nu${=1.0}} }\psfrag{v =10.0}{\hskip 4.2679pt\scalebox{0.45}{$\nu${=10.0}} }\psfrag{v =1000.0}{\hskip 2.84526pt\scalebox{0.45}{$\nu${=1000.0}} }\psfrag{v =0.1}{\hskip 4.2679pt\scalebox{0.45}{$\nu${=0.1}} }\psfrag{v =0.001}{\hskip 4.2679pt\scalebox{0.45}{$\nu${=0.001}} }\psfrag{vp}{\tiny$\nu$}\psfrag{dt}{\tiny$\Delta T$}\psfrag{p_s [bar]}{\tiny$p_{s}$ {[bar]}}\psfrag{Torque [Nm]}{\tiny{ Torque [Nm]}}\psfrag{Time [s]}{\tiny{Time [s]}}\psfrag{0}{\scalebox{0.4}{{0}}}\psfrag{200}{\scalebox{0.4}{{200}}}\psfrag{400}{\scalebox{0.4}{{400}}}\psfrag{800}{\scalebox{0.4}{{800}}}\psfrag{1000}{\scalebox{0.4}{{1000}}}\psfrag{50}{\scalebox{0.4}{{50}}}\psfrag{150}{\scalebox{0.4}{{150}}}\psfrag{250}{\scalebox{0.4}{{250}}}\psfrag{500}{\scalebox{0.4}{{500}}}\psfrag{750}{\scalebox{0.4}{{750}}}\psfrag{0.85}{\scalebox{0.4}{{0.85}}}\psfrag{0.95}{\scalebox{0.4}{{0.95}}}\psfrag{1.00}{\scalebox{0.4}{{1.00}}}\psfrag{0.90}{\scalebox{0.4}{{0.90}}}\psfrag{2}{\scalebox{0.4}{{2}}}\psfrag{4}{\scalebox{0.4}{{4}}}\psfrag{6}{\scalebox{0.4}{{6}}}\psfrag{8}{\scalebox{0.4}{{8}}}\psfrag{10}{\scalebox{0.4}{{10}}}\psfrag{12}{\scalebox{0.4}{{12}}}\psfrag{100}{\scalebox{0.4}{{100}}}\psfrag{25}{\scalebox{0.4}{{25}}}\psfrag{75}{\scalebox{0.4}{{75}}}\psfrag{125}{\scalebox{0.4}{{125}}}\psfrag{20}{\scalebox{0.4}{{20}}}\psfrag{30}{\scalebox{0.4}{{30}}}\psfrag{40}{\scalebox{0.4}{{40}}}\psfrag{60}{\scalebox{0.4}{{60}}}\psfrag{70}{\scalebox{0.4}{{70}}}\psfrag{80}{\scalebox{0.4}{{80}}}\psfrag{Setpoint}{\scalebox{0.5}{{Setpoint}}}\includegraphics[width=433.62pt]{ContourError_inset3.eps}
(c) Error ϵ\epsilon
\psfrag{dt =0.5}{\hskip 4.2679pt\scalebox{0.45}{$\Delta T${=0.5}} }\psfrag{dt =0.005}{\hskip 4.2679pt\scalebox{0.45}{$\Delta T${=0.005}} }\psfrag{dt =5.0}{\hskip 4.2679pt\scalebox{0.45}{$\Delta T${=5.0}} }\psfrag{dt =0.05}{\hskip 4.2679pt\scalebox{0.45}{$\Delta T${=0.05}} }\psfrag{dt =50.0}{\hskip 4.2679pt\scalebox{0.45}{$\Delta T${=50.0}} }\psfrag{v =1.0}{\hskip 4.2679pt\scalebox{0.45}{$\nu${=1.0}} }\psfrag{v =10.0}{\hskip 4.2679pt\scalebox{0.45}{$\nu${=10.0}} }\psfrag{v =1000.0}{\hskip 2.84526pt\scalebox{0.45}{$\nu${=1000.0}} }\psfrag{v =0.1}{\hskip 4.2679pt\scalebox{0.45}{$\nu${=0.1}} }\psfrag{v =0.001}{\hskip 4.2679pt\scalebox{0.45}{$\nu${=0.001}} }\psfrag{vp}{\tiny$\nu$}\psfrag{dt}{\tiny$\Delta T$}\psfrag{p_s [bar]}{\tiny$p_{s}$ {[bar]}}\psfrag{Torque [Nm]}{\tiny{ Torque [Nm]}}\psfrag{Time [s]}{\tiny{Time [s]}}\psfrag{0}{\scalebox{0.4}{{0}}}\psfrag{200}{\scalebox{0.4}{{200}}}\psfrag{400}{\scalebox{0.4}{{400}}}\psfrag{800}{\scalebox{0.4}{{800}}}\psfrag{1000}{\scalebox{0.4}{{1000}}}\psfrag{50}{\scalebox{0.4}{{50}}}\psfrag{150}{\scalebox{0.4}{{150}}}\psfrag{250}{\scalebox{0.4}{{250}}}\psfrag{500}{\scalebox{0.4}{{500}}}\psfrag{750}{\scalebox{0.4}{{750}}}\psfrag{0.85}{\scalebox{0.4}{{0.85}}}\psfrag{0.95}{\scalebox{0.4}{{0.95}}}\psfrag{1.00}{\scalebox{0.4}{{1.00}}}\psfrag{0.90}{\scalebox{0.4}{{0.90}}}\psfrag{2}{\scalebox{0.4}{{2}}}\psfrag{4}{\scalebox{0.4}{{4}}}\psfrag{6}{\scalebox{0.4}{{6}}}\psfrag{8}{\scalebox{0.4}{{8}}}\psfrag{10}{\scalebox{0.4}{{10}}}\psfrag{12}{\scalebox{0.4}{{12}}}\psfrag{100}{\scalebox{0.4}{{100}}}\psfrag{25}{\scalebox{0.4}{{25}}}\psfrag{75}{\scalebox{0.4}{{75}}}\psfrag{125}{\scalebox{0.4}{{125}}}\psfrag{20}{\scalebox{0.4}{{20}}}\psfrag{30}{\scalebox{0.4}{{30}}}\psfrag{40}{\scalebox{0.4}{{40}}}\psfrag{60}{\scalebox{0.4}{{60}}}\psfrag{70}{\scalebox{0.4}{{70}}}\psfrag{80}{\scalebox{0.4}{{80}}}\psfrag{Setpoint}{\scalebox{0.5}{{Setpoint}}}\includegraphics[width=433.62pt]{ResponsesTest_nu2.eps}
(d) Impact of ν\nu with ΔT=0.05\Delta T=0.05
\psfrag{dt =0.5}{\hskip 4.2679pt\scalebox{0.45}{$\Delta T${=0.5}} }\psfrag{dt =0.005}{\hskip 4.2679pt\scalebox{0.45}{$\Delta T${=0.005}} }\psfrag{dt =5.0}{\hskip 4.2679pt\scalebox{0.45}{$\Delta T${=5.0}} }\psfrag{dt =0.05}{\hskip 4.2679pt\scalebox{0.45}{$\Delta T${=0.05}} }\psfrag{dt =50.0}{\hskip 4.2679pt\scalebox{0.45}{$\Delta T${=50.0}} }\psfrag{v =1.0}{\hskip 4.2679pt\scalebox{0.45}{$\nu${=1.0}} }\psfrag{v =10.0}{\hskip 4.2679pt\scalebox{0.45}{$\nu${=10.0}} }\psfrag{v =1000.0}{\hskip 2.84526pt\scalebox{0.45}{$\nu${=1000.0}} }\psfrag{v =0.1}{\hskip 4.2679pt\scalebox{0.45}{$\nu${=0.1}} }\psfrag{v =0.001}{\hskip 4.2679pt\scalebox{0.45}{$\nu${=0.001}} }\psfrag{vp}{\tiny$\nu$}\psfrag{dt}{\tiny$\Delta T$}\psfrag{p_s [bar]}{\tiny$p_{s}$ {[bar]}}\psfrag{Torque [Nm]}{\tiny{ Torque [Nm]}}\psfrag{Time [s]}{\tiny{Time [s]}}\psfrag{0}{\scalebox{0.4}{{0}}}\psfrag{200}{\scalebox{0.4}{{200}}}\psfrag{400}{\scalebox{0.4}{{400}}}\psfrag{800}{\scalebox{0.4}{{800}}}\psfrag{1000}{\scalebox{0.4}{{1000}}}\psfrag{50}{\scalebox{0.4}{{50}}}\psfrag{150}{\scalebox{0.4}{{150}}}\psfrag{250}{\scalebox{0.4}{{250}}}\psfrag{500}{\scalebox{0.4}{{500}}}\psfrag{750}{\scalebox{0.4}{{750}}}\psfrag{0.85}{\scalebox{0.4}{{0.85}}}\psfrag{0.95}{\scalebox{0.4}{{0.95}}}\psfrag{1.00}{\scalebox{0.4}{{1.00}}}\psfrag{0.90}{\scalebox{0.4}{{0.90}}}\psfrag{2}{\scalebox{0.4}{{2}}}\psfrag{4}{\scalebox{0.4}{{4}}}\psfrag{6}{\scalebox{0.4}{{6}}}\psfrag{8}{\scalebox{0.4}{{8}}}\psfrag{10}{\scalebox{0.4}{{10}}}\psfrag{12}{\scalebox{0.4}{{12}}}\psfrag{100}{\scalebox{0.4}{{100}}}\psfrag{25}{\scalebox{0.4}{{25}}}\psfrag{75}{\scalebox{0.4}{{75}}}\psfrag{125}{\scalebox{0.4}{{125}}}\psfrag{20}{\scalebox{0.4}{{20}}}\psfrag{30}{\scalebox{0.4}{{30}}}\psfrag{40}{\scalebox{0.4}{{40}}}\psfrag{60}{\scalebox{0.4}{{60}}}\psfrag{70}{\scalebox{0.4}{{70}}}\psfrag{80}{\scalebox{0.4}{{80}}}\psfrag{Setpoint}{\scalebox{0.5}{{Setpoint}}}\includegraphics[width=433.62pt]{ControlTest_nu2.eps}
(e) Impact of ν\nu with ΔT=0.05\Delta T=0.05 on control
\psfrag{dt =0.5}{\hskip 4.2679pt\scalebox{0.45}{$\Delta T${=0.5}} }\psfrag{dt =0.005}{\hskip 4.2679pt\scalebox{0.45}{$\Delta T${=0.005}} }\psfrag{dt =5.0}{\hskip 4.2679pt\scalebox{0.45}{$\Delta T${=5.0}} }\psfrag{dt =0.05}{\hskip 4.2679pt\scalebox{0.45}{$\Delta T${=0.05}} }\psfrag{dt =50.0}{\hskip 4.2679pt\scalebox{0.45}{$\Delta T${=50.0}} }\psfrag{v =1.0}{\hskip 4.2679pt\scalebox{0.45}{$\nu${=1.0}} }\psfrag{v =10.0}{\hskip 4.2679pt\scalebox{0.45}{$\nu${=10.0}} }\psfrag{v =1000.0}{\hskip 2.84526pt\scalebox{0.45}{$\nu${=1000.0}} }\psfrag{v =0.1}{\hskip 4.2679pt\scalebox{0.45}{$\nu${=0.1}} }\psfrag{v =0.001}{\hskip 4.2679pt\scalebox{0.45}{$\nu${=0.001}} }\psfrag{vp}{\tiny$\nu$}\psfrag{dt}{\tiny$\Delta T$}\psfrag{p_s [bar]}{\tiny$p_{s}$ {[bar]}}\psfrag{Torque [Nm]}{\tiny{ Torque [Nm]}}\psfrag{Time [s]}{\tiny{Time [s]}}\psfrag{0}{\scalebox{0.4}{{0}}}\psfrag{200}{\scalebox{0.4}{{200}}}\psfrag{400}{\scalebox{0.4}{{400}}}\psfrag{800}{\scalebox{0.4}{{800}}}\psfrag{1000}{\scalebox{0.4}{{1000}}}\psfrag{50}{\scalebox{0.4}{{50}}}\psfrag{150}{\scalebox{0.4}{{150}}}\psfrag{250}{\scalebox{0.4}{{250}}}\psfrag{500}{\scalebox{0.4}{{500}}}\psfrag{750}{\scalebox{0.4}{{750}}}\psfrag{0.85}{\scalebox{0.4}{{0.85}}}\psfrag{0.95}{\scalebox{0.4}{{0.95}}}\psfrag{1.00}{\scalebox{0.4}{{1.00}}}\psfrag{0.90}{\scalebox{0.4}{{0.90}}}\psfrag{2}{\scalebox{0.4}{{2}}}\psfrag{4}{\scalebox{0.4}{{4}}}\psfrag{6}{\scalebox{0.4}{{6}}}\psfrag{8}{\scalebox{0.4}{{8}}}\psfrag{10}{\scalebox{0.4}{{10}}}\psfrag{12}{\scalebox{0.4}{{12}}}\psfrag{100}{\scalebox{0.4}{{100}}}\psfrag{25}{\scalebox{0.4}{{25}}}\psfrag{75}{\scalebox{0.4}{{75}}}\psfrag{125}{\scalebox{0.4}{{125}}}\psfrag{20}{\scalebox{0.4}{{20}}}\psfrag{30}{\scalebox{0.4}{{30}}}\psfrag{40}{\scalebox{0.4}{{40}}}\psfrag{60}{\scalebox{0.4}{{60}}}\psfrag{70}{\scalebox{0.4}{{70}}}\psfrag{80}{\scalebox{0.4}{{80}}}\psfrag{Setpoint}{\scalebox{0.5}{{Setpoint}}}\includegraphics[width=433.62pt]{ContourOscillations_inset3.eps}
(f) Oscillations |F||F|
Figure 1: Impact of parameters ν\nu and ΔT\Delta T (in s) on the performance of OFO with the objective (11) and the corresponding control inputs, and a trade-off between the error and the number of oscillations as functions of parameters

We analyse the impact of ν\nu and ΔT\Delta T using (6) on integrated squared error over a tuning horizon tFt_{F}:

ϵ(ν,ΔT):=γ10tF(ps(ξ)psd(ξ))2dξ\epsilon(\nu,\Delta T):=\gamma_{1}\int\limits_{0}^{t_{F}}\left(p_{s}(\xi)-p_{sd}(\xi)\right)^{2}\mathrm{d}\xi (12)

scaled by γ1=108\gamma_{1}=10^{-8}, and on number of oscillations |F(ν,ΔT)||F(\nu,\Delta T)|, based on counting zero crossings (Thornhill et al., 2003): F(ν,ΔT):={tk[0,tF]:ps(tk)=psd(tk)}F(\nu,\Delta T):=\{t_{k}\in[0,t_{F}]:p_{s}(t_{k})=p_{sd}(t_{k})\}.

4.1 Impact on performance

To show the relationship between ν\nu and ΔT\Delta T, we analyse the contour plots of the error and the number of oscillations obtained for the constant pressure setpoint, with no setpoint for the torque as functions of the parameters (right column of Fig. 1). The white line indicates where the error and the number of oscillations are equal. We also get that the smallest error is obtained for ν=250\nu=250 and ΔT0.005\Delta T\leq 0.005 (bottom right corner in Fig. 1(c)) which corresponds to the largest number of oscillations (bottom right corner in Fig. 1(f)). Conversely, a small ν\nu and a large ΔT\Delta T give no oscillations (top left corner in Fig. 1(f)), but increase the error (top left corner in Fig. 1(c)). The values annotating the intersection line indicate that similar performance can be obtained for ν[75,175]\nu\in[75,175] and ΔT[3,9]\Delta T\in[3,9] s, with both error and oscillations approximately 7.2, which suggests that the parameters should be tuned simultaneously.

4.2 Impact on system

Figure 1 shows the impact of parameters ΔT\Delta T (Fig. 1(a)) and ν\nu (Fig. 1(d)) on the performance of the OFO controller for a constant setpoint. The oscillatory trajectories in Fig. 1 show the numerical connection between ν\nu and the derivatives in (8). From (8), we see that:

uk+1uk=νH(uk)Φ(uk,yk).u^{k+1}-u^{k}=-\nu H^{\top}(u^{k})\nabla\Phi^{\top}(u^{k},y^{k}). (13)

The parameter ν=1\nu=1 in Fig. 1(a), so the controller reaches steady state when the optimum is reached and H(uk)Φ(uk,yk)H^{\top}(u^{k})\nabla\Phi^{\top}(u^{k},y^{k}) becomes close to zero (vanishing oscillations for ΔT0.05\Delta T\leq 0.05 in Fig. 1(a)). If ν<1\nu<1, the derivatives are mitigated, νHΦHΦ\nu\|H^{\top}\nabla\Phi^{\top}\|\leq\|H^{\top}\nabla\Phi^{\top}\|, and the controller increments in (13) are small, leading to sluggish behaviour (ν0.1\nu\leq 0.1 in Fig. 1(d)). Conversely, ν>1\nu>1 intensifies the effect of the derivatives, νHΦHΦ\nu\|H^{\top}\nabla\Phi^{\top}\|\geq\|H^{\top}\nabla\Phi^{\top}\|, leading to oscillatory behaviour (ν10\nu\geq 10 in Fig. 1(d)), in line with the interpretation as a step size in line search algorithms (Bertsekas, 2016, p.31).

5 Tuning and validation

5.1 Optimization problem

To tune OFO, we solve the optimization problem:

maxν,ΔT\displaystyle\underset{\nu,\Delta T}{\text{max}} ΔT\displaystyle{}\quad\Delta T (14a)
subject to: ϵ(ν,ΔT)β1\displaystyle\quad\epsilon(\nu,\Delta T)\leq\beta_{1} (14b)
|F(ν,ΔT)|β2.\displaystyle\quad|F(\nu,\Delta T)|\leq\beta_{2}. (14c)

The objective (14a) promotes a large sampling time so that the underlying dynamics reaches the steady state within ΔT\Delta T. The constraint (14b) reinforces the reference tracking in OFO from (11) by restricting the time horizon to tFt_{F}. The constraint (14c) enforces desired properties of the controller without affecting reference tracking. Both constraints are adjusted by choosing β=[β1,β2]\beta=[\beta_{1},\beta_{2}], as suggested by Fig. 1 (right-most column), with β1\beta_{1} as a threshold for the error and β2\beta_{2} for the number of oscillations. To solve (14), we use a constant setpoint psdconst=0.925p_{sd}^{\text{const}}=0.925 bar and two trajectories: a truncated sinusoidal signal:

psdsine(t)=max{0.94,0.95+0.05sin(0.04t)}p^{\text{sine}}_{sd}(t)=\max\{0.94,0.95+0.05\sin(0.04t)\} (15)

and a step signal

psdstep(t)={0.93 bar if t[75,125] s 0.98 bar if t[0,75)(125,150] s. 0.95 bar if t(150,tF] s p^{\text{step}}_{sd}(t)=\begin{cases}0.93\text{ bar if }t\in[75,125]\text{ s }\\ 0.98\text{ bar if }t\in[0,75)\cup(125,150]\text{ s. }\\ 0.95\text{ bar if }t\in(150,t_{F}]\text{ s }\end{cases} (16)

The tuned values from solving (14) were compared with a default OFO controller, with ΔT=47.5\Delta T=47.5 s ensuring timescale separation and corresponding to the settling time of the compressor from (9) (within 5% of the final value (Bagge Carlson et al., 2021)) linearized around the operating points for τ=323.6\tau=323.6 Nm.

The system (9) with the controller (7) was simulated using OrdinaryDiffEq.jl (Rackauckas and Nie, 2017). The derivatives h\nabla h and Φ\nabla\Phi for solving (5a) were obtained using Zygote v0.6.66 (Innes, 2018). The optimization problem was implemented in an open source programming language, Julia 1.9.0, with Windows (x86_64-w64-mingw32) CPU: 8 × 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz. The unconstrained optimization problem (5a) was solved using OSQP v0.8.0 (Stellato et al., 2020). To overcome potential non-differentiability (Bachtiar et al., 2016) when solving (14) with respect to the sampling time, we use a derivative-free solver, with a Julia interface NOMAD.jl (Montoison et al., 2020) to NOMAD 4.3.1 (Audet et al., 2022). The parameter ν[0,103]\nu\in[0,10^{3}] is bounded for scaling purposes, and ΔT[5×103,tF/2]\Delta T\in[5\times 10^{-3},t_{F}/2] reflects the physical setup of the compressor defining the smallest and the largest sampling time available. An analysis of the impact of number of iterations tf/ΔTt_{f}/\Delta T on the performance of OFO was done by He et al. (2023). We chose tF=200t_{F}=200 s to reflect typical operating times of centrifugal compressors (Cortinovis et al., 2015).

Table 1: Tuned values for the three setpoints, with parameters in bold chosen for validation. The error ϵ\epsilon is reported as absolute value and improvement from to the manual tuning
Constant setpoint Step setpoint Sinusoidal setpoint
β\beta ν\nu ΔT\Delta T [s] ϵ\epsilon |F||F| ν\nu ΔT\Delta T [s] ϵ\epsilon |F||F| ν\nu ΔT\Delta T [s] ϵ\epsilon |F||F|
Initial 0.1 50 163.4 (-297%) 0 0.1 50 85.47 (-85%) 0 0.1 50 60.06 (-99%) 0
150, 50 40 99 136.03 (-231%) 0 0 99 86.29 (-87%) 0 0 99 60.75 (-101%) 0
37.5, 50 196.1 45.89 37.5 (9%) 0 183.1 74.95 37.3 (19%) 2 85.1 99 37.26 (-23%) 0
18.75, 25 202.1 22.88 18.7 (55%) 1 200.1 22.79 18.75 (59%) 4 199.1 80 18.69 (38%) 0 S3
9, 12 223.1 10.9 8.96 (78%) 9 207.1 12.88 8.97 (81%) 9 229.1 10.37 9 (70%) 5 S2
6, 20 468.1 5.78 6 (85%) 18 237.1 7.63 5.96 (87%) 12 278.1 7.52 6 (80%) 9 S1
Manual 150 47.5 41.13 (-) 0 300 47.5 46.76 (-) 2 175 47.5 30.21 (-) 2 SM
\psfrag{p_s [bar]}{\tiny$p_{s}$ {[bar]}}\psfrag{Torque [Nm]}{\tiny{ Torque [Nm]}}\psfrag{Time [s]}{\tiny{Time [s]}}\psfrag{p_s [bar]}{\tiny$p_{s}$ {[bar]}}\psfrag{b =[18.75, 25.0]}{\scalebox{0.45}{$\beta${=[18.75, 25.0]}} }\psfrag{b =[150.0, 50.0]}{\scalebox{0.45}{$\beta${=[150.0, 50.0]}} }\psfrag{b =[9.0, 12.0]}{\scalebox{0.45}{$\beta${=[9.0, 12.0]}} }\psfrag{b =[37.5, 50.0]}{\scalebox{0.45}{$\beta${=[37.5, 50.0]}} }\psfrag{b =[6.0, 20.0]}{\scalebox{0.45}{$\beta${=[6.0, 20.0]}} }\psfrag{Setpoint}{\scalebox{0.5}{{Setpoint}}}\psfrag{Initial guess}{\scalebox{0.5}{{Initial guess}}}\psfrag{Manual}{\scalebox{0.5}{{Manual}}}\psfrag{0}{\scalebox{0.4}{{0}}}\psfrag{200}{\scalebox{0.4}{{200}}}\psfrag{400}{\scalebox{0.4}{{400}}}\psfrag{800}{\scalebox{0.4}{{800}}}\psfrag{1000}{\scalebox{0.4}{{1000}}}\psfrag{50}{\scalebox{0.4}{{50}}}\psfrag{150}{\scalebox{0.4}{{150}}}\psfrag{250}{\scalebox{0.4}{{250}}}\psfrag{500}{\scalebox{0.4}{{500}}}\psfrag{750}{\scalebox{0.4}{{750}}}\psfrag{0.85}{\scalebox{0.4}{{0.85}}}\psfrag{0.95}{\scalebox{0.4}{{0.95}}}\psfrag{1.00}{\scalebox{0.4}{{1.00}}}\psfrag{0.90}{\scalebox{0.4}{{0.90}}}\psfrag{100}{\scalebox{0.4}{{100}}}\includegraphics[width=433.62pt]{TunedConstBetaResponse5.eps}
(a) Constant setpoint
\psfrag{p_s [bar]}{\tiny$p_{s}$ {[bar]}}\psfrag{Torque [Nm]}{\tiny{ Torque [Nm]}}\psfrag{Time [s]}{\tiny{Time [s]}}\psfrag{p_s [bar]}{\tiny$p_{s}$ {[bar]}}\psfrag{b =[18.75, 25.0]}{\scalebox{0.45}{$\beta${=[18.75, 25.0]}} }\psfrag{b =[150.0, 50.0]}{\scalebox{0.45}{$\beta${=[150.0, 50.0]}} }\psfrag{b =[9.0, 12.0]}{\scalebox{0.45}{$\beta${=[9.0, 12.0]}} }\psfrag{b =[37.5, 50.0]}{\scalebox{0.45}{$\beta${=[37.5, 50.0]}} }\psfrag{b =[6.0, 20.0]}{\scalebox{0.45}{$\beta${=[6.0, 20.0]}} }\psfrag{Setpoint}{\scalebox{0.5}{{Setpoint}}}\psfrag{Initial guess}{\scalebox{0.5}{{Initial guess}}}\psfrag{Manual}{\scalebox{0.5}{{Manual}}}\psfrag{0}{\scalebox{0.4}{{0}}}\psfrag{200}{\scalebox{0.4}{{200}}}\psfrag{400}{\scalebox{0.4}{{400}}}\psfrag{800}{\scalebox{0.4}{{800}}}\psfrag{1000}{\scalebox{0.4}{{1000}}}\psfrag{50}{\scalebox{0.4}{{50}}}\psfrag{150}{\scalebox{0.4}{{150}}}\psfrag{250}{\scalebox{0.4}{{250}}}\psfrag{500}{\scalebox{0.4}{{500}}}\psfrag{750}{\scalebox{0.4}{{750}}}\psfrag{0.85}{\scalebox{0.4}{{0.85}}}\psfrag{0.95}{\scalebox{0.4}{{0.95}}}\psfrag{1.00}{\scalebox{0.4}{{1.00}}}\psfrag{0.90}{\scalebox{0.4}{{0.90}}}\psfrag{100}{\scalebox{0.4}{{100}}}\includegraphics[width=433.62pt]{TunedStepBetaResponse5.eps}
(b) Step setpoint
\psfrag{p_s [bar]}{\tiny$p_{s}$ {[bar]}}\psfrag{Torque [Nm]}{\tiny{ Torque [Nm]}}\psfrag{Time [s]}{\tiny{Time [s]}}\psfrag{p_s [bar]}{\tiny$p_{s}$ {[bar]}}\psfrag{b =[18.75, 25.0]}{\scalebox{0.45}{$\beta${=[18.75, 25.0]}} }\psfrag{b =[150.0, 50.0]}{\scalebox{0.45}{$\beta${=[150.0, 50.0]}} }\psfrag{b =[9.0, 12.0]}{\scalebox{0.45}{$\beta${=[9.0, 12.0]}} }\psfrag{b =[37.5, 50.0]}{\scalebox{0.45}{$\beta${=[37.5, 50.0]}} }\psfrag{b =[6.0, 20.0]}{\scalebox{0.45}{$\beta${=[6.0, 20.0]}} }\psfrag{Setpoint}{\scalebox{0.5}{{Setpoint}}}\psfrag{Initial guess}{\scalebox{0.5}{{Initial guess}}}\psfrag{Manual}{\scalebox{0.5}{{Manual}}}\psfrag{0}{\scalebox{0.4}{{0}}}\psfrag{200}{\scalebox{0.4}{{200}}}\psfrag{400}{\scalebox{0.4}{{400}}}\psfrag{800}{\scalebox{0.4}{{800}}}\psfrag{1000}{\scalebox{0.4}{{1000}}}\psfrag{50}{\scalebox{0.4}{{50}}}\psfrag{150}{\scalebox{0.4}{{150}}}\psfrag{250}{\scalebox{0.4}{{250}}}\psfrag{500}{\scalebox{0.4}{{500}}}\psfrag{750}{\scalebox{0.4}{{750}}}\psfrag{0.85}{\scalebox{0.4}{{0.85}}}\psfrag{0.95}{\scalebox{0.4}{{0.95}}}\psfrag{1.00}{\scalebox{0.4}{{1.00}}}\psfrag{0.90}{\scalebox{0.4}{{0.90}}}\psfrag{100}{\scalebox{0.4}{{100}}}\includegraphics[width=433.62pt]{TunedSineBetaResponse5.eps}
(c) Sinusoidal setpoint
\psfrag{p_s [bar]}{\tiny$p_{s}$ {[bar]}}\psfrag{Torque [Nm]}{\tiny{ Torque [Nm]}}\psfrag{Time [s]}{\tiny{Time [s]}}\psfrag{p_s [bar]}{\tiny$p_{s}$ {[bar]}}\psfrag{b =[18.75, 25.0]}{\scalebox{0.45}{$\beta${=[18.75, 25.0]}} }\psfrag{b =[150.0, 50.0]}{\scalebox{0.45}{$\beta${=[150.0, 50.0]}} }\psfrag{b =[9.0, 12.0]}{\scalebox{0.45}{$\beta${=[9.0, 12.0]}} }\psfrag{b =[37.5, 50.0]}{\scalebox{0.45}{$\beta${=[37.5, 50.0]}} }\psfrag{b =[6.0, 20.0]}{\scalebox{0.45}{$\beta${=[6.0, 20.0]}} }\psfrag{Setpoint}{\scalebox{0.5}{{Setpoint}}}\psfrag{Initial guess}{\scalebox{0.5}{{Initial guess}}}\psfrag{Manual}{\scalebox{0.5}{{Manual}}}\psfrag{0}{\scalebox{0.4}{{0}}}\psfrag{200}{\scalebox{0.4}{{200}}}\psfrag{400}{\scalebox{0.4}{{400}}}\psfrag{800}{\scalebox{0.4}{{800}}}\psfrag{1000}{\scalebox{0.4}{{1000}}}\psfrag{50}{\scalebox{0.4}{{50}}}\psfrag{150}{\scalebox{0.4}{{150}}}\psfrag{250}{\scalebox{0.4}{{250}}}\psfrag{500}{\scalebox{0.4}{{500}}}\psfrag{750}{\scalebox{0.4}{{750}}}\psfrag{0.85}{\scalebox{0.4}{{0.85}}}\psfrag{0.95}{\scalebox{0.4}{{0.95}}}\psfrag{1.00}{\scalebox{0.4}{{1.00}}}\psfrag{0.90}{\scalebox{0.4}{{0.90}}}\psfrag{100}{\scalebox{0.4}{{100}}}\includegraphics[width=433.62pt]{TunedConstBetaControl3.eps}
(d) Control inputs for constant setpoint
\psfrag{p_s [bar]}{\tiny$p_{s}$ {[bar]}}\psfrag{Torque [Nm]}{\tiny{ Torque [Nm]}}\psfrag{Time [s]}{\tiny{Time [s]}}\psfrag{p_s [bar]}{\tiny$p_{s}$ {[bar]}}\psfrag{b =[18.75, 25.0]}{\scalebox{0.45}{$\beta${=[18.75, 25.0]}} }\psfrag{b =[150.0, 50.0]}{\scalebox{0.45}{$\beta${=[150.0, 50.0]}} }\psfrag{b =[9.0, 12.0]}{\scalebox{0.45}{$\beta${=[9.0, 12.0]}} }\psfrag{b =[37.5, 50.0]}{\scalebox{0.45}{$\beta${=[37.5, 50.0]}} }\psfrag{b =[6.0, 20.0]}{\scalebox{0.45}{$\beta${=[6.0, 20.0]}} }\psfrag{Setpoint}{\scalebox{0.5}{{Setpoint}}}\psfrag{Initial guess}{\scalebox{0.5}{{Initial guess}}}\psfrag{Manual}{\scalebox{0.5}{{Manual}}}\psfrag{0}{\scalebox{0.4}{{0}}}\psfrag{200}{\scalebox{0.4}{{200}}}\psfrag{400}{\scalebox{0.4}{{400}}}\psfrag{800}{\scalebox{0.4}{{800}}}\psfrag{1000}{\scalebox{0.4}{{1000}}}\psfrag{50}{\scalebox{0.4}{{50}}}\psfrag{150}{\scalebox{0.4}{{150}}}\psfrag{250}{\scalebox{0.4}{{250}}}\psfrag{500}{\scalebox{0.4}{{500}}}\psfrag{750}{\scalebox{0.4}{{750}}}\psfrag{0.85}{\scalebox{0.4}{{0.85}}}\psfrag{0.95}{\scalebox{0.4}{{0.95}}}\psfrag{1.00}{\scalebox{0.4}{{1.00}}}\psfrag{0.90}{\scalebox{0.4}{{0.90}}}\psfrag{100}{\scalebox{0.4}{{100}}}\includegraphics[width=433.62pt]{TunedStepBetaControl3.eps}
(e) Control inputs for step setpoint
\psfrag{p_s [bar]}{\tiny$p_{s}$ {[bar]}}\psfrag{Torque [Nm]}{\tiny{ Torque [Nm]}}\psfrag{Time [s]}{\tiny{Time [s]}}\psfrag{p_s [bar]}{\tiny$p_{s}$ {[bar]}}\psfrag{b =[18.75, 25.0]}{\scalebox{0.45}{$\beta${=[18.75, 25.0]}} }\psfrag{b =[150.0, 50.0]}{\scalebox{0.45}{$\beta${=[150.0, 50.0]}} }\psfrag{b =[9.0, 12.0]}{\scalebox{0.45}{$\beta${=[9.0, 12.0]}} }\psfrag{b =[37.5, 50.0]}{\scalebox{0.45}{$\beta${=[37.5, 50.0]}} }\psfrag{b =[6.0, 20.0]}{\scalebox{0.45}{$\beta${=[6.0, 20.0]}} }\psfrag{Setpoint}{\scalebox{0.5}{{Setpoint}}}\psfrag{Initial guess}{\scalebox{0.5}{{Initial guess}}}\psfrag{Manual}{\scalebox{0.5}{{Manual}}}\psfrag{0}{\scalebox{0.4}{{0}}}\psfrag{200}{\scalebox{0.4}{{200}}}\psfrag{400}{\scalebox{0.4}{{400}}}\psfrag{800}{\scalebox{0.4}{{800}}}\psfrag{1000}{\scalebox{0.4}{{1000}}}\psfrag{50}{\scalebox{0.4}{{50}}}\psfrag{150}{\scalebox{0.4}{{150}}}\psfrag{250}{\scalebox{0.4}{{250}}}\psfrag{500}{\scalebox{0.4}{{500}}}\psfrag{750}{\scalebox{0.4}{{750}}}\psfrag{0.85}{\scalebox{0.4}{{0.85}}}\psfrag{0.95}{\scalebox{0.4}{{0.95}}}\psfrag{1.00}{\scalebox{0.4}{{1.00}}}\psfrag{0.90}{\scalebox{0.4}{{0.90}}}\psfrag{100}{\scalebox{0.4}{{100}}}\includegraphics[width=433.62pt]{TunedSineBetaControl3.eps}
(f) Control inputs for sinusoidal setpoint
Figure 2: Results of tuning for different setpoints

5.2 Results for tuning

The results of tuning OFO for the compressor (9) are shown in Fig. 2 with the initial guess for parameters ΔT=50\Delta T=50, ν=0.1\nu=0.1 in red, the setpoint in dashed black (top row), and the bounds for the torque in black (bottom row). The initial guess for ν\nu and ΔT\Delta T was chosen following the recommendation from Gil et al. (2023), as indicated in Table 1. The values corresponding to the default OFO controller are in solid black lines. To achieve the desired performance, the values of β\beta in (14) were applied in decreasing order, starting from β=[150,50]\beta=[150,50], as suggested by Fig. 1. Figure 2 shows that for β1=150\beta_{1}=150 and β2=50\beta_{2}=50, the constraints on the error and the number of oscillations have little impact on shaping the response (ΔT=99\Delta T=99 in Table 1), and lead to a sluggish controller (β2=150\beta_{2}=150 in Fig. 2(d)). Putting higher priority on the oscillations with β225\beta_{2}\leq 25, and decreasing β1\beta_{1} from 37.5 to nine allows achieving better tracking with damped oscillations, at the expense of decreased sampling time (ΔT12\Delta T\leq 12 in Table 1). The oscillatory behaviour of the control signal in Fig. 2(d) confirms the importance of preserving the bounds on control signal in (7). Restricting the number of oscillations, β2=12\beta_{2}=12, yield a less aggressive response (Fig. 2(d)), at the expense of increased error.

\psfrag{p_s [bar]}{\tiny$p_{s}$ {[bar]}}\psfrag{Torque [Nm]}{\tiny{ Torque [Nm]}}\psfrag{Time [s]}{\tiny{Time [s]}}\psfrag{p_s [bar]}{\tiny$p_{s}$ {[bar]}}\psfrag{Setpoint}{\scalebox{0.5}{{Setpoint}}}\psfrag{Set 1}{\scalebox{0.5}{{Set 1}}}\psfrag{Set 2}{\scalebox{0.5}{{Set 2}}}\psfrag{Set 3}{\scalebox{0.5}{{Set 3}}}\psfrag{Manual}{\scalebox{0.5}{{Manual}}}\psfrag{600}{\scalebox{0.4}{{600}}}\psfrag{0}{\scalebox{0.4}{{0}}}\psfrag{200}{\scalebox{0.4}{{200}}}\psfrag{400}{\scalebox{0.4}{{400}}}\psfrag{800}{\scalebox{0.4}{{800}}}\psfrag{1000}{\scalebox{0.4}{{1000}}}\psfrag{0.90}{\scalebox{0.4}{{0.90}}}\psfrag{0.93}{\scalebox{0.4}{{0.93}}}\psfrag{0.96}{\scalebox{0.4}{{0.96}}}\psfrag{0.99}{\scalebox{0.4}{{0.99}}}\psfrag{1.02}{\scalebox{0.4}{{1.02}}}\psfrag{250}{\scalebox{0.4}{{250}}}\psfrag{500}{\scalebox{0.4}{{500}}}\psfrag{750}{\scalebox{0.4}{{750}}}\psfrag{0.85}{\scalebox{0.4}{{0.85}}}\psfrag{0.95}{\scalebox{0.4}{{0.95}}}\psfrag{1.00}{\scalebox{0.4}{{1.00}}}\psfrag{p_s [bar]}{\tiny$p_{s}$ {[bar]}}\includegraphics[width=433.62pt]{ValidationStepResponse.eps}
(a) Validation for a step trajectory
\psfrag{p_s [bar]}{\tiny$p_{s}$ {[bar]}}\psfrag{Torque [Nm]}{\tiny{ Torque [Nm]}}\psfrag{Time [s]}{\tiny{Time [s]}}\psfrag{p_s [bar]}{\tiny$p_{s}$ {[bar]}}\psfrag{Setpoint}{\scalebox{0.5}{{Setpoint}}}\psfrag{Set 1}{\scalebox{0.5}{{Set 1}}}\psfrag{Set 2}{\scalebox{0.5}{{Set 2}}}\psfrag{Set 3}{\scalebox{0.5}{{Set 3}}}\psfrag{Manual}{\scalebox{0.5}{{Manual}}}\psfrag{600}{\scalebox{0.4}{{600}}}\psfrag{0}{\scalebox{0.4}{{0}}}\psfrag{200}{\scalebox{0.4}{{200}}}\psfrag{400}{\scalebox{0.4}{{400}}}\psfrag{800}{\scalebox{0.4}{{800}}}\psfrag{1000}{\scalebox{0.4}{{1000}}}\psfrag{0.90}{\scalebox{0.4}{{0.90}}}\psfrag{0.93}{\scalebox{0.4}{{0.93}}}\psfrag{0.96}{\scalebox{0.4}{{0.96}}}\psfrag{0.99}{\scalebox{0.4}{{0.99}}}\psfrag{1.02}{\scalebox{0.4}{{1.02}}}\psfrag{250}{\scalebox{0.4}{{250}}}\psfrag{500}{\scalebox{0.4}{{500}}}\psfrag{750}{\scalebox{0.4}{{750}}}\psfrag{0.85}{\scalebox{0.4}{{0.85}}}\psfrag{0.95}{\scalebox{0.4}{{0.95}}}\psfrag{1.00}{\scalebox{0.4}{{1.00}}}\includegraphics[width=433.62pt]{ValidationSineResponse2.eps}
(b) Validation for a sinusoidal trajectory
\psfrag{p_s [bar]}{\tiny$p_{s}$ {[bar]}}\psfrag{Torque [Nm]}{\tiny{ Torque [Nm]}}\psfrag{Time [s]}{\tiny{Time [s]}}\psfrag{p_s [bar]}{\tiny$p_{s}$ {[bar]}}\psfrag{Setpoint}{\scalebox{0.5}{{Setpoint}}}\psfrag{Set 1}{\scalebox{0.5}{{Set 1}}}\psfrag{Set 2}{\scalebox{0.5}{{Set 2}}}\psfrag{Set 3}{\scalebox{0.5}{{Set 3}}}\psfrag{Manual}{\scalebox{0.5}{{Manual}}}\psfrag{600}{\scalebox{0.4}{{600}}}\psfrag{0}{\scalebox{0.4}{{0}}}\psfrag{200}{\scalebox{0.4}{{200}}}\psfrag{400}{\scalebox{0.4}{{400}}}\psfrag{800}{\scalebox{0.4}{{800}}}\psfrag{1000}{\scalebox{0.4}{{1000}}}\psfrag{0.90}{\scalebox{0.4}{{0.90}}}\psfrag{0.93}{\scalebox{0.4}{{0.93}}}\psfrag{0.96}{\scalebox{0.4}{{0.96}}}\psfrag{0.99}{\scalebox{0.4}{{0.99}}}\psfrag{1.02}{\scalebox{0.4}{{1.02}}}\psfrag{250}{\scalebox{0.4}{{250}}}\psfrag{500}{\scalebox{0.4}{{500}}}\psfrag{750}{\scalebox{0.4}{{750}}}\psfrag{0.85}{\scalebox{0.4}{{0.85}}}\psfrag{0.95}{\scalebox{0.4}{{0.95}}}\psfrag{1.00}{\scalebox{0.4}{{1.00}}}\psfrag{p_s [bar]}{\tiny$p_{s}$ {[bar]}}\includegraphics[width=433.62pt]{ValidationStepControl.eps}
(c) Control inputs for step validation
Figure 3: Validation of the tuning parameters corresponding to constant tuning trajectory (Set 1), step tuning trajectory (Set 2), and sinusoidal tuning trajectory (Set 3) for two different setpoint trajectories

5.3 Results for validation

To validate the tuning results, we track two trajectories for psdp_{sd}: a sinusoidal trajectory and a step trajectory (dashed black in Fig. 3) reflecting possible setpoints for centrifugal compressors. The three sets of parameters for validation, Set 1, Set 2, and Set 3 from Table 1, correspond to the smallest error obtained for constant setpoint, the smallest number of oscillations with the error below 10 for the step setpoint, and the largest ΔT\Delta T and decreased error for sinusoidal tuning trajectory, respectively. The manual tuning for constant setpoint was also chosen because it gave the largest decrease in the error and zero oscillations compared to manual tuning with the step or sinusoidal setpoints. The initial condition for validation was set to ps(0)=0.91745p_{s}(0)=0.91745 bar, pd(0)=2p_{d}(0)=2 bar, m(0)=80m(0)=80 kg s-1, and ω(0)=700.5\omega(0)=700.5 rad s-1.

The results of validation are shown in Fig. 3 and Table 2 and confirm that solving (14) to find optimal parameters allows shaping the response of the system. Comparing the impact of the timestep ΔT\Delta T on the performance, we see that a large value allows avoiding oscillations (Set 3 and Manual in Fig. 3(a)). Thus, the parameters obtained from (14) for the sinusoidal setpoint (Set 3) are comparable with the manual tuning preserving timescale separation. At the same time, a large ΔT\Delta T leads to a sluggish controller and introduces delays (Fig. 3(c)). The performance for the parameters in Set 1 and Set 2 is further defined by the value of ν\nu. The oscillatory behaviour is due to including the setpoint in the calculations of the gradients in (1). From (11), we have 2Φ/yysp=0.02ysp\partial^{2}\Phi/\partial y\partial y_{sp}=-0.02y_{sp} and thus a large change in the setpoint yspy_{sp} corresponds to a large change in the gradient Φ/y\partial\Phi/\partial y in (8). In Set 1, combining the large change in the gradient due to the setpoint with a large ν\nu in (4) leads to the controller changing significantly within a small ΔT\Delta T and introduces oscillations. At the same time, the parameters from Set 1 allow following the sinusoidal trajectory with the smallest error (first row in Table 2) because there are no abrupt changes in the setpoint trajectory.

5.4 Discussion and recommendations

The results confirm a nonlinear relationship between the sampling time ΔT\Delta T and the step size ν\nu in (5), suggested by Belgioioso et al. (2022). Instead of iterative tuning by adjusting directly ΔT\Delta T and ν\nu, which do not have explicit interpretation in terms of the responses of the system, solving the optimization problem (14) enables adjusting the thresholds β1\beta_{1} and β2\beta_{2} directly related to the error and the number of oscillations. As a possible choice of β1\beta_{1}, we can take the error (12) obtained for the initial steady state and a chosen tuning trajectory, β1=γ10tF(ps(0)psd(ξ))2dξ.\beta_{1}=\gamma_{1}\int\limits_{0}^{t_{F}}(p_{s}(0)-p_{sd}(\xi))^{2}\mathrm{d}\xi. The initial value for β2\beta_{2} can be chosen with respect to the tuning horizon tFt_{F}, for instance tF/2t_{F}/2, allowing one zero crossing per two time units. Then both β1\beta_{1} and β2\beta_{2} can be decreased until the desired performance is reached.

Table 2: Error (12) for the validation trajectories, as absolute values and percentage improvement w.r.t. manual tuning (SM)
Tuning Validation Step Sinusoidal
Set 1 (S1) 29.98 (75%) 5.63 (94%)
Set 2 (S2) 41.51 (65%) 17.94 (80%)
Set 3 (S3) 201.07 (-69%) 139.51 (-53%)
Manual (SM) 119.2 (-) 91.27 (-)

6 Conclusions and future works

Online Feedback Optimization (OFO) controllers have already been shown to work well in practice, with design and implementation tailored to specific applications, with parameters usually chosen on a case-by-case basis. In this paper, we propose a framework for tuning Online Feedback Optimization controllers, finding a trade-off between the tracking performance of the system and sampling time constraints. We validated the framework in a pressure controller in a centrifugal compressor, achieving up to 87% times better tracking than the approach based on steady-state tuning. However, the tuning process in this work required multiple iterations. Thus, there is potential in using other methods, for instance based on surrogate optimization or safe learning algorithms, especially in safety-critical applications.

References

  • Åström and Hägglund (1984) Åström, K.J. and Hägglund, T. (1984). Automatic tuning of simple regulators with specifications on phase and amplitude margins. Automatica, 20(5), 645–651.
  • Audet et al. (2022) Audet, C., Le Digabel, S., Rochon Montplaisir, V., and Tribes, C. (2022). Algorithm 1027: NOMAD version 4: Nonlinear optimization with the MADS algorithm. ACM Transactions on Mathematical Software, 48(3), 35:1–35:22.
  • Bachtiar et al. (2016) Bachtiar, V., Kerrigan, E.C., Moase, W.H., and Manzie, C. (2016). Continuity and monotonicity of the MPC value function with respect to sampling time and prediction horizon. Automatica, 63, 330–337.
  • Bagge Carlson et al. (2021) Bagge Carlson, F., Fält, M., Heimerson, A., and Troeng, O. (2021). ControlSystems.jl: A control toolbox in Julia. In 2021 60th IEEE Conference on Decision and Control (CDC).
  • Belgioioso et al. (2022) Belgioioso, G., Liao-McPherson, D., de Badyn, M.H., Bolognani, S., Smith, R.S., Lygeros, J., and Dörfler, F. (2022). Online feedback equilibrium seeking. arXiv:2210.12088.
  • Bertsekas (2016) Bertsekas, D. (2016). Nonlinear Programming. Athena scientific optimization and computation series. Athena Scientific.
  • Cortinovis et al. (2015) Cortinovis, A., Ferreau, H.J., Lewandowski, D., and Mercangöz, M. (2015). Experimental evaluation of MPC-based anti-surge and process control for electric driven centrifugal gas compressors. Journal of Process Control, 34, 13–25.
  • Gil et al. (2023) Gil, J.D., Bueso, A., Roca, L., Zaragoza, G., and Berenguel, M. (2023). Data-driven Online Feedback Optimization of solar membrane distillation systems operating in batch mode. Journal of Process Control, 129, 103056.
  • Gravdahl et al. (2002) Gravdahl, J.T., Egeland, O., and Vatland, S.O. (2002). Drive torque actuation in active surge control of centrifugal compressors. Automatica, 38(11), 1881–1893.
  • Häberle et al. (2020) Häberle, V., Hauswirth, A., Ortmann, L., Bolognani, S., and Dörfler, F. (2020). Non-convex feedback optimization with input and output constraints. IEEE Control Systems Letters, 5(1), 343–348.
  • Hauswirth et al. (2021a) Hauswirth, A., Bolognani, S., Hug, G., and Dörfler, F. (2021a). Optimization algorithms as robust feedback controllers. arXiv:2103.11329.
  • Hauswirth et al. (2021b) Hauswirth, A., Bolognani, S., Hug, G., and Dörfler, F. (2021b). Timescale separation in autonomous optimization. IEEE Transactions on Automatic Control, 66(2), 611–624.
  • He et al. (2023) He, Z., Bolognani, S., He, J., Dörfler, F., and Guan, X. (2023). Model-free nonlinear feedback optimization. IEEE Transactions on Automatic Control, 1–16.
  • Innes (2018) Innes, M. (2018). Don’t unroll adjoint: Differentiating SSA-form programs. In 32nd Conference on Neural Information Processing Systems, Montréal, Canada.
  • Milosavljevic et al. (2020) Milosavljevic, P., Marchetti, A.G., Cortinovis, A., Faulwasser, T., Mercangöz, M., and Bonvin, D. (2020). Real-time optimization of load sharing for gas compressors in the presence of uncertainty. Applied Energy, 272, 114883.
  • Montoison et al. (2020) Montoison, A., Pascal, P., and Salomon, L. (2020). NOMAD.jl: A Julia interface for the constrained blackbox solver NOMAD. github.com/bbopt/NOMAD.jl.
  • Ortmann et al. (2023) Ortmann, L., Rubin, C., Scozzafava, A., Lehmann, J., Bolognani, S., and Dörfler, F. (2023). Deployment of an Online Feedback Optimization controller for reactive power flow optimization in a distribution grid. In Proc. IEEE PES ISGT Europe. IEEE.
  • Picallo et al. (2022) Picallo, M., Ortmann, L., Bolognani, S., and Dörfler, F. (2022). Adaptive real-time grid operation via online feedback optimization with sensitivity estimation. Electric Power Systems Research, 212, 108405.
  • Rackauckas and Nie (2017) Rackauckas, C. and Nie, Q. (2017). DifferentialEquations.jl – a performant and feature-rich ecosystem for solving differential equations in Julia. The Journal of Open Research Software, 5(1).
  • Stellato et al. (2020) Stellato, B., Banjac, G., Goulart, P., Bemporad, A., and Boyd, S. (2020). OSQP: an operator splitting solver for quadratic programs. Mathematical Programming Computation, 12(4), 637–672.
  • Thornhill et al. (2003) Thornhill, N.F., Huang, B., and Zhang, H. (2003). Detection of multiple oscillations in control loops. Journal of Process Control, 13(1), 91–100.
  • Zagorowska et al. (2022) Zagorowska, M., Degner, M., Ortmann, L., Ahmed, A., Bolognani, S., del Rio Chanona, E.A., and Mercangöz, M. (2022). Online Feedback Optimization of compressor stations with model adaptation using Gaussian process regression. Journal of Process Control, 121, 119–133.