From b4c654a0e26cbf33eca63c323815caa853cdf4b4 Mon Sep 17 00:00:00 2001 From: Thomas Dehaeze Date: Tue, 15 Apr 2025 09:29:40 +0200 Subject: [PATCH] Correct Matlab scripts --- matlab/mat/uniaxial_disturbance_psd.mat | Bin 18684 -> 16997 bytes matlab/uniaxial_3_disturbances.m | 9 +-- matlab/uniaxial_4_dynamic_noise_budget.m | 6 +- matlab/uniaxial_5_active_damping.m | 24 ++++--- matlab/uniaxial_6_hac_lac.m | 20 ++++-- matlab/uniaxial_8_payload_dynamics.m | 24 +++---- nass-uniaxial-model.org | 87 +++++++++++++---------- 7 files changed, 98 insertions(+), 72 deletions(-) diff --git a/matlab/mat/uniaxial_disturbance_psd.mat b/matlab/mat/uniaxial_disturbance_psd.mat index ea57cd3c01db738fbb8ba4ed5e72bcf495034ecc..8ed5d3c9820af42645c27d1cc249c97f768a2af7 100644 GIT binary patch literal 16997 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

Rsgl~*WA@{i%yHkt2!XU{tTbZ-K!>Bqit^ZrDg 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 diff --git a/matlab/uniaxial_3_disturbances.m b/matlab/uniaxial_3_disturbances.m index 8b29b99..69285a8 100644 --- a/matlab/uniaxial_3_disturbances.m +++ b/matlab/uniaxial_3_disturbances.m @@ -65,11 +65,12 @@ load('meas_spindle_on.mat', 't', 'vg', 'vh'); spindle_off = load('meas_spindle_off.mat', 't', 'vg', 'vh'); % No Rotation % Compute Power Spectral Density of the relative velocity between granite and hexapod during spindle rotation -Fs = 1/(t(2)-t(1)); % Sampling Frequency [Hz] -win = hanning(ceil(2*Fs)); % Hanning window +Ts = t(2)-t(1); % Sampling Time [s] +Nfft = floor(2/Ts); +win = hanning(Nfft); -[psd_vft, f] = pwelch(vh-vg, win, [], [], Fs); % [(m/s)^2/Hz] -[psd_off, ~] = pwelch(spindle_off.vh-spindle_off.vg, win, [], [], Fs); % [(m/s)^2/Hz] +[psd_vft, f] = pwelch(vh-vg, win, Noverlap, Nfft, 1/Ts); % [(m/s)^2/Hz] +[psd_off, ~] = pwelch(spindle_off.vh-spindle_off.vg, win, Noverlap, Nfft, 1/Ts); % [(m/s)^2/Hz] % Disable the Nano-Hexpod for now model_config = struct(); diff --git a/matlab/uniaxial_4_dynamic_noise_budget.m b/matlab/uniaxial_4_dynamic_noise_budget.m index 1eb9287..3baf19f 100644 --- a/matlab/uniaxial_4_dynamic_noise_budget.m +++ b/matlab/uniaxial_4_dynamic_noise_budget.m @@ -56,7 +56,7 @@ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); ylabel('Amplitude $d/x_{f}$ [m/m]'); xlabel('Frequency [Hz]'); xticks([1e0, 1e1, 1e2]); leg = legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 1); -leg.ItemTokenSize(1) = 15 +leg.ItemTokenSize(1) = 15; xlim([1, 500]); %% Cumulative Amplitude Spectrum of the relative motion d, due to both the floor motion and the stage vibrations @@ -72,7 +72,7 @@ hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); ylabel('CAS [m]'); xlabel('Frequency [Hz]'); leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 2); -leg.ItemTokenSize(1) = 15 +leg.ItemTokenSize(1) = 15; xlim([1, 500]); ylim([1e-12, 3e-6]) @@ -104,7 +104,7 @@ hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); ylabel('CAS [m]'); xlabel('Frequency [Hz]'); leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1); -leg.ItemTokenSize(1) = 15 +leg.ItemTokenSize(1) = 15; xlim([1, 500]); ylim([1e-12, 3e-6]) diff --git a/matlab/uniaxial_5_active_damping.m b/matlab/uniaxial_5_active_damping.m index 3f58d84..df6a950 100644 --- a/matlab/uniaxial_5_active_damping.m +++ b/matlab/uniaxial_5_active_damping.m @@ -221,19 +221,25 @@ G_dvf_pz_heavy = feedback(G_pz_heavy, K_dvf_pz, 'name', +1); %% Verify Stability % IFF -isstable(G_iff_vc_light) && isstable(G_iff_vc_mid) && isstable(G_iff_vc_heavy) && ... -isstable(G_iff_md_light) && isstable(G_iff_md_mid) && isstable(G_iff_md_heavy) && ... -isstable(G_iff_pz_light) && isstable(G_iff_pz_mid) && isstable(G_iff_pz_heavy) +if not(isstable(G_iff_vc_light) && isstable(G_iff_vc_mid) && isstable(G_iff_vc_heavy) && ... + isstable(G_iff_md_light) && isstable(G_iff_md_mid) && isstable(G_iff_md_heavy) && ... + isstable(G_iff_pz_light) && isstable(G_iff_pz_mid) && isstable(G_iff_pz_heavy)) + warning("One of the damped plant with decentralized IFF is not stable."); +end % RDC -isstable(G_rdc_vc_light) && isstable(G_rdc_vc_mid) && isstable(G_rdc_vc_heavy) && ... -isstable(G_rdc_md_light) && isstable(G_rdc_md_mid) && isstable(G_rdc_md_heavy) && ... -isstable(G_rdc_pz_light) && isstable(G_rdc_pz_mid) && isstable(G_rdc_pz_heavy) +if not(isstable(G_rdc_vc_light) && isstable(G_rdc_vc_mid) && isstable(G_rdc_vc_heavy) && ... + isstable(G_rdc_md_light) && isstable(G_rdc_md_mid) && isstable(G_rdc_md_heavy) && ... + isstable(G_rdc_pz_light) && isstable(G_rdc_pz_mid) && isstable(G_rdc_pz_heavy)) + warning("One of the damped plant with decentralized RDC is not stable."); +end % DVF -isstable(G_dvf_vc_light) && isstable(G_dvf_vc_mid) && isstable(G_dvf_vc_heavy) && ... -isstable(G_dvf_md_light) && isstable(G_dvf_md_mid) && isstable(G_dvf_md_heavy) && ... -isstable(G_dvf_pz_light) && isstable(G_dvf_pz_mid) && isstable(G_dvf_pz_heavy) +if not(isstable(G_dvf_vc_light) && isstable(G_dvf_vc_mid) && isstable(G_dvf_vc_heavy) && ... + isstable(G_dvf_md_light) && isstable(G_dvf_md_mid) && isstable(G_dvf_md_heavy) && ... + isstable(G_dvf_pz_light) && isstable(G_dvf_pz_mid) && isstable(G_dvf_pz_heavy)) + warning("One of the damped plant with decentralized DVF is not stable."); +end %% Save Damped Plants save('./mat/uniaxial_damped_plants.mat', 'G_iff_vc_light', 'G_iff_md_light', 'G_iff_pz_light', ... diff --git a/matlab/uniaxial_6_hac_lac.m b/matlab/uniaxial_6_hac_lac.m index 5b19292..be4de37 100644 --- a/matlab/uniaxial_6_hac_lac.m +++ b/matlab/uniaxial_6_hac_lac.m @@ -258,7 +258,7 @@ hold off; set(gca, 'XScale', 'lin'); set(gca, 'YScale', 'lin'); xlabel('Real'); ylabel('Imag'); leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1); -leg.ItemTokenSize(1) = 15 +leg.ItemTokenSize(1) = 15; xlim([-3.8, 0.2]); ylim([-2, 2]); axis square; @@ -279,7 +279,7 @@ hold off; set(gca, 'XScale', 'lin'); set(gca, 'YScale', 'lin'); xlabel('Real'); ylabel('Imag'); leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1); -leg.ItemTokenSize(1) = 15 +leg.ItemTokenSize(1) = 15; xlim([-3.8, 0.2]); ylim([-2, 2]); axis square; @@ -300,7 +300,7 @@ hold off; set(gca, 'XScale', 'lin'); set(gca, 'YScale', 'lin'); xlabel('Real'); ylabel('Imag'); leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1); -leg.ItemTokenSize(1) = 15 +leg.ItemTokenSize(1) = 15; xlim([-3.8, 0.2]); ylim([-2, 2]); axis square; @@ -319,7 +319,7 @@ ylabel('Loop Gain'); set(gca, 'XTickLabel',[]); ylim([1e-3, 1e3]); yticks([1e-2, 1, 1e2]) leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1); -leg.ItemTokenSize(1) = 15 +leg.ItemTokenSize(1) = 15; ax2 = nexttile; hold on; @@ -413,11 +413,17 @@ G_hac_iff_pz_mid = feedback(G_iff_pz_mid , K_hac_pz, 'name', -1); G_hac_iff_pz_heavy = feedback(G_iff_pz_heavy, K_hac_pz, 'name', -1); %% Verify Stability -isstable(G_hac_iff_vc_light) && isstable(G_hac_iff_vc_mid) && isstable(G_hac_iff_vc_heavy) +if not(isstable(G_hac_iff_vc_light) && isstable(G_hac_iff_vc_mid) && isstable(G_hac_iff_vc_heavy)) + warning("One of the damped plant with VC and decentralized IFF is not stable."); +end -isstable(G_hac_iff_md_light) && isstable(G_hac_iff_md_mid) && isstable(G_hac_iff_md_heavy) +if not(isstable(G_hac_iff_md_light) && isstable(G_hac_iff_md_mid) && isstable(G_hac_iff_md_heavy)) + warning("One of the damped plant with MD and decentralized IFF is not stable."); +end -isstable(G_hac_iff_pz_light) && isstable(G_hac_iff_pz_mid) && isstable(G_hac_iff_pz_heavy) +if not(isstable(G_hac_iff_pz_light) && isstable(G_hac_iff_pz_mid) && isstable(G_hac_iff_pz_heavy)) + warning("One of the damped plant with PZ and decentralized IFF is not stable."); +end %% Change of sensitivity to disturbances with LAC and with HAC-LAC figure; diff --git a/matlab/uniaxial_8_payload_dynamics.m b/matlab/uniaxial_8_payload_dynamics.m index 9bc3708..8fd8bb5 100644 --- a/matlab/uniaxial_8_payload_dynamics.m +++ b/matlab/uniaxial_8_payload_dynamics.m @@ -324,18 +324,18 @@ G_iff_vc_light_rigid = feedback(G_vc_light_rigid, K_iff_vc, 'name', +1); G_iff_vc_light_soft = feedback(G_vc_light_soft , K_iff_vc, 'name', +1); G_iff_vc_light_stiff = feedback(G_vc_light_stiff, K_iff_vc, 'name', +1); -isstable(G_iff_vc_light_rigid) -isstable(G_iff_vc_light_soft) -isstable(G_iff_vc_light_stiff) +if not(isstable(G_iff_vc_light_rigid) && isstable(G_iff_vc_light_soft) &&isstable(G_iff_vc_light_stiff)) + warning("One of the damped plant with VC and decentralized IFF is not stable."); +end % Stiff Nano-Hexapod G_iff_pz_light_rigid = feedback(G_pz_light_rigid, K_iff_pz, 'name', +1); G_iff_pz_light_soft = feedback(G_pz_light_soft , K_iff_pz, 'name', +1); G_iff_pz_light_stiff = feedback(G_pz_light_stiff, K_iff_pz, 'name', +1); -isstable(G_iff_pz_light_rigid) -isstable(G_iff_pz_light_soft) -isstable(G_iff_pz_light_stiff) +if not(isstable(G_iff_pz_light_rigid) && isstable(G_iff_pz_light_soft) && isstable(G_iff_pz_light_stiff)) + warning("One of the damped plant with PZ and decentralized IFF is not stable."); +end %% Compute closed-loop plants and verify stability % Soft Nano-Hexapod @@ -343,18 +343,18 @@ G_hac_iff_vc_light_rigid = feedback(G_iff_vc_light_rigid, K_hac_vc, 'name', -1); G_hac_iff_vc_light_soft = feedback(G_iff_vc_light_soft , K_hac_vc, 'name', -1); G_hac_iff_vc_light_stiff = feedback(G_iff_vc_light_stiff, K_hac_vc, 'name', -1); -isstable(G_hac_iff_vc_light_rigid) -isstable(G_hac_iff_vc_light_soft) -isstable(G_hac_iff_vc_light_stiff) +if not(isstable(G_hac_iff_vc_light_rigid) && isstable(G_hac_iff_vc_light_soft) && isstable(G_hac_iff_vc_light_stiff)) + warning("One of the damped plant with VC and decentralized IFF is not stable."); +end % Stiff Nano-Hexapod G_hac_iff_pz_light_rigid = feedback(G_iff_pz_light_rigid, K_hac_pz, 'name', -1); G_hac_iff_pz_light_soft = feedback(G_iff_pz_light_soft , K_hac_pz, 'name', -1); G_hac_iff_pz_light_stiff = feedback(G_iff_pz_light_stiff, K_hac_pz, 'name', -1); -isstable(G_hac_iff_pz_light_rigid) -isstable(G_hac_iff_pz_light_soft) -isstable(G_hac_iff_pz_light_stiff) +if not(isstable(G_hac_iff_pz_light_rigid) && isstable(G_hac_iff_pz_light_soft) && isstable(G_hac_iff_pz_light_stiff)) + warning("One of the damped plant with PZ and decentralized IFF is not stable."); +end %% Cumulative Amplitude Spectrum of d - Effect of Sample's flexibility figure; diff --git a/nass-uniaxial-model.org b/nass-uniaxial-model.org index ecfbd0c..ecc6649 100644 --- a/nass-uniaxial-model.org +++ b/nass-uniaxial-model.org @@ -1388,7 +1388,7 @@ This model of the geophone was taken from [[cite:&collette12_review]]. The gain of the voltage amplifier is $V^{\prime}_{x_f}/V_{x_f} = g_0 = 1000$. \begin{equation}\label{eq:uniaxial_geophone_tf} -G_{geo}(s) = \frac{V_{x_f}}{x_f}(s) = T_{g} \cdot s \cdot \frac{s^2}{s^2 + 2 \xi \omega_0 s + \omega_0^2} \quad \left[ V/m \right] + G_{geo}(s) = \frac{V_{x_f}}{x_f}(s) = T_{g} \cdot s \cdot \frac{s^2}{s^2 + 2 \xi \omega_0 s + \omega_0^2} \quad \left[ V/m \right] \end{equation} #+begin_src latex :file uniaxial_geophone_meas_chain.pdf @@ -1448,7 +1448,7 @@ The amplitude spectral density of the floor motion $\Gamma_{x_f}$ can be compute The estimated amplitude spectral density $\Gamma_{x_f}$ of the floor motion $x_f$ is shown in Figure ref:fig:uniaxial_asd_floor_motion_id31. \begin{equation}\label{eq:uniaxial_asd_floor_motion} -\Gamma_{x_f}(\omega) = \frac{\Gamma_{\hat{V}_{x_f}}(\omega)}{|G_{geo}(j\omega)| \cdot g_0} \quad \left[ m/\sqrt{\text{Hz}} \right] + \Gamma_{x_f}(\omega) = \frac{\Gamma_{\hat{V}_{x_f}}(\omega)}{|G_{geo}(j\omega)| \cdot g_0} \quad \left[ m/\sqrt{\text{Hz}} \right] \end{equation} #+begin_src matlab :exports none :results none @@ -1500,11 +1500,12 @@ load('meas_spindle_on.mat', 't', 'vg', 'vh'); spindle_off = load('meas_spindle_off.mat', 't', 'vg', 'vh'); % No Rotation % Compute Power Spectral Density of the relative velocity between granite and hexapod during spindle rotation -Fs = 1/(t(2)-t(1)); % Sampling Frequency [Hz] -win = hanning(ceil(2*Fs)); % Hanning window +Ts = t(2)-t(1); % Sampling Time [s] +Nfft = floor(2/Ts); +win = hanning(Nfft); -[psd_vft, f] = pwelch(vh-vg, win, [], [], Fs); % [(m/s)^2/Hz] -[psd_off, ~] = pwelch(spindle_off.vh-spindle_off.vg, win, [], [], Fs); % [(m/s)^2/Hz] +[psd_vft, f] = pwelch(vh-vg, win, Noverlap, Nfft, 1/Ts); % [(m/s)^2/Hz] +[psd_off, ~] = pwelch(spindle_off.vh-spindle_off.vg, win, Noverlap, Nfft, 1/Ts); % [(m/s)^2/Hz] % Disable the Nano-Hexpod for now model_config = struct(); @@ -1696,7 +1697,7 @@ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); ylabel('Amplitude $d/x_{f}$ [m/m]'); xlabel('Frequency [Hz]'); xticks([1e0, 1e1, 1e2]); leg = legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 1); -leg.ItemTokenSize(1) = 15 +leg.ItemTokenSize(1) = 15; xlim([1, 500]); #+end_src @@ -1751,7 +1752,7 @@ hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); ylabel('CAS [m]'); xlabel('Frequency [Hz]'); leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 2); -leg.ItemTokenSize(1) = 15 +leg.ItemTokenSize(1) = 15; xlim([1, 500]); ylim([1e-12, 3e-6]) @@ -1789,7 +1790,7 @@ hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); ylabel('CAS [m]'); xlabel('Frequency [Hz]'); leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1); -leg.ItemTokenSize(1) = 15 +leg.ItemTokenSize(1) = 15; xlim([1, 500]); ylim([1e-12, 3e-6]) @@ -2960,19 +2961,25 @@ G_dvf_pz_heavy = feedback(G_pz_heavy, K_dvf_pz, 'name', +1); #+begin_src matlab %% Verify Stability % IFF -isstable(G_iff_vc_light) && isstable(G_iff_vc_mid) && isstable(G_iff_vc_heavy) && ... -isstable(G_iff_md_light) && isstable(G_iff_md_mid) && isstable(G_iff_md_heavy) && ... -isstable(G_iff_pz_light) && isstable(G_iff_pz_mid) && isstable(G_iff_pz_heavy) +if not(isstable(G_iff_vc_light) && isstable(G_iff_vc_mid) && isstable(G_iff_vc_heavy) && ... + isstable(G_iff_md_light) && isstable(G_iff_md_mid) && isstable(G_iff_md_heavy) && ... + isstable(G_iff_pz_light) && isstable(G_iff_pz_mid) && isstable(G_iff_pz_heavy)) + warning("One of the damped plant with decentralized IFF is not stable."); +end % RDC -isstable(G_rdc_vc_light) && isstable(G_rdc_vc_mid) && isstable(G_rdc_vc_heavy) && ... -isstable(G_rdc_md_light) && isstable(G_rdc_md_mid) && isstable(G_rdc_md_heavy) && ... -isstable(G_rdc_pz_light) && isstable(G_rdc_pz_mid) && isstable(G_rdc_pz_heavy) +if not(isstable(G_rdc_vc_light) && isstable(G_rdc_vc_mid) && isstable(G_rdc_vc_heavy) && ... + isstable(G_rdc_md_light) && isstable(G_rdc_md_mid) && isstable(G_rdc_md_heavy) && ... + isstable(G_rdc_pz_light) && isstable(G_rdc_pz_mid) && isstable(G_rdc_pz_heavy)) + warning("One of the damped plant with decentralized RDC is not stable."); +end % DVF -isstable(G_dvf_vc_light) && isstable(G_dvf_vc_mid) && isstable(G_dvf_vc_heavy) && ... -isstable(G_dvf_md_light) && isstable(G_dvf_md_mid) && isstable(G_dvf_md_heavy) && ... -isstable(G_dvf_pz_light) && isstable(G_dvf_pz_mid) && isstable(G_dvf_pz_heavy) +if not(isstable(G_dvf_vc_light) && isstable(G_dvf_vc_mid) && isstable(G_dvf_vc_heavy) && ... + isstable(G_dvf_md_light) && isstable(G_dvf_md_mid) && isstable(G_dvf_md_heavy) && ... + isstable(G_dvf_pz_light) && isstable(G_dvf_pz_mid) && isstable(G_dvf_pz_heavy)) + warning("One of the damped plant with decentralized DVF is not stable."); +end #+end_src #+begin_src matlab :exports none :tangle no @@ -4253,7 +4260,7 @@ hold off; set(gca, 'XScale', 'lin'); set(gca, 'YScale', 'lin'); xlabel('Real'); ylabel('Imag'); leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1); -leg.ItemTokenSize(1) = 15 +leg.ItemTokenSize(1) = 15; xlim([-3.8, 0.2]); ylim([-2, 2]); axis square; #+end_src @@ -4280,7 +4287,7 @@ hold off; set(gca, 'XScale', 'lin'); set(gca, 'YScale', 'lin'); xlabel('Real'); ylabel('Imag'); leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1); -leg.ItemTokenSize(1) = 15 +leg.ItemTokenSize(1) = 15; xlim([-3.8, 0.2]); ylim([-2, 2]); axis square; #+end_src @@ -4307,7 +4314,7 @@ hold off; set(gca, 'XScale', 'lin'); set(gca, 'YScale', 'lin'); xlabel('Real'); ylabel('Imag'); leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1); -leg.ItemTokenSize(1) = 15 +leg.ItemTokenSize(1) = 15; xlim([-3.8, 0.2]); ylim([-2, 2]); axis square; #+end_src @@ -4356,7 +4363,7 @@ ylabel('Loop Gain'); set(gca, 'XTickLabel',[]); ylim([1e-3, 1e3]); yticks([1e-2, 1, 1e2]) leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1); -leg.ItemTokenSize(1) = 15 +leg.ItemTokenSize(1) = 15; ax2 = nexttile; hold on; @@ -4501,11 +4508,17 @@ G_hac_iff_pz_heavy = feedback(G_iff_pz_heavy, K_hac_pz, 'name', -1); #+begin_src matlab :exports none %% Verify Stability -isstable(G_hac_iff_vc_light) && isstable(G_hac_iff_vc_mid) && isstable(G_hac_iff_vc_heavy) +if not(isstable(G_hac_iff_vc_light) && isstable(G_hac_iff_vc_mid) && isstable(G_hac_iff_vc_heavy)) + warning("One of the damped plant with VC and decentralized IFF is not stable."); +end -isstable(G_hac_iff_md_light) && isstable(G_hac_iff_md_mid) && isstable(G_hac_iff_md_heavy) +if not(isstable(G_hac_iff_md_light) && isstable(G_hac_iff_md_mid) && isstable(G_hac_iff_md_heavy)) + warning("One of the damped plant with MD and decentralized IFF is not stable."); +end -isstable(G_hac_iff_pz_light) && isstable(G_hac_iff_pz_mid) && isstable(G_hac_iff_pz_heavy) +if not(isstable(G_hac_iff_pz_light) && isstable(G_hac_iff_pz_mid) && isstable(G_hac_iff_pz_heavy)) + warning("One of the damped plant with PZ and decentralized IFF is not stable."); +end #+end_src #+begin_src matlab :exports none :results none @@ -6008,18 +6021,18 @@ G_iff_vc_light_rigid = feedback(G_vc_light_rigid, K_iff_vc, 'name', +1); G_iff_vc_light_soft = feedback(G_vc_light_soft , K_iff_vc, 'name', +1); G_iff_vc_light_stiff = feedback(G_vc_light_stiff, K_iff_vc, 'name', +1); -isstable(G_iff_vc_light_rigid) -isstable(G_iff_vc_light_soft) -isstable(G_iff_vc_light_stiff) +if not(isstable(G_iff_vc_light_rigid) && isstable(G_iff_vc_light_soft) &&isstable(G_iff_vc_light_stiff)) + warning("One of the damped plant with VC and decentralized IFF is not stable."); +end % Stiff Nano-Hexapod G_iff_pz_light_rigid = feedback(G_pz_light_rigid, K_iff_pz, 'name', +1); G_iff_pz_light_soft = feedback(G_pz_light_soft , K_iff_pz, 'name', +1); G_iff_pz_light_stiff = feedback(G_pz_light_stiff, K_iff_pz, 'name', +1); -isstable(G_iff_pz_light_rigid) -isstable(G_iff_pz_light_soft) -isstable(G_iff_pz_light_stiff) +if not(isstable(G_iff_pz_light_rigid) && isstable(G_iff_pz_light_soft) && isstable(G_iff_pz_light_stiff)) + warning("One of the damped plant with PZ and decentralized IFF is not stable."); +end #+end_src #+begin_src matlab @@ -6029,18 +6042,18 @@ G_hac_iff_vc_light_rigid = feedback(G_iff_vc_light_rigid, K_hac_vc, 'name', -1); G_hac_iff_vc_light_soft = feedback(G_iff_vc_light_soft , K_hac_vc, 'name', -1); G_hac_iff_vc_light_stiff = feedback(G_iff_vc_light_stiff, K_hac_vc, 'name', -1); -isstable(G_hac_iff_vc_light_rigid) -isstable(G_hac_iff_vc_light_soft) -isstable(G_hac_iff_vc_light_stiff) +if not(isstable(G_hac_iff_vc_light_rigid) && isstable(G_hac_iff_vc_light_soft) && isstable(G_hac_iff_vc_light_stiff)) + warning("One of the damped plant with VC and decentralized IFF is not stable."); +end % Stiff Nano-Hexapod G_hac_iff_pz_light_rigid = feedback(G_iff_pz_light_rigid, K_hac_pz, 'name', -1); G_hac_iff_pz_light_soft = feedback(G_iff_pz_light_soft , K_hac_pz, 'name', -1); G_hac_iff_pz_light_stiff = feedback(G_iff_pz_light_stiff, K_hac_pz, 'name', -1); -isstable(G_hac_iff_pz_light_rigid) -isstable(G_hac_iff_pz_light_soft) -isstable(G_hac_iff_pz_light_stiff) +if not(isstable(G_hac_iff_pz_light_rigid) && isstable(G_hac_iff_pz_light_soft) && isstable(G_hac_iff_pz_light_stiff)) + warning("One of the damped plant with PZ and decentralized IFF is not stable."); +end #+end_src #+begin_src matlab :exports none :results none