Télécharger identifi.dgibi

Retour à la liste

Numérotation des lignes :

  1. * fichier : identifi.dgibi
  2. ************************************************************************
  3. ************************************************************************
  4. *
  5. * soit le polynome du 3eme degre y=a*x*x*x + b*x*x + c*x + d
  6. *
  7. * on suppose connue la valeur d'une fonction G pour les
  8. * abscisses x= 1, 2, 3, 4 et 5 .On recherche les coeffiecients a b c d
  9. * de la fonction Y (polynome du troisieme degré) qui ajuste au mieux la
  10. * fonction G sur les points connus.
  11.  
  12.  
  13. * poly est une procédure calculant la fonction Y pour des valeurs de
  14. * a b c d données en argument et pour les valeurs expérimentales de x
  15.  
  16. debp poly a*flottant b*flottant c*flottant d*flottant;
  17. x=1 ;
  18. f1=(a*x*x*x) + (x*x*b) + ( c * x ) + d ;
  19. x=2;
  20. f2=(a*x*x*x) + (x*x*b) + ( c * x ) + d ;
  21. x=3;
  22. f3=(a*x*x*x) + (x*x*b) + ( c * x ) + d ;
  23. x=4;
  24. f4=(a*x*x*x) + (x*x*b) + ( c * x ) + d ;
  25. x=5;
  26. f5=(a*x*x*x) + (x*x*b) + ( c * x ) + d ;
  27. ll=prog f1 f2 f3 f4 f5;
  28. finpro ll;
  29.  
  30. * Nous choisissons la base connue de G corerspondant à un polynome du
  31. * 3eme degré avec a=2 b=3 c=4 d=5 . Nous devons donc retrouver ces
  32. * valeurs pour a b c d.
  33. fG = poly 2. 3. 4. 5.;
  34.  
  35. * on cherche par l'opérateur MOCA les valeurs de a b c d
  36. * on suppose un point de départ a=1 b=-1. c=10; d=8.
  37. a=1.;
  38. b=-1.;
  39. c=10.;
  40. d = 8.;
  41. fdep = poly a b c d ;
  42. * calcul de la fonction y pour ces paramètres et pour les abscisses
  43. depa = prog a b c d ;
  44. * calcul des "dérivées partielles" par rapport à : a , b , c , d par
  45. * différence finie
  46. debproc deriv a*flottant b*flottant c*flottant d*flottant fdep*listreel;
  47. deri_a= ((poly (a*1.01) b c d) - fdep)/( a*0.01);
  48. deri_b= ((poly a (b*1.01) c d) - fdep)/ (b*0.01);
  49. deri_c =((poly a b (c*1.01) d) - fdep)/(C*0.01);
  50. deri_d =((poly a b c (d*1.01)) - fdep)/(D*0.01);
  51. finproc deri_a deri_b deri_c deri_d ;
  52.  
  53. deri_a deri_b deri_c deri_d = deriv a b c d fdep;
  54. ss = moca depa fG fdep deri_a deri_b deri_c deri_d ;
  55.  
  56. list ss;
  57. sol = prog 2. 3. 4. 5. ;
  58. er = abs ( ss - sol);
  59. ermax1= maxi er;
  60.  
  61. * remarque : l'opérateur MOCA cherche à minimiser l'écart en moyenne
  62. * quadratique entre la base expérimentale et la fonction F(a,b,c,d),
  63. * supposée linéaire en a b c d. Le polynome Y étant bien linéaire
  64. * en a b c d, il trouve la "bonne" solution.
  65.  
  66.  
  67. *
  68. * envisageons maintenant que la fonction Y soit y= a + bx + cx**d
  69. *
  70. * on peut utiliser la procedure ajuste
  71.  
  72. * parametres lineaires a b c
  73. * parametre non lineaire d
  74. * on peut ecrire la fonction sous la forme:
  75.  
  76. * y = a * f1 + b* f2 + c* f3;
  77. * avec f1= 1 f2 = X f3 = x**d
  78.  
  79. debp fct xtab*table p*listreel;
  80. tab1=table;
  81. tab2=table;
  82. x = xtab . 1;
  83. n=dime x;
  84. * fonction f1
  85. tab1.1 = prog n*1.;
  86. tab1.2 = x;
  87. tab1.3 = x**( extr p 1);
  88. tab2.'F'= tab1;
  89. finproc tab2;
  90. debproc deri xtab*table p*listreel;
  91. tab1=table;
  92. tab2=table;
  93. tabg=table;
  94. tabf=table;
  95. tab=table;
  96. x = xtab . 1;
  97. n=dime x;
  98. * df1/dp1
  99. tab1 . 1=prog n*0.;
  100. * df2/dp1
  101. tab1. 2 = prog n*0.;
  102. * df3/dp1
  103. tab1. 3= ( log x) * (x** ( extr p 1));
  104. tabf . 1 = tab1;
  105. tab. 'F' = tabf;
  106. finproc tab;
  107.  
  108. * fabriquons un cas "experimental" en
  109. * posant a =1 b=-6 c=4 d=3 e et en prenant pour base des abscisses x
  110. sol2= prog 1. -6. 4. 3.;
  111. x = prog 0.1 0.3 0.5 1 2.5 3.6 6. 7.8 9 11; nexp=10;
  112. * on va calculer nos "resultats experimentaux" : fobj
  113. ct= prog nexp*1.;
  114. bx = -6. * X;
  115. cxpd= 4*( X ** 3);
  116. fobj= ct + bx + cxpd;
  117.  
  118. * preparation des données pour appel ajuste
  119. k=1;
  120. L=3;
  121. xtab=table;
  122. xtab. 1= x;
  123. tab1=table;
  124. tab1.'X' = xtab;
  125. tab1. 'F' = fobj;
  126. tab1. 'K'= k;
  127. tab1.'L'= L;
  128. tab1.'PMIN'=prog 0. -12 -20 -2 ;
  129. tab1.'PMAX' = prog 10. 26. 12. 4. ;
  130.  
  131. temps;
  132. p q = ajuste tab1 ;
  133. temps;
  134. mess ' sortie de la procedur ajuste valeur trouvée :';
  135. mess ' a = ' ( extr p 1) ' valeur attendue 1.';
  136. mess ' b = ' ( extr p 2) ' valeur attendue -6.';
  137. mess ' c = ' ( extr p 3) ' valeur attendue 4.';
  138. mess ' d = ' ( extr q 1) ' valeur attendue 3.';
  139. ltrou= p et q;
  140. era= abs (ltrou - sol2);
  141. ermax2= maxi era;
  142. *
  143. * on peut aussi tenter de resoudre le probleme à l'aide de MOCA
  144. * Comme la fonction n'est pas linéaire en fonction du parametre d
  145. * la solution fournie ne sera pas la bonne. on utilise le résultat
  146. * trouvé pour nous donner une direction de descente le long de laquelle
  147. * on cherche un minimun de la "distance" entre Fcalculée et Fobjectif
  148. * une approche par itération est necessaire
  149. *
  150.  
  151. para = prog 2. 2. 2. 2.;
  152.  
  153. * procedure pour calculer la fonction
  154. debproc fcal para*listreel x*listreel;
  155. n = dime x;
  156. fa= prog n*( extr para 1) ;
  157. fb= ( extr para 2)*x ;
  158. fc= ( extr para 3) * ( x ** ( extr para 4));
  159. ff= fa + fb + fc;
  160. finproc ff;
  161. * procedur pour calculer les derivees partielles
  162. debproc fderiv para*listreel x*listreel ;
  163. n=dime x;
  164. fdera= prog n*1.;
  165. fderb= x * 1;
  166. fderc= x**(extr para 4);
  167. fderd = (extr para 3)*( log x) * (x** ( extr para 4));
  168. finproc fdera fderb fderc fderd;
  169. * procedure pour calculer le critère de distance
  170. debproc criter fcalc*listreel fobjec*listreel ;
  171. cri= 0.;
  172. repe aa ( dime fcalc);
  173. cri = cri + ( ((extr fcalc &aa) - (extr fobjec &aa) )**2);
  174. fin aa;
  175. finproc cri;
  176.  
  177. * schema iteratif
  178. temps;
  179. repeter iter 500;
  180.  
  181. fdep = fcal para x; crii = criter fdep fobj;
  182. mess ' debut iteration ' &iter ' critère ' crii;
  183.  
  184. *
  185. * on teste la convergence ( coutnouv - coutanc ) / coutanc < 1.e-4
  186. *
  187. si ( &iter. ega 1) ;
  188. crianc = crii;
  189. sinon;
  190. cri_conv= ( crianc - crii ) / crianc;
  191. mess ' critère de convergence ' cri_conv;
  192. crianc= crii;
  193. si ( cri_conv < 1.e-4) ;
  194. mess ' convergence à l itération ' &iter ' cout ' crii;
  195. quitter iter;
  196. finsi;
  197. finsi;
  198.  
  199. fdera fderb fderc fderd = fderiv para x ;
  200. * list fobj;list fdep; list fdera ; list fderb; list fderc; list fderd;
  201. nouvpara= moca para fobj fdep fdera fderb fderc fderd;
  202. * list nouvpara;
  203. *
  204. * recherche le long de la direction donnée par nouvpara - para
  205. *
  206. desc= (nouvpara - para ) * 0.333333333;
  207.  
  208. imu=1;
  209. repe ide 30;
  210. nouvpara= para + (desc * imu);
  211. fnou= fcal nouvpara x;
  212. cria= criter fnou fobj;
  213. si ( cria > crii );
  214. si ( imu ega 1) ;
  215. si (&ide < 6) ;
  216. desc = desc / 10.;
  217. iterer ide;
  218. sinon;
  219. mess ' pas de longueur trouvée le long de la descente';
  220. quitter iter;
  221. finsi;
  222. finsi;
  223. * recherche d'un min par approximation parabilique
  224. aa = cri2 + cria - (2.*crii) / 2.;
  225. bb= cria - cri2 / 2.;
  226. xx = bb / -2. / aa ;
  227. iies= xx - 1. ;
  228. para= nouvpara + ( iies * desc);
  229. quitter ide;
  230. sinon;
  231. si ((imu ega &ide ) et (imu ega 9)) ;
  232. para= nouvpara;quitter ide;
  233. finsi;
  234. imu=imu+1 ;
  235. cri2=crii;
  236. crii=cria;
  237. finsi;
  238. fin ide;
  239. fin iter;
  240. temps;
  241. mess ' résutats par utilisation de moca itératif';
  242. mess ' a = ' ( extr para 1) ' valeur attendue 1.';
  243. mess ' b = ' ( extr para 2) ' valeur attendue -6.';
  244. mess ' c = ' ( extr para 3) ' valeur attendue 4.';
  245. mess ' d = ' ( extr para 4) ' valeur attendue 3.';
  246. erb= abs ( para - sol2);
  247. ermax3= maxi erb;
  248. *
  249. *
  250. * utilisation de l'opérateur levmar
  251. *
  252. * il faut définir la procédure feval qui evalue la fonction
  253. * à minimiser et qui calcule les derivées partielles
  254. *
  255. debproc feval x*listreel para*listreel;
  256. dy=prog;
  257. n=dime x;
  258. m = dime para;
  259. a1= extr para 1 ;
  260. b1= extr para 2;
  261. c1= extr para 3;
  262. d1= extr para 4;
  263. aa1 = prog n*a1;
  264.  
  265. y= aa1 + ( b1 * x ) + ( c1 * ( x ** d1)) ;
  266.  
  267. fdera= prog n*1.;
  268. fderb= x * 1;
  269. fderc= x**(extr para 4);
  270. fderd = (extr para 3)*( log x) * (x** ( extr para 4));
  271. l_dy=prog;
  272. ia=0;
  273. repe baa n;
  274. l_dy= l_dy et (prog ( extr fdera &baa));
  275. l_dy= l_dy et (prog ( extr fderb &baa));
  276. l_dy= l_dy et (prog ( extr fderc &baa));
  277. l_dy= l_dy et (prog ( extr fderd &baa));
  278. fin baa;
  279. finp y l_dy;
  280.  
  281. aa = prog 2. 2. 2. 2.;sis = prog nexp*1. ;
  282. temps;
  283. a0 chi2 = 'LEVM' ABSC x ORDO fobj 'PARA' aa SIGM sis PROC feval ;
  284. temps;
  285. mess ' résultats par utilisation de levm ' ;
  286. mess ' a = ' ( extr a0 1) ' valeur attendue 1.';
  287. mess ' b = ' ( extr a0 2) ' valeur attendue -6.';
  288. mess ' c = ' ( extr a0 3) ' valeur attendue 4.';
  289. mess ' d = ' ( extr a0 4) ' valeur attendue 3.';
  290. erc = abs ( a0 - sol2);
  291. ermax4= maxi erc;
  292.  
  293. message ' erreur pour moca ' ermax1;
  294. message ' erreur pour ajuste ' ermax2;
  295. message ' erreur pour moca ' ermax3;
  296. message ' erreur pour levm ' ermax4;
  297. si ( (ermax1 + ermax2 + ermax3 + ermax4 ) > 1.e-4);
  298. erreur 5;
  299. 'SINON';
  300. 'ERREUR' 0 ;
  301. finsi;
  302.  
  303. fin;
  304.  
  305.  
  306.  
  307.  
  308.  
  309.  
  310.  
  311.  
  312.  
  313.  

© Cast3M 2003 - Tous droits réservés.
Mentions légales