Update Matlab tangled files

This commit is contained in:
tdehaeze committed 2026-10-17 18:35:40 +02:00
1 parent 8f121be23b
commit 8e08e3f3d4
10 files changed
+159 -121

No files matched your search

+46 -18
View File
@@ -45,7 +45,7 @@ To run the Matlab code, go in the =matlab= directory and run the following Matla
#+caption: Paper's sections and corresponding Matlab files #+caption: Paper's sections and corresponding Matlab files
| Sections | Matlab File | | Sections | Matlab File |
|------------------------------------+----------------------------| |------------------------------------+--------------------------|
| Section [[sec:system_description]] | =s1_system_description.m= | | Section [[sec:system_description]] | =s1_system_description.m= |
| Section [[sec:iff_pure_int]] | =s2_iff_pure_int.m= | | Section [[sec:iff_pure_int]] | =s2_iff_pure_int.m= |
| Section [[sec:iff_pseudo_int]] | =s3_iff_hpf.m= | | Section [[sec:iff_pseudo_int]] | =s3_iff_hpf.m= |
@@ -67,9 +67,12 @@ To run the Matlab code, go in the =matlab= directory and run the following Matla
<<matlab-init>> <<matlab-init>>
#+end_src #+end_src
#+begin_src matlab :tangle no #+begin_src matlab :tangle no :noweb yes
addpath('./matlab/'); <<m-init-path>>
addpath('./src/'); #+end_src
#+begin_src matlab :eval no :noweb yes
<<m-init-path-tangle>>
#+end_src #+end_src
** System description ** System description
@@ -447,9 +450,12 @@ Two identical controllers $K_F$ are used to feedback each of the sensed force to
<<matlab-init>> <<matlab-init>>
#+end_src #+end_src
#+begin_src matlab :tangle no #+begin_src matlab :tangle no :noweb yes
addpath('./matlab/'); <<m-init-path>>
addpath('./src/'); #+end_src
#+begin_src matlab :eval no :noweb yes
<<m-init-path-tangle>>
#+end_src #+end_src
** Plant Parameters ** Plant Parameters
@@ -771,9 +777,12 @@ It is shown that for non-null rotating speed, one pole is bound to the right-hal
<<matlab-init>> <<matlab-init>>
#+end_src #+end_src
#+begin_src matlab :tangle no #+begin_src matlab :tangle no :noweb yes
addpath('./matlab/'); <<m-init-path>>
addpath('./src/'); #+end_src
#+begin_src matlab :eval no :noweb yes
<<m-init-path-tangle>>
#+end_src #+end_src
** Plant Parameters ** Plant Parameters
@@ -1167,9 +1176,12 @@ To find the optimum, the gain that maximize the simultaneous damping of the mode
<<matlab-init>> <<matlab-init>>
#+end_src #+end_src
#+begin_src matlab :tangle no #+begin_src matlab :tangle no :noweb yes
addpath('./matlab/'); <<m-init-path>>
addpath('./src/'); #+end_src
#+begin_src matlab :eval no :noweb yes
<<m-init-path-tangle>>
#+end_src #+end_src
** Schematic ** Schematic
@@ -1768,9 +1780,12 @@ These two methods are now compared in terms of added damping, closed-loop compli
<<matlab-init>> <<matlab-init>>
#+end_src #+end_src
#+begin_src matlab :tangle no #+begin_src matlab :tangle no :noweb yes
addpath('./matlab/'); <<m-init-path>>
addpath('./src/'); #+end_src
#+begin_src matlab :eval no :noweb yes
<<m-init-path-tangle>>
#+end_src #+end_src
** Plant Parameters ** Plant Parameters
@@ -2143,10 +2158,23 @@ Critical Damping corresponds to to $\xi = 1$, and thus:
#+latex: \printbibliography #+latex: \printbibliography
bibliography:ref.bib bibliography:ref.bib
* Helping Functions :noexport:
** Initialize Path
#+NAME: m-init-path
#+BEGIN_SRC matlab
addpath('./matlab/'); % Path for scripts
addpath('./matlab/src/'); % Path for functions
#+END_SRC
#+NAME: m-init-path-tangle
#+BEGIN_SRC matlab
addpath('./src/'); % Path for functions
#+END_SRC
* Functions :noexport: * Functions :noexport:
** Sort Poles for the Root Locus ** Sort Poles for the Root Locus
:PROPERTIES: :PROPERTIES:
:header-args:matlab+: :tangle src/rootLocusPolesSorted.m :header-args:matlab+: :tangle matlab/src/rootLocusPolesSorted.m
:header-args:matlab+: :comments none :mkdirp yes :eval no :header-args:matlab+: :comments none :mkdirp yes :eval no
:END: :END:
<<sec:rootLocusPolesSorted>> <<sec:rootLocusPolesSorted>>
@@ -2291,7 +2319,7 @@ This Matlab function is accessible [[file:src/rootLocusPolesSorted.m][here]].
#+end_src #+end_src
** =computeSimultaneousDamping= ** =computeSimultaneousDamping=
#+begin_src matlab :tangle src/computeSimultaneousDamping.m #+begin_src matlab :tangle matlab/src/computeSimultaneousDamping.m
function [xi_min] = computeSimultaneousDamping(g, G, K) function [xi_min] = computeSimultaneousDamping(g, G, K)
[w, xi] = damp(minreal(feedback(G, g*K))); [w, xi] = damp(minreal(feedback(G, g*K)));
xi_min = 1/min(xi); xi_min = 1/min(xi);
+2
View File
@@ -4,6 +4,8 @@ clear; close all; clc;
%% Intialize Laplace variable %% Intialize Laplace variable
s = zpk('s'); s = zpk('s');
addpath('./src/'); % Path for functions
% Numerical Values % Numerical Values
% Let's define initial values for the model. % Let's define initial values for the model.
+2
View File
@@ -4,6 +4,8 @@ clear; close all; clc;
%% Intialize Laplace variable %% Intialize Laplace variable
s = zpk('s'); s = zpk('s');
addpath('./src/'); % Path for functions
% Plant Parameters % Plant Parameters
% Let's define initial values for the model. % Let's define initial values for the model.
+2
View File
@@ -4,6 +4,8 @@ clear; close all; clc;
%% Intialize Laplace variable %% Intialize Laplace variable
s = zpk('s'); s = zpk('s');
addpath('./src/'); % Path for functions
% Plant Parameters % Plant Parameters
% Let's define initial values for the model. % Let's define initial values for the model.
+2
View File
@@ -4,6 +4,8 @@ clear; close all; clc;
%% Intialize Laplace variable %% Intialize Laplace variable
s = zpk('s'); s = zpk('s');
addpath('./src/'); % Path for functions
% Plant Parameters % Plant Parameters
% Let's define initial values for the model. % Let's define initial values for the model.
+2
View File
@@ -4,6 +4,8 @@ clear; close all; clc;
%% Intialize Laplace variable %% Intialize Laplace variable
s = zpk('s'); s = zpk('s');
addpath('./src/'); % Path for functions
% Plant Parameters % Plant Parameters
% Let's define initial values for the model. % Let's define initial values for the model.
@@ -0,0 +1,10 @@
% =computeSimultaneousDamping=
function [xi_min] = computeSimultaneousDamping(g, G, K)
[w, xi] = damp(minreal(feedback(G, g*K)));
xi_min = 1/min(xi);
if xi_min < 0
xi_min = 1e8;
end
end
+93
View File
@@ -0,0 +1,93 @@
function [poles] = rootLocusPolesSorted(G, K, gains, args)
% rootLocusPolesSorted -
%
% Syntax: [poles] = rootLocusPolesSorted(G, K, gains, args)
%
% Inputs:
% - G, K, gains, args -
%
% Outputs:
% - poles -
arguments
G
K
gains
args.minreal double {mustBeNumericOrLogical} = false
args.p_half double {mustBeNumericOrLogical} = false
args.d_max double {mustBeNumeric} = -1
end
if args.minreal
p1 = pole(minreal(feedback(G, gains(1)*K)));
[~, i_uniq] = uniquetol([real(p1), imag(p1)], 1e-10, 'ByRows', true);
p1 = p1(i_uniq);
poles = zeros(length(p1), length(gains));
poles(:, 1) = p1;
else
p1 = pole(feedback(G, gains(1)*K));
[~, i_uniq] = uniquetol([real(p1), imag(p1)], 1e-10, 'ByRows', true);
p1 = p1(i_uniq);
poles = zeros(length(p1), length(gains));
poles(:, 1) = p1;
end
if args.minreal
p2 = pole(minreal(feedback(G, gains(2)*K)));
[~, i_uniq] = uniquetol([real(p2), imag(p2)], 1e-10, 'ByRows', true);
p2 = p2(i_uniq);
poles(:, 2) = p2;
else
p2 = pole(feedback(G, gains(2)*K));
[~, i_uniq] = uniquetol([real(p2), imag(p2)], 1e-10, 'ByRows', true);
p2 = p2(i_uniq);
poles(:, 2) = p2;
end
for g_i = 3:length(gains)
% Estimated value of the poles
poles_est = poles(:, g_i-1) + (poles(:, g_i-1) - poles(:, g_i-2))*(gains(g_i) - gains(g_i-1))/(gains(g_i-1) - gains(g_i - 2));
% New values for the poles
poles_gi = pole(feedback(G, gains(g_i)*K));
[~, i_uniq] = uniquetol([real(poles_gi), imag(poles_gi)], 1e-10, 'ByRows', true);
poles_gi = poles_gi(i_uniq);
% Array of distances between all the poles
poles_dist = sqrt((poles_est-poles_gi.').*conj(poles_est-poles_gi.'));
% Get indices corresponding to distances from lowest to highest
[~, c] = sort(min(poles_dist));
as = 1:length(poles_gi);
% for each column of poles_dist corresponding to the i'th pole
% with closest previous poles
for p_i = c
% Get the indice a_i of the previous pole that is the closest
% to pole c(p_i)
[~, a_i] = min(poles_dist(:, p_i));
poles(as(a_i), g_i) = poles_gi(p_i);
% Remove old poles that are already matched
% poles_gi(as(a_i), :) = [];
poles_dist(a_i, :) = [];
as(a_i) = [];
end
end
if args.d_max > 0
poles = poles(max(abs(poles(:, 2:end) - poles(:, 1:end-1))') > args.d_max, :);
end
if args.p_half
poles = poles(1:round(end/2), :);
end
[~, s_p] = sort(imag(poles(:,1)), 'descend');
poles = poles(s_p, :);
poles = poles.';
-10
View File
@@ -1,10 +0,0 @@
% =computeSimultaneousDamping=
function [xi_min] = computeSimultaneousDamping(g, G, K)
[w, xi] = damp(minreal(feedback(G, g*K)));
xi_min = 1/min(xi);
if xi_min < 0
xi_min = 1e8;
end
end
-93
View File
@@ -1,93 +0,0 @@
function [poles] = rootLocusPolesSorted(G, K, gains, args)
% rootLocusPolesSorted -
%
% Syntax: [poles] = rootLocusPolesSorted(G, K, gains, args)
%
% Inputs:
% - G, K, gains, args -
%
% Outputs:
% - poles -
arguments
G
K
gains
args.minreal double {mustBeNumericOrLogical} = false
args.p_half double {mustBeNumericOrLogical} = false
args.d_max double {mustBeNumeric} = -1
end
if args.minreal
p1 = pole(minreal(feedback(G, gains(1)*K)));
[~, i_uniq] = uniquetol([real(p1), imag(p1)], 1e-10, 'ByRows', true);
p1 = p1(i_uniq);
poles = zeros(length(p1), length(gains));
poles(:, 1) = p1;
else
p1 = pole(feedback(G, gains(1)*K));
[~, i_uniq] = uniquetol([real(p1), imag(p1)], 1e-10, 'ByRows', true);
p1 = p1(i_uniq);
poles = zeros(length(p1), length(gains));
poles(:, 1) = p1;
end
if args.minreal
p2 = pole(minreal(feedback(G, gains(2)*K)));
[~, i_uniq] = uniquetol([real(p2), imag(p2)], 1e-10, 'ByRows', true);
p2 = p2(i_uniq);
poles(:, 2) = p2;
else
p2 = pole(feedback(G, gains(2)*K));
[~, i_uniq] = uniquetol([real(p2), imag(p2)], 1e-10, 'ByRows', true);
p2 = p2(i_uniq);
poles(:, 2) = p2;
end
for g_i = 3:length(gains)
% Estimated value of the poles
poles_est = poles(:, g_i-1) + (poles(:, g_i-1) - poles(:, g_i-2))*(gains(g_i) - gains(g_i-1))/(gains(g_i-1) - gains(g_i - 2));
% New values for the poles
poles_gi = pole(feedback(G, gains(g_i)*K));
[~, i_uniq] = uniquetol([real(poles_gi), imag(poles_gi)], 1e-10, 'ByRows', true);
poles_gi = poles_gi(i_uniq);
% Array of distances between all the poles
poles_dist = sqrt((poles_est-poles_gi.').*conj(poles_est-poles_gi.'));
% Get indices corresponding to distances from lowest to highest
[~, c] = sort(min(poles_dist));
as = 1:length(poles_gi);
% for each column of poles_dist corresponding to the i'th pole
% with closest previous poles
for p_i = c
% Get the indice a_i of the previous pole that is the closest
% to pole c(p_i)
[~, a_i] = min(poles_dist(:, p_i));
poles(as(a_i), g_i) = poles_gi(p_i);
% Remove old poles that are already matched
% poles_gi(as(a_i), :) = [];
poles_dist(a_i, :) = [];
as(a_i) = [];
end
end
if args.d_max > 0
poles = poles(max(abs(poles(:, 2:end) - poles(:, 1:end-1))') > args.d_max, :);
end
if args.p_half
poles = poles(1:round(end/2), :);
end
[~, s_p] = sort(imag(poles(:,1)), 'descend');
poles = poles(s_p, :);
poles = poles.';