Matlab : Réponse fréquentielle de modèles non linéaires

Matlab : Réponse fréquentielle de modèles non linéaires

Il est possible de tracer le diagramme de Bode de systèmes linéaires sous Matlab, ou au moins de tracer après linéarisation sur un point d’équilibre. Mais parfois la linéarisation foire pour des raisons obscures. Que faire quand on désire obtenir avec du code Matlab la réponse fréquentielle aux petites variations pour une estimation future des coefficients de la fonction de transfert ? Attention quand même, la méthode suivante n’est valable que dans le cadre de systèmes déterministes transparents vis à vis de la fréquence où win = wout.

La réponse est simple, on évalue la réponse du système pour une plage fréquentielle en amplitude et en phase. Ici on se base sur un système non linéaire type simulink boîte noire.

Pour un modèle général et non linéaire de ce type :

Doté des paramètres de blocs suivants (attention à bien exporter le temps avec la réponse dans save format) :

On spécifiera en entrée du bloc sinus une amplitude constante et petite pour une estimation de la réponse aux petites variations.

On commence par définir quelques constantes et le vecteur des fréquences. Les variables x_cuting_time correspondent aux durées des régimes transitoires au début et à la fin de la simulation. On doit en effet enlever ces informations de la réponse pour différencier la phase globale de la phase dynamique.

%% Parameters
w_start = 1; % 10^n rad/s
w_stop = 4; % 10^n rad/s
Te = 1000; % Sampling time
sys = 'N:\Matlab\Tesla\tesla.slx';
end_cutting_time=10 % Phase calculator : deleting transient
start_cutting_time=5 % Phase calculator : deleting transient

Ensuite et dans une boucle parcourant le vecteur des fréquences et dans l’ordre :

  • Simulation du modèle au point w
  • Récupération des vecteurs temps (t) et réponse (y)
  • Récupération du gain par max(y) et ajout au vecteur gain
  • Calcul de la phase par passage dans le domaine de Hilbert et découpage et moyenne du vecteur phase dynamique
  • Ajout du point de phase au vecteur phase_mat
sim(sys);
    t=OUT.time;
    y=OUT.signals.values;
 
    gain_abs=[gain_abs,max(y)]; % Calculating gain point & mat
    
    y1_h = hilbert(y);
    y2_h = hilbert(y2);
    phase_rad = angle(y1_h ./ y2_h);
    phase_rad = phase_rad(1:end-(1/Te)*end_cutting_time);
    phase_rad = phase_rad((1/Te)*start_cutting_time:end);
    phase_rad = mean(phase_rad); % Calculating phase point
    
    phase_mat=[phase_mat,phase_rad]; % Adding phase to mat

Note : Ici, le gain est max(y) directement car j’envoie un sinus d’amplitude 1, c’est à adapter suivant l’amplitude de l’entrée. Il est important de bien se renseigner sur la durée du régime transitoire, voici en effet un exemple éloquent où il est important de bien découper la phase dynamique :

On trace ensuite le Bode à partir des informations calculées précédemment :

subplot(2,1,1);
semilogx(w,20*log10(gain_abs)); % Plotting gain
grid;

subplot(2,1,2); 
semilogx(w,rad2deg(phase_mat)); % Plotting phase
grid;

Et on obtient quelque chose de la sorte, que l’on pourra par la suite linéariser via une estimation des coefficients d’une fonction de transfert (cf. tfest)  :

2 réactions au sujet de « Matlab : Réponse fréquentielle de modèles non linéaires »

  1. Franchement pas mal; explications claires, efficaces et faciles à comprendre.
    Peut-être que vous pourriez expliciter d’avantages les fonctions utilisées comme « hilbert(y) »… .

    1. Merci ! Tu es le premier vrai commentaire du site !

      J’ai écrit dans un autre article, mais tu as raison ce n’est pas clair ici : « Passons la définition formelle du domaine de Hilbert, on s’en fout. La seule chose intéressante est que dans cet espace les signaux temporels auxquels on a appliqué une transformée de Hilbert sont devenus des vecteurs de nombres complexes, dont le module est constant et dont la phase change en fonction du signal de départ.« 

Laisser un commentaire