Add Manuscript

This commit is contained in:
Thomas Dehaeze 2025-04-24 00:02:46 +02:00
parent 64f564f7a1
commit 72618f3bc6
6 changed files with 59 additions and 44 deletions

View File

@ -63,8 +63,9 @@ for i = 1:7
end end
hold off; hold off;
xlabel('Voltage [V]'); ylabel('Displacement [$\mu m$]') xlabel('Voltage [V]'); ylabel('Displacement [$\mu m$]')
legend('location', 'southwest', 'FontSize', 8)
xlim([-20, 150]); ylim([-250, 0]); xlim([-20, 150]); ylim([-250, 0]);
leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1);
leg.ItemTokenSize(1) = 15;
%% X-Bending Identification %% X-Bending Identification
% Load Data % Load Data
@ -96,4 +97,5 @@ hold off;
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'log'); set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'log');
xlabel('Frequency [Hz]'); ylabel('Amplitude'); xlabel('Frequency [Hz]'); ylabel('Amplitude');
xlim([100, 1e3]); ylim([5e-5, 2e-1]); xlim([100, 1e3]); ylim([5e-5, 2e-1]);
legend('location', 'northeast', 'FontSize', 8) leg = legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 1);
leg.ItemTokenSize(1) = 15;

View File

@ -30,7 +30,8 @@ for i = [6,5,4,2]
end end
hold off; hold off;
xlabel('Stack Voltage $V_a$ [V]'); ylabel('Displacement $d_e$ [$\mu$m]'); xlabel('Stack Voltage $V_a$ [V]'); ylabel('Displacement $d_e$ [$\mu$m]');
legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 1); leg = legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 1);
leg.ItemTokenSize(1) = 15;
xlim([-20, 150]); xlim([-20, 150]);
ylim([-120, 120]); ylim([-120, 120]);
@ -132,8 +133,9 @@ hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Amplitude $d_e/u$ [m/V]'); set(gca, 'XTickLabel',[]); ylabel('Amplitude $d_e/u$ [m/V]'); set(gca, 'XTickLabel',[]);
hold off; hold off;
legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 2);
ylim([1e-8, 1e-3]); ylim([1e-8, 1e-3]);
leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 2);
leg.ItemTokenSize(1) = 15;
ax2 = nexttile; ax2 = nexttile;
hold on; hold on;
@ -164,7 +166,8 @@ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Amplitude $V_s/u$ [V/V]'); set(gca, 'XTickLabel',[]); ylabel('Amplitude $V_s/u$ [V/V]'); set(gca, 'XTickLabel',[]);
hold off; hold off;
ylim([1e-2, 1e2]); ylim([1e-2, 1e2]);
legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 2); leg = legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 2);
leg.ItemTokenSize(1) = 15;
ax2 = nexttile; ax2 = nexttile;
hold on; hold on;
@ -209,9 +212,9 @@ ylim([0, 1]);
%% Bode plot of the FRF from u to de %% Bode plot of the FRF from u to de
figure; figure;
tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); tiledlayout(2, 1, 'TileSpacing', 'Compact', 'Padding', 'None');
ax1 = nexttile([2,1]); ax1 = nexttile;
hold on; hold on;
plot(f, abs(frf_noise), '.-'); plot(f, abs(frf_noise), '.-');
hold off; hold off;
@ -258,22 +261,23 @@ tiledlayout(2, 1, 'TileSpacing', 'Compact', 'Padding', 'None');
ax1 = nexttile(); ax1 = nexttile();
hold on; hold on;
plot(f, abs(frf_wo_k), 'DisplayName', 'Without $R$'); plot(f, abs(frf_wo_k), '-', 'color', [colors(1,:), 0.5], 'linewidth', 2.5, 'DisplayName', 'Without $R$');
plot(f, abs(frf_wi_k), 'DisplayName', 'With $R$'); plot(f, abs(frf_wi_k), '-', 'color', [colors(2,:), 0.5], 'linewidth', 2.5, 'DisplayName', 'With $R$');
plot(f, abs(squeeze(freqresp(G_hpf, f, 'Hz'))), 'k--', 'DisplayName', 'RC model'); plot(f, abs(squeeze(freqresp(G_hpf, f, 'Hz'))), '--', 'color', colors(2,:), 'DisplayName', 'RC model');
hold off; hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Amplitude [V/V]'); set(gca, 'XTickLabel',[]); ylabel('Amplitude [V/V]'); set(gca, 'XTickLabel',[]);
hold off; hold off;
ylim([2e-1, 1e0]); ylim([2e-1, 1e0]);
yticks([0.2, 0.5, 1]); yticks([0.2, 0.5, 1]);
legend('location', 'southeast', 'FontSize', 8); leg = legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 1);
leg.ItemTokenSize(1) = 15;
ax2 = nexttile; ax2 = nexttile;
hold on; hold on;
plot(f, 180/pi*angle(frf_wo_k)); plot(f, 180/pi*angle(frf_wo_k), '-', 'color', [colors(1,:), 0.5], 'linewidth', 2.5);
plot(f, 180/pi*angle(frf_wi_k)); plot(f, 180/pi*angle(frf_wi_k), '-', 'color', [colors(2,:), 0.5], 'linewidth', 2.5);
plot(f, 180/pi*angle(squeeze(freqresp(G_hpf, f, 'Hz'))), 'k--', 'DisplayName', 'RC'); plot(f, 180/pi*angle(squeeze(freqresp(G_hpf, f, 'Hz'))), '--', 'color', colors(2,:), 'DisplayName', 'RC');
hold off; hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
@ -312,23 +316,25 @@ tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None');
ax1 = nexttile([2,1]); ax1 = nexttile([2,1]);
hold on; hold on;
plot(f, abs(G_iff), 'color', colors(2,:), 'DisplayName', 'Identified plant') plot(f, abs(G_iff), '-', 'color', [colors(1,:), 0.5], 'linewidth', 2.5, 'DisplayName', 'Measured FRF');
plot(f, abs(squeeze(freqresp(G_iff_model, f, 'Hz'))), 'k--', 'DisplayName', 'Manual fit') plot(f, abs(squeeze(freqresp(G_iff_model, f, 'Hz'))), '--', 'color', colors(1,:), 'DisplayName', 'Manual fit')
hold off; hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Amplitude $V_s/u$ [V/V]'); set(gca, 'XTickLabel',[]); ylabel('Amplitude $V_s/u$ [V/V]'); set(gca, 'XTickLabel',[]);
legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 1); legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 1);
ylim([1e-2, 1e2]);
yticks([1e-2, 1e-1, 1, 1e1, 1e2]);
ax2 = nexttile; ax2 = nexttile;
hold on; hold on;
plot(f, 180/pi*angle(G_iff), 'color', colors(2,:)); plot(f, 180/pi*angle(G_iff), '-', 'color', [colors(1,:), 0.5], 'linewidth', 2.5);
plot(f, 180/pi*angle(squeeze(freqresp(G_iff_model, f, 'Hz'))), 'k--') plot(f, 180/pi*angle(squeeze(freqresp(G_iff_model, f, 'Hz'))), '--', 'color', colors(1,:))
hold off; hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
hold off; hold off;
yticks(-360:45:360);
ylim([-90, 180]) ylim([-90, 180])
yticks(-360:90:360);
linkaxes([ax1,ax2],'x'); linkaxes([ax1,ax2],'x');
xlim([0.2, 1e3]); xlim([0.2, 1e3]);
@ -398,14 +404,15 @@ tiledlayout(1, 1, 'TileSpacing', 'Compact', 'Padding', 'None');
ax1 = nexttile(); ax1 = nexttile();
hold on; hold on;
for i = 1:length(i_kept) for i = 1:length(i_kept)
plot(f, abs(G_dL_frf{i}), 'color', [colors(i,:), 1], 'DisplayName', sprintf('g = %.0f', data.gains(i_kept(i)))) plot(f, abs(G_dL_frf{i}), '-', 'color', [colors(i,:), 0.5], 'linewidth', 2.5, 'DisplayName', sprintf('g = %.0f', data.gains(i_kept(i))))
plot(f, abs(squeeze(freqresp(G_dL_id{i}, f, 'Hz'))), '--', 'color', [colors(i,:), 1], 'HandleVisibility', 'off') plot(f, abs(squeeze(freqresp(G_dL_id{i}, f, 'Hz'))), '--', 'color', [colors(i,:), 1], 'HandleVisibility', 'off')
end end
hold off; hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
xlabel('Frequency [Hz]'); ylabel('Amplitude $d_e/u^\prime$ [m/V]'); xlabel('Frequency [Hz]'); ylabel('Amplitude $d_e/u^\prime$ [m/V]');
xlim([10, 1e3]); xlim([10, 800]);
legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 1); leg = legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 1);
leg.ItemTokenSize(1) = 15;
%% Root Locus of the APA300ML with Integral Force Feedback %% Root Locus of the APA300ML with Integral Force Feedback
% Comparison between the computed root locus from the plant model and the root locus estimated from the damped plant pole identification % Comparison between the computed root locus from the plant model and the root locus estimated from the damped plant pole identification
@ -416,7 +423,7 @@ hold on;
G_iff_poles = pole(pade(G_iff_model)); G_iff_poles = pole(pade(G_iff_model));
i = imag(G_iff_poles) > 100; % Only keep relevant poles i = imag(G_iff_poles) > 100; % Only keep relevant poles
plot(real(G_iff_poles(i)), imag(G_iff_poles(i)), 'kx', ... plot(real(G_iff_poles(i)), imag(G_iff_poles(i)), 'kx', ...
'DisplayName', '$g = 0$'); 'HandleVisibility', 'off');
G_iff_zeros = tzero(G_iff_model); G_iff_zeros = tzero(G_iff_model);
i = imag(G_iff_zeros) > 100; % Only keep relevant zeros i = imag(G_iff_zeros) > 100; % Only keep relevant zeros
plot(real(G_iff_zeros(i)), imag(G_iff_zeros(i)), 'ko', ... plot(real(G_iff_zeros(i)), imag(G_iff_zeros(i)), 'ko', ...
@ -437,4 +444,5 @@ ylabel('Imaginary Part')
axis equal axis equal
ylim([0, 610]); ylim([0, 610]);
xlim([-300,0]); xlim([-300,0]);
legend('location', 'southwest', 'FontSize', 8); leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1);
leg.ItemTokenSize(1) = 15;

View File

@ -105,9 +105,9 @@ tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None');
ax1 = nexttile([2,1]); ax1 = nexttile([2,1]);
hold on; hold on;
plot(f, abs(enc_frf(:, 1)), 'color', [0,0,0,0.2], 'DisplayName', 'Identified'); plot(f, abs(enc_frf(:, 1)), '-', 'color', [colors(2,:), 0.1], 'linewidth', 2.5, 'DisplayName', 'Identified');
for i = 1:length(apa_nums) for i = 1:length(apa_nums)
plot(f, abs(enc_frf(:, i)), 'color', [0,0,0,0.2], 'HandleVisibility', 'off'); plot(f, abs(enc_frf(:, i)), '-', 'color', [colors(2,:), 0.1], 'linewidth', 2.5, 'HandleVisibility', 'off');
end end
plot(freqs, abs(squeeze(freqresp(G_2dof('de', 'u'), freqs, 'Hz'))), '--', 'color', colors(2,:), 'DisplayName', '2DoF Model') plot(freqs, abs(squeeze(freqresp(G_2dof('de', 'u'), freqs, 'Hz'))), '--', 'color', colors(2,:), 'DisplayName', '2DoF Model')
hold off; hold off;
@ -115,12 +115,13 @@ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Amplitude $d_e/u$ [m/V]'); set(gca, 'XTickLabel',[]); ylabel('Amplitude $d_e/u$ [m/V]'); set(gca, 'XTickLabel',[]);
hold off; hold off;
ylim([1e-8, 1e-3]); ylim([1e-8, 1e-3]);
legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 1); leg = legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 1);
leg.ItemTokenSize(1) = 15;
ax2 = nexttile; ax2 = nexttile;
hold on; hold on;
for i = 1:length(apa_nums) for i = 1:length(apa_nums)
plot(f, 180/pi*angle(enc_frf(:, i)), 'color', [0,0,0,0.2]); plot(f, 180/pi*angle(enc_frf(:, i)), '-', 'color', [colors(2,:), 0.1], 'linewidth', 2.5);
end end
plot(freqs, 180/pi*angle(squeeze(freqresp(G_2dof('de', 'u'), freqs, 'Hz'))), '--', 'color', colors(2,:)) plot(freqs, 180/pi*angle(squeeze(freqresp(G_2dof('de', 'u'), freqs, 'Hz'))), '--', 'color', colors(2,:))
hold off; hold off;
@ -138,24 +139,25 @@ tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None');
ax1 = nexttile([2,1]); ax1 = nexttile([2,1]);
hold on; hold on;
plot(f, abs(iff_frf(:, 1)), 'color', [0,0,0,0.2], 'DisplayName', 'Identified'); plot(f, abs(iff_frf(:, 1)), '-', 'color', [colors(1,:), 0.1], 'linewidth', 2.5, 'DisplayName', 'Identified');
for i = 2:length(apa_nums) for i = 2:length(apa_nums)
plot(f, abs(iff_frf(:, i)), 'color', [0,0,0,0.2], 'HandleVisibility', 'off'); plot(f, abs(iff_frf(:, i)), '-', 'color', [colors(1,:), 0.1], 'linewidth', 2.5, 'HandleVisibility', 'off');
end end
plot(freqs, abs(squeeze(freqresp(G_2dof('Vs', 'u'), freqs, 'Hz'))), '--', 'color', colors(2,:), 'DisplayName', '2DoF Model') plot(freqs, abs(squeeze(freqresp(G_2dof('Vs', 'u'), freqs, 'Hz'))), '--', 'color', colors(1,:), 'DisplayName', '2DoF Model')
hold off; hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Amplitude $V_s/u$ [V/V]'); set(gca, 'XTickLabel',[]); ylabel('Amplitude $V_s/u$ [V/V]'); set(gca, 'XTickLabel',[]);
hold off; hold off;
ylim([1e-2, 1e2]); ylim([1e-2, 1e2]);
legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 1); leg = legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 1);
leg.ItemTokenSize(1) = 15;
ax2 = nexttile; ax2 = nexttile;
hold on; hold on;
for i = 1:length(apa_nums) for i = 1:length(apa_nums)
plot(f, 180/pi*angle(iff_frf(:, i)), 'color', [0,0,0,0.2]); plot(f, 180/pi*angle(iff_frf(:, i)), '-', 'color', [colors(1,:), 0.2], 'linewidth', 2.5);
end end
plot(freqs, 180/pi*angle(squeeze(freqresp(G_2dof('Vs', 'u'), freqs, 'Hz'))), '--', 'color', colors(2,:)) plot(freqs, 180/pi*angle(squeeze(freqresp(G_2dof('Vs', 'u'), freqs, 'Hz'))), '--', 'color', colors(1,:))
hold off; hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); xlabel('Frequency [Hz]'); ylabel('Phase [deg]');

View File

@ -71,9 +71,9 @@ tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None');
ax1 = nexttile([2,1]); ax1 = nexttile([2,1]);
hold on; hold on;
plot(f, abs(enc_frf(:, 1)), 'color', [0,0,0,0.2], 'DisplayName', 'Identified'); plot(f, abs(enc_frf(:, 1)), 'color', [colors(2,:), 0.1], 'linewidth', 2.5, 'DisplayName', 'Identified');
for i = 1:length(apa_nums) for i = 1:length(apa_nums)
plot(f, abs(enc_frf(:, i)), 'color', [0,0,0,0.2], 'HandleVisibility', 'off'); plot(f, abs(enc_frf(:, i)), 'color', [colors(2,:), 0.1], 'linewidth', 2.5, 'HandleVisibility', 'off');
end end
plot(freqs, abs(squeeze(freqresp(G_flex('de', 'u'), freqs, 'Hz'))), '--', 'color', colors(2,:), 'DisplayName', '"Flexible" Model') plot(freqs, abs(squeeze(freqresp(G_flex('de', 'u'), freqs, 'Hz'))), '--', 'color', colors(2,:), 'DisplayName', '"Flexible" Model')
hold off; hold off;
@ -81,12 +81,13 @@ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Amplitude $d_e/u$ [m/V]'); set(gca, 'XTickLabel',[]); ylabel('Amplitude $d_e/u$ [m/V]'); set(gca, 'XTickLabel',[]);
hold off; hold off;
ylim([1e-8, 1e-3]); ylim([1e-8, 1e-3]);
legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 1); leg = legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 1);
leg.ItemTokenSize(1) = 15;
ax2 = nexttile; ax2 = nexttile;
hold on; hold on;
for i = 1:length(apa_nums) for i = 1:length(apa_nums)
plot(f, 180/pi*angle(enc_frf(:, i)), 'color', [0,0,0,0.2]); plot(f, 180/pi*angle(enc_frf(:, i)), 'color', [colors(2,:), 0.1], 'linewidth', 2.5);
end end
plot(freqs, 180/pi*angle(squeeze(freqresp(G_flex('de', 'u'), freqs, 'Hz'))), '--', 'color', colors(2,:)) plot(freqs, 180/pi*angle(squeeze(freqresp(G_flex('de', 'u'), freqs, 'Hz'))), '--', 'color', colors(2,:))
hold off; hold off;
@ -104,24 +105,25 @@ tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None');
ax1 = nexttile([2,1]); ax1 = nexttile([2,1]);
hold on; hold on;
plot(f, abs(iff_frf(:, 1)), 'color', [0,0,0,0.2], 'DisplayName', 'Identified'); plot(f, abs(iff_frf(:, 1)), '-', 'color', [colors(1,:), 0.1], 'linewidth', 2.5, 'DisplayName', 'Identified');
for i = 2:length(apa_nums) for i = 2:length(apa_nums)
plot(f, abs(iff_frf(:, i)), 'color', [0,0,0,0.2], 'HandleVisibility', 'off'); plot(f, abs(iff_frf(:, i)), '-', 'color', [colors(1,:), 0.1], 'linewidth', 2.5, 'HandleVisibility', 'off');
end end
plot(freqs, abs(squeeze(freqresp(G_flex('Vs', 'u'), freqs, 'Hz'))), '--', 'color', colors(2,:), 'DisplayName', '"Flexible" Model') plot(freqs, abs(squeeze(freqresp(G_flex('Vs', 'u'), freqs, 'Hz'))), '--', 'color', colors(1,:), 'DisplayName', '"Flexible" Model')
hold off; hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Amplitude $V_s/u$ [V/V]'); set(gca, 'XTickLabel',[]); ylabel('Amplitude $V_s/u$ [V/V]'); set(gca, 'XTickLabel',[]);
hold off; hold off;
ylim([1e-2, 1e2]); ylim([1e-2, 1e2]);
legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 1); leg = legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 1);
leg.ItemTokenSize(1) = 15;
ax2 = nexttile; ax2 = nexttile;
hold on; hold on;
for i = 1:length(apa_nums) for i = 1:length(apa_nums)
plot(f, 180/pi*angle(iff_frf(:, i)), 'color', [0,0,0,0.2]); plot(f, 180/pi*angle(iff_frf(:, i)), '-', 'color', [colors(1,:), 0.1], 'linewidth', 2.5);
end end
plot(freqs, 180/pi*angle(squeeze(freqresp(G_flex('Vs', 'u'), freqs, 'Hz'))), '--', 'color', colors(2,:)) plot(freqs, 180/pi*angle(squeeze(freqresp(G_flex('Vs', 'u'), freqs, 'Hz'))), '--', 'color', colors(1,:))
hold off; hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); xlabel('Frequency [Hz]'); ylabel('Phase [deg]');

View File

@ -74,6 +74,7 @@ The repository is organized as follows:
├── C3-test-bench-struts ├── C3-test-bench-struts
├── C4-test-bench-nano-hexapod ├── C4-test-bench-nano-hexapod
├── C5-test-bench-id31 ├── C5-test-bench-id31
├── dehaeze-nass-phd-thesis.pdf # PhD Thesis Manuscript
├── init.m # Optional: Some Matlab configuration to have same figure display ├── init.m # Optional: Some Matlab configuration to have same figure display
├── LICENSE # MIT License is used for all the code in this repository ├── LICENSE # MIT License is used for all the code in this repository
└── README.md # The present file └── README.md # The present file

BIN
dehaeze-nass-phd-thesis.pdf Normal file

Binary file not shown.