Programmation du calcul de la solution numérique de l équation de WINTER. Bernard GAGEY [ bernard.gagey@gmail.com ] Annexe 5 Ce programme étant quasi linéaire ne nécessite pas de présentation sous forme d organigramme : on se contentera d une explication linéaire commentée. Vu la facilité offerte pour la manipulation des vecteurs et des matrices, l illustration programmée est écrite en OCTAVE équivalent MATLAB, dont seront décrites au fil du programme quelques particularités pour les lecteurs ignorants ce langage. Ce programme fait appel à un élément de bibliothèque numérique : «inversion de matrice» qui doit être de bonne précision (par exemple: l inversion de matrice d EXCEL s avère insuffisante) ; un test est proposé pour vérifier cette précision. Appel et déclaration Profitant de la possibilité dans OCTAVE d avoir un nombre variable de résultats et de paramètres, une seule procédure permet, selon son utilisation, de : o Faire le calcul en donnant plus ou moins d informations morphologiques sur l individu o Obtenir o Soit uniquement la courbe g la plus probable o Soit aussi les courbes g correspondants aux limites possibles de variations du paramètre k 2 de l équation de Winter L appel se fait sous la forme : [g,coeff,g_min,coeff_min,g_max,coeff_max]=winter(posi,freqech,epai,taille,h_masse,coeff_morpho); Correspondant à la déclaration : function [g,coeff,g_min,coeff_min,g_max,coeff_max]=winter(posi,freqech,epai,taille,h_masse,coeff_morpho); Winter est le nom de la fonction suivi de ses paramètres posi : le vecteurs des positions relevées du centre de pression, exprimées en général- en mm freqech : la fréquence d échantillonnage qui DOIT être un entier epai : épaisseur, exprimé en mètre, entre le plan de la plateforme et le plan des capteurs taille : (facultatif) La taille de l individu exprimé en mètre
H_masse : (facultatif) la hauteur relative de son centre de masse (hauteur relative=hauteur réelle/hauteur individu) coeff_morpho : le coefficient morphologique. Les résultats fournis sont : Remarques : g : vecteur des positions calculées du centre de gravité coeff: (facultative) le coefficient k 2 de l équation de WINTER g_min, coeff_min, g_max, coeff_max: (facultatifs) les positions calculées du centre de gravité et les coefficients k 2 de l équation de WINTER pour les valeurs minimales et maximales du coefficient k 2, en fonction des paramètres d entrée. Les vecteurs sont ici des vecteurs (n, 1 ou 2), c'est-à-dire des vecteurs «n lignes, 1 ou 2 colonnes» 1. Les vecteurs de sorties sont dans la même échelle que le vecteur posi d entrée. 2. Ce programme est identique pour : o Soit des vecteurs posi correspondants aux coordonnées x du centre de pression, renvoyant les coordonnées x du centre de masse o Idem pour les coordonnées y o Soit des vecteurs posi correspondants aux coordonnées x+i*y du centre de pression, renvoyant les coordonnées x+i*y du centre de masse (travail en nombre complexe) o Soit des vecteurs posi (N,2) correspondants aux coordonnées x et y du centre de pression, renvoyant les coordonnées x et y du centre de masse. 3. epai : ce correctif correspond au fait que les capteurs se trouvent en général sous la plateforme ; il correspond en général au minimum à l épaisseur de la plaque constituant la plateforme. Si on met la valeur 0, il sera considéré comme égal à 5mm ± 5mm. Si cette valeur est vraiment nulle, mettre une valeur très faible, 0.00001 par exemple. Déclaration de constantes tcoup=3;% Nombre de secondes retirées au début et à la fin après calcul nx=5;% Choix de matrice restreinte en nombre de secondes gravite=9.8066;% Valeur de l'accélération de la pesanteur h_standard=1.71;% Hauteur standard morpho_stand=0.05084746714575;% Coefficient morphologique standard H_gravite_stand=0.5591;% Rapport hauteur centre de gravité / hauteur totale err_morp_stand=.15;% Marge d'erreur sur le coeff morpho standard
err_morp_param=0.01;% Marge d'erreur sur le coefficient morpho s'il est passé en paramètres err_hgravite_stand=.05;% Marge d'erreur sur la hauteur du centre de gravité standard err_hgravite_param=.01;% Marge d'erreur sur la hauteur du centre de gravité paramètre err_hstandard=.12;% Marge d'erreur sur la hauteur standard err_h=0.006;% Marge d'erreur sur la hauteur en paramètre ep_standard=0.005;% Épaisseur standard err_epstand=0.005;% Marge d'erreur sur l'épaisseur standard err_ep_para=.001;% Marge d'erreur de 1mm sur l'épaisseur poassé en paramètre malleole=0.045;% Hauteur relative de la malléole Toutes ces constantes ont ici des valeurs plus ou moins discutables : tcoup : La méthode de calcul est imprécise aux bornes de l intervalle, on retirera donc à la fin du programme tcoup secondes nx : pour être plus rapide, le programme ne fait pas le calcul sur tout l intervalle mais sur des intervalles 2*nx, décalé de nx. Si nx est supérieur à tcoup, le point central est pratiquement exact, et donc pour l intervalle suivant, les premiers nx points sont pratiquement exacts. Pour cela, il est raisonnable de choisir nx supérieur à tcoup. gravite valeur en m/s 2 de la force de gravité. Peut varier selon le lieu géographique Pour les valeurs morphologiques qui suivent (hauteur, hauteur du centre de masse, coefficient morphologique), il existe 3 constantes La valeur dite standard si ce coefficient n est pas passé en paramètre L estimation de l erreur potentielle si on prend ce coefficient standard L estimation de l erreur potentielle si le coefficient est passé en paramètre. De même l épaisseur standard de la plateforme est donnée si ce paramètre n est pas donné, avec une erreur résiduelle s il est donné malléole : hauteur relative de l axe du pendule simple, situé au niveau de la malléole Calcul du coefficient k 2 La première partie consiste à récupérer les coefficients, selon qu ils ont été, ou non, passés en paramètres, et chacun avec une indication d erreur potentielle. (Remarque sur OCTAVE : la fonction nargin, pour n_arguments_in, donne le nombre d arguments d entrée ; de même pour nargout avec le nombre de résultats attendus) % Cas de epai obligatoire, mais égal à 0 si non mesuré if epai==0 ; ep=ep_standard;er_ep=err_epstand; ;
ep=epai;er_ep=err_ep_para; if nargin<6 ;% Pas de coefficient morpho_stand morph=morpho_stand;err_morph=err_morp_stand; morph=coeff_morpho;err_morph=err_morp_param; if nargin<5;% Pas de hauteur du centre de gravité hgrav=h_gravite_stand;errhgrav=err_hgravite_stand; hgrav=hauteur_g;errhgrav=err_hgravite_param; if nargin<4;% Pas de hauteur haut=h_standard;err_haut=err_hstandard; haut=taille;err_haut=err_h; La deuxième partie consiste à appliquer la formule de calcul : k! = T a HG + 0.051 HG 0.05 + epai a Et ceci trois fois, avec les valeurs nominales, et en faisant varier celles-ci pour avoir les valeurs minimales et maximales en fonction des marges d erreur. coeff=(ep+haut*(hgrav+(morph/(hgrav- malleole))))/gravite; coeff_min= (ep-er_ep+haut*(1-err_haut)*(hgrav*(1-err_hgrav) + (morph*(1-err_morph) /(hgrav*(1+err_hgrav)- malleole))))/gravite; coeff_max= (ep+er_ep+haut*(1+err_haut)*(hgrav*(1+err_hgrav)+ (morph*(1+err_morph) /(hgrav*(1-err_hgrav)- malleole))))/gravite; Calcul de la matrice de base Comme dit plus haut, à propos de la constante nx, on fait le calcul dans un intervalle 2*nx où on exprime la matrice M telle que P=M*G, dont on calculera l inverse permettant d obtenir G=(M -1 )*P. La matrice M est une matrice dont seuls ne sont pas nuls les éléments De la diagonale, tous égaux à 1+2*(1/k2.5 )*(frequence 2 ) De la sous-diagonale et de la sus-diagonale tous égaux à: 1/k2.5 )*(frequence 2 ) (Remarques sur OCTAVE : eye(n,n) est la matrice unité de dimension n,n, inv(matrice) donne l inverse de la matrice) Nbm=length(posi); %nombre de points de mesures = longueur du vecteur paramètre Posi Nbma=nx*2*freqech; % dimmension de la matrice %ne pas découper si l'intervalle de mesure est proche de l'intervalle de découpe if Nbm<Nbma+2*freqech; Nbma=Nbm;
% calcul des coefficients de la matrice co1=-(freqech^2)*coeff; co2=-2*co1+1; %creation de la matrice avec sa bonne diagonale ma=co2*eye(nbma,nbma); %remplissage des sous et sur-diagonale for k=2:1:nbma-1; ma(k,k-1)=co1;ma(k,k+1)=co1; endfor ma(1,2)=co1;ma(nbma,nbma-1)=co1; na=inv(ma); (Note : il est judicieux, à ce niveau de faire un test sur A=maximum(valeur absolue(ma*na-i)) où I est la matrice identité ; Théoriquement on devrait avoir A=0; Une bonne précision devrait donner A inférieur à 10-10 : Pour OCTAVE, on trouve A de l ordre de 10-14 ) La solution qu on trouve par G=(M -1 )*P est celle dont le point précédent et suivant de l intervalle serait 0. Pour trouver la solution dont le point précédent serait a, il faut rajouter un vecteur a*correc que l on calcule au préalable : (Note OCTAVE : zeros(n,p) rend une matrice (n,p) avec tous les éléments nuls) correc=zeros(nbma,1); kacc=(1/coeffaccel)^.5; for jj=1:1:nbma; correc(jj)=e^(-kacc*jj/freqech); endfor; Dernière préparation: centrer la courbe P sur sa moyenne : (Remarques Octave : mean(matrice) renvoie la moyenne des coefficients de la matrice additionner un nombre à une matrice additionne ce nombre à tous les éléments de la matrice) meanposi=mean(posi); posi=posi-meanposi; Calcul de la courbe G Le calcul de G se fait donc par une succession de calculs partiels Sur un intervalle de longueur nbma, En décalant cet intervalle de nx*freqch ( en général égal à nbma/2) En considérant que le point G juste avant l intervalle vient du calcul précédent, et en faisant la correction en conséquence
Bien sûr cette boucle pose des problèmes aux limites Au départ le point précédent à la valeur 0 (c'est-à-dire la moyenne de P) A la fin, le dernier intervalle est recalé sur la fin de l intervalle de mesure de P %initialisation g=zeros(nbm,1); prec=0;deb1=1; %boucle générale while deb1+nbma-1<=nbm g(deb1:deb1+nbma-1)=na*posi(deb1:deb1+nbma-1)+prec*correc; prec=g(deb1+nx*freqech-1); deb1=deb1+nx*freqech; endwhile %traitement dernier intervalle if Nbm==Nbma ;prec=0;;prec=g(nbm-nbma); g(nbm-nbma+1:nbm)=na*posi(nbm-nbma+1:nbm)+prec*correc; Et on termine en revenant sur le centrage fait sur la moyenne de P, et en retirant aux extrémités les tcoup secondes : g=meanposi+g(tcoup*freqech+1:nbm- tcoup*freqech); En fait on doit, en fonction des sorties demandées, calculer la courbe G aussi pour coeff_min et coeff_max ; C est pourquoi les parts 4 et 5 sont mis en sous programme. function[g,coeff,g_min,coeff_min,g_max,coeff_max]=winter(posi,freqech,epai,taille,hauteur_g, coeff_morpho); %Programme de recherche de la courbe G Optimisé en vitesse!!! % parametres d'entrée: % posi la courbe P en vecteur (n,1 ou 2) % freqch la frequence d'echantillonage (de la courbe totale) =nombre d'échantillons par seconde % taille taille de l'individu (facultatif) % hauteur_g Hauteur relative du centre de masse (facultatif) % coeff_morpho Le coefficient morphologique (facultatif) %Valeurs retournées % g la courbe g en vecteur (n,1 ou 2) % coeff le coefficient de l'équation de Winter correspondant % g_min,coeff_min,g_max,coeff_max les mêmes résultat pour les coefficients minimal et maximal de Winter en fonction des paramêtres d'entrée % constantes tcoup=3;%nombre de secondes retirées au début et à la fin après calcul nx=5;% choix de matrice restreinte en nombre de secondes gravite=9.8066;% valeur de l'accélération de la pesanteur h_standard=1.71;%hauteur standard morpho_stand=0.05084746714575;% coefficient morphologique standard H_gravite_stand=0.5591;% rapport hauteur centre de gravité / hauteur totale err_morp_stand=.15;%marge d'erreur sur le coeff morpho standard err_morp_param=0.01;%marge d'erreur sur le coefficient morpho s'il est passé en paramêtrese err_hgravite_stand=.05;% Marge d'erreur sur la hauteur deu centre de gravité standard
err_hgravite_param=.01;% Marge d'erreur sur la hauteur deu centre de gravité paramètre err_hstandard=.12;%marge d'erreur sur la hauteur standard err_h=0.006;% marge d'erreur sur la hauteur en paramètre ep_standard=0.005;%epaisseur standard err_epstand=0.005;% marge d'erreur sur l'épaisseur standard err_ep_para=.001;%marge d'erreur de 1mm sur l'épaisseur poassé en paramètre malleole=0.045;% Hauteur relative de la malléole % Calcul du coefficient k2 % cas de ep obligatoire, mais égal à 0 si non mesuré if epai==0 ; ep=ep_standard;er_ep=err_epstand; ; ep=epai;er_ep=err_ep_para; if nargin<6 ;% pas de coefficient morpho_stand morph=morpho_stand;err_morph=err_morp_stand; morph=coeff_morpho;err_morph=err_morp_param; if nargin<5;%pas de hauteur du centre de gravité hgrav=h_gravite_stand;err_hgrav=err_hgravite_stand; hgrav=hauteur_g;err_hgrav=err_hgravite_param; if nargin<4;%pas de hauteur haut=h_standard;err_haut=err_hstandard; haut=taille;err_haut=err_h; coeff=(ep+haut*(hgrav+(morph/(hgrav- malleole))))/gravite; coeff_min= (ep-er_ep+haut*(1-err_haut)*(hgrav*(1-err_hgrav)+(morph*(1-err_morph)/(hgrav*(1+err_hgrav)- malleole))))/gravite; coeff_max= (ep+er_ep+haut*(1+err_haut)*(hgrav*(1+err_hgrav)+(morph*(1+err_morph)/(hgrav*(1- err_hgrav)- malleole))))/gravite; [g]=sous_winkler(posi,freqech,coeff,nx,tcoup); if nargout>4 ; [g_max]=sous_winkler(posi,freqech,coeff_max,nx,tcoup); if nargout>2 ; [g_min]=sous_winkler(posi,freqech,coeff_min,nx,tcoup); endfunction function [g]=sous_winkler(posi,freqech,coeff,nx,tcoup) % Calcul préliminaires Nbm=length(posi);%nombre de points de mesures = longueur du vecteur paramètre Posi Nbma=nx*2*freqech;% dimmension de la matrice if Nbm<Nbma+2*freqech; %ne pas découper si l'intervalle de mesure est proche de l'intervalle de découpe Nbma=Nbm;
%calcul des coefficients de la matrice co1=-(freqech^2)*coeff; co2=-2*co1+1; %creation de la matrice avec sa bonne diagonale ma=co2*eye(nbma,nbma); %remplissage des sus et sur-diagonale for k=2:1:nbma-1; ma(k,k-1)=co1;ma(k,k+1)=co1; endfor ma(1,2)=co1;ma(nbma,nbma-1)=co1; na=inv(ma); %jjj=max(max(abs(na*ma-eye(nbma))))% test de la précision de calcul correc=zeros(nbma,1); kacc=(1/coeff)^.5; for jj=1:1:nbma; correc(jj)=e^(-kacc*jj/freqech); endfor; %centrer pour que le point (0,0) ne soit pas absurde meanposi=mean(posi); posi=posi-meanposi; % fin des calculs preliminaires %initialisation g=zeros(nbm,1); prec=0;deb1=1; %boucle générale while deb1+nbma-1<=nbm g(deb1:deb1+nbma-1)=na*posi(deb1:deb1+nbma-1)+prec*correc; prec=g(deb1+nx*freqech-1); deb1=deb1+nx*freqech; endwhile %traitement dernier intervalle if Nbm==Nbma ;prec=0;;prec=g(nbm-nbma); g(nbm-nbma+1:nbm)=na*posi(nbm-nbma+1:nbm)+prec*correc; g=meanposi+g(tcoup*freqech+1:nbm-tcoup*freqech); endfunction