1 #@ MODIF post_dyna_alea_ops Macro DATE 22/12/2008 AUTEUR COURTOIS M.COURTOIS
2 # -*- coding: iso-8859-1 -*-
3 # CONFIGURATION MANAGEMENT OF EDF VERSION
4 # ======================================================================
5 # COPYRIGHT (C) 1991 - 2006 EDF R&D WWW.CODE-ASTER.ORG
6 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
7 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
8 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
9 # (AT YOUR OPTION) ANY LATER VERSION.
11 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
12 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
13 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
14 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.
16 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
17 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
18 # 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
19 # ======================================================================
24 from types import ListType, TupleType
25 from math import pi,sqrt,log,exp
27 EnumTypes = (ListType, TupleType)
30 def post_dyna_alea_ops(self,INTE_SPEC, FRAGILITE,TITRE,INFO,**args):
33 from Utilitai.Utmess import UTMESS
34 from Utilitai.t_fonction import t_fonction
35 from Utilitai.Table import Table
37 commande='POST_DYNA_ALEA'
40 # La macro compte pour 1 dans la numerotation des commandes
43 # Le concept sortant (de type table_sdaster ou dérivé) est tab
44 self.DeclareOut('tabout', self.sd)
46 # On importe les definitions des commandes a utiliser dans la macro
47 # Le nom de la variable doit etre obligatoirement le nom de la commande
48 CREA_TABLE = self.get_cmd('CREA_TABLE')
49 CALC_TABLE = self.get_cmd('CALC_TABLE')
50 IMPR_TABLE = self.get_cmd('IMPR_TABLE')
51 RECU_FONCTION = self.get_cmd('RECU_FONCTION')
52 IMPR_FONCTION = self.get_cmd('IMPR_FONCTION')
53 DEFI_LIST_REEL = self.get_cmd('DEFI_LIST_REEL')
54 DEFI_FONCTION = self.get_cmd('DEFI_FONCTION')
55 CALC_FONCTION = self.get_cmd('CALC_FONCTION')
58 # ------------------------------------------------------------------
59 #---------algorithme d'optimisation pour le maximum de vraisemblance
63 # assert am >0.000, 'optimize.py: beta negatif'
64 # assert am >0.000, 'optimize.py: am negatif'
70 for k in range(Nbval):
72 xi=float(liste_def[k])
75 f0=pfa**xi*(1.-pfa)**(1-xi)
83 for k in range(Nbval):
84 ai=liste_indic[list_rand[k]]
85 xi=float(liste_def[list_rand[k]])
88 f0=pfa**xi*(1.-pfa)**(1-xi)
92 # ------------------------------------------------------------------
94 # ------------------------------------------------------------------
96 from Utilitai.optimize import fmin
97 from Utilitai.stats import normcdf
99 if FRAGILITE['LIST_PARA'] != None :
100 liste_a = FRAGILITE['LIST_PARA'].VALE.get()
101 elif FRAGILITE['VALE'] != None :
102 liste_a =FRAGILITE['VALE']
107 tab2 = FRAGILITE['TABL_RESU'].EXTR_TABLE()
108 dicta = tab2.values()
110 if dicta.has_key('DEFA') :
111 liste_def = dicta['DEFA']
113 UTMESS('F','TABLE0_1',valk=('DEFA'))
114 if dicta.has_key('PARA_NOCI') :
115 liste_indic = dicta['PARA_NOCI']
117 UTMESS('F','TABLE0_1',valk=('PARA_NOCI'))
119 Nbval=len(liste_indic)
121 test1 = Numeric.equal(None,liste_indic)
122 test2 = Numeric.equal(None,liste_def)
123 if test1 >=1 or test2 >=1:
124 UTMESS('F','TABLE0_15')
126 # estimation paramètres
127 x0 = [FRAGILITE['AM_INI'],FRAGILITE['BETA_INI']]
128 xopt = fmin(vrais,x0)
130 texte='PARAMETRES Am, beta ESTIMES : '+str(xopt)+'\n'
131 aster.affiche('MESSAGE',texte) #print 'parametres Am, beta estimes: ', xopt
134 vec_a=Numeric.array(liste_a)
135 vecval=(Numeric.log(vec_a/xopt[0]))/xopt[1]
137 lpfa.append(normcdf(vecval[m]))
143 mcfact.append(_F(PARA= 'TITRE' , LISTE_K= TITRE ))
145 mcfact.append(_F(PARA= 'AM' ,LISTE_R=xopt[0] ))
146 mcfact.append(_F(PARA= 'BETA' ,LISTE_R=xopt[1] ))
147 mcfact.append(_F(PARA= 'PARA_NOCI' ,LISTE_R =liste_a ))
148 mcfact.append(_F(PARA= 'PFA' ,LISTE_R = lpfa ))
151 # si calcul de fractiles (intervalles de confiance) par bootstrap
154 if FRAGILITE['FRACTILE']!= None :
156 texte='FRACTILES A CALCULER PAR BOOTSTRAP '+ str(FRAGILITE['FRACTILE']) +'\n'
157 aster.affiche('MESSAGE',texte)
158 if FRAGILITE['NB_TIRAGE']!= None :
159 Nboot = FRAGILITE['NB_TIRAGE']
161 UTMESS('F','PROBA0_11') #assert Nboot <= Nbval , 'ERREUR: nombre de tirages demandes trop grand'
166 lfract =FRAGILITE['FRACTILE']
171 for kb in range(Nboot) : #in range(Nbval)
176 for kb2 in range(Nbval) :
177 list_rand.append(random.randint(0,Nbval-1))
179 xopt = fmin(boot_vrais,x0)
181 texte1='BOOTSTRAP TIRAGE '+ str(kb+1)
182 texte2=' PARAMETRES Am, beta ESTIMES : '+str(xopt)+'\n'
183 aster.affiche('MESSAGE',texte1)
184 aster.affiche('MESSAGE',texte2)
185 vecval=(Numeric.log(vec_a/xopt[0]))/xopt[1]
187 lpfa.append(normcdf(vecval[m]))
189 __ABS[kb]=DEFI_LIST_REEL( VALE = liste_a );
190 __ORDO[kb]=DEFI_LIST_REEL( VALE = lpfa );
192 __F1[kb]=DEFI_FONCTION( NOM_PARA='PGAZ',
194 VALE_PARA = __ABS[kb],
195 VALE_FONC = __ORDO[kb],);
196 list_fonc.append(__F1[kb],)
199 #__FRACTILE = [None]*len(lfract)
200 liste = [None]*len(lfract)
201 for kb in range(len(lfract)):
202 __FRACTILE=CALC_FONCTION(FRACTILE=_F(FONCTION=(list_fonc),
203 FRACT=lfract[kb]), );
204 liste[kb]= __FRACTILE.Ordo()
205 mcfact.append(_F(PARA= str(lfract[kb]) ,LISTE_R =liste[kb] ))
209 tabout = CREA_TABLE(LISTE=mcfact,TITRE = 'POST_DYNA_ALEA concept : '+self.sd.nom)
211 # ------------------------------------------------------------------
214 # ------------------------------------------------------------------
216 # ------------------------------------------------------------------
217 if INTE_SPEC !=None :
219 TOUT_ORDRE = args['TOUT_ORDRE']
220 NUME_VITE_FLUI=args['NUME_VITE_FLUI']
222 NUME_ORDRE_I=args['NUME_ORDRE_I']
223 NOEUD_I=args['NOEUD_I']
224 OPTION=args['OPTION']
226 MOMENT=args['MOMENT']
228 intespec=INTE_SPEC.EXTR_TABLE()
230 NUME_VITE_FLUI_present = 'NUME_VITE_FLUI' in intespec.para
231 NUME_ORDRE_I_present = 'NUME_ORDRE_I' in intespec.para
232 NOEUD_I_present = 'NOEUD_I' in intespec.para
235 tabres = Table(titr='POST_DYNA_ALEA concept : %s' % self.sd.nom)
237 # ------------------------------------------------------------------
238 # Liste des moments spectraux
239 # repérer le type de l'interspectre et son nom
240 # 1- concept interspectre
241 # 2- table de table d interspectre
243 if NUME_VITE_FLUI_present :
244 if TOUT_ORDRE != None :
245 jvite = list(Set(intespec.NUME_VITE_FLUI.not_none_values()))
248 jvite=[NUME_VITE_FLUI,]
252 # ------------------------------------------------------------------
253 # Repérer les couples d'indices selectionnés
254 # vérification de l'égalité du nombre d indices en i et j
256 if NUME_ORDRE_I!=None :
258 l_ind_j=args['NUME_ORDRE_J']
259 if type(l_ind_i) not in EnumTypes : l_ind_i=[l_ind_i]
260 if type(l_ind_j) not in EnumTypes : l_ind_j=[l_ind_j]
261 if len(l_ind_i)!=len(l_ind_j) :
262 UTMESS('F','PROBA0_8')
263 # paramètres fixes de la table
264 tabres.add_para(['NUME_ORDRE_I','NUME_ORDRE_J'], 'I')
267 l_ind_j=args['NOEUD_J']
268 l_cmp_i=args['NOM_CMP_I']
269 l_cmp_j=args['NOM_CMP_J']
270 if type(l_cmp_i) not in EnumTypes : l_cmp_i=[l_cmp_i]
271 if type(l_cmp_j) not in EnumTypes : l_cmp_j=[l_cmp_j]
272 if type(l_ind_i) not in EnumTypes : l_ind_i=[l_ind_i]
273 if type(l_ind_j) not in EnumTypes : l_ind_j=[l_ind_j]
274 if len(l_ind_i)!=len(l_ind_j) :
275 UTMESS('F','PROBA0_8')
276 if len(l_cmp_i)!=len(l_cmp_j) :
277 UTMESS('F','PROBA0_9')
278 if len(l_ind_i)!=len(l_cmp_i) :
279 UTMESS('F','PROBA0_10')
280 # paramètres fixes de la table
281 tabres.add_para(['NOEUD_I','NOEUD_J','NOM_CMP_I','NOM_CMP_J'], 'K8')
283 # ------------------------------------------------------------------
284 # Cas de tous les indices centraux
287 if NUME_VITE_FLUI_present :
288 intespec = intespec.NUME_VITE_FLUI == jvite[0]
290 if NUME_ORDRE_I_present :
291 imode = list(Set(intespec.NUME_ORDRE_I.not_none_values()))
294 # paramètres fixes de la table
295 tabres.add_para(['NUME_ORDRE_I','NUME_ORDRE_J'], 'I')
297 l_ind_i = intespec.NOEUD_I.values()
298 l_ind_j = intespec.NOEUD_J.values()
299 if len(l_ind_i) != len(l_ind_j) :
300 UTMESS('F','PROBA0_8')
301 l_cmp_i = intespec.NOM_CMP_I.values()
302 l_cmp_j = intespec.NOM_CMP_J.values()
303 if (len(l_ind_i) != len(l_cmp_i) or len(l_ind_j) != len(l_cmp_j)) :
304 UTMESS('F','PROBA0_10')
305 l_l=zip(zip(l_ind_i,l_cmp_i),zip(l_ind_j,l_cmp_j))
312 l_ind_i.append(ai[0])
313 l_ind_j.append(aj[0])
314 l_cmp_i.append(ai[1])
315 l_cmp_j.append(aj[1])
316 # paramètres fixes de la table
317 tabres.add_para(['NOEUD_I','NOEUD_J','NOM_CMP_I','NOM_CMP_J'], 'K8')
320 tabres.add_para('NUME_VITE_FLUI', 'I')
323 # ------------------------------------------------------------------
324 # Liste des moments spectraux
326 l_moments=[0,1,2,3,4]
328 l_moments.extend(list(MOMENT))
329 l_moments=list(Set(l_moments))
331 # ------------------------------------------------------------------
332 # Boucle sur les fonctions
335 l_ind=zip(l_ind_i,l_ind_j, l_cmp_i,l_cmp_j)
337 l_ind=zip(l_ind_i, l_ind_j )
340 # pour la présentation de la table finale, on stocke le nbre de paramètres "initiaux"
341 nbpara0 = len(tabres.para)
345 texte='POUR LA MATRICE INTERSPECTRALE '+INTE_SPEC.nom+'\n'
346 aster.affiche('MESSAGE',texte)
351 dlign['NUME_VITE_FLUI'] = vite
352 mcfact.append(_F(NOM_PARA='NUME_VITE_FLUI',VALE_I=vite))
354 i_foncstat = ind[0] == ind[1] and ind[2] == ind[3]
355 dlign['NOEUD_I'], dlign['NOEUD_J'], dlign['NOM_CMP_I'], dlign['NOM_CMP_J'] = \
356 ind[0], ind[1], ind[2], ind[3]
357 mcfact.append(_F(NOM_PARA='NOEUD_I',VALE_K=ind[0]))
358 mcfact.append(_F(NOM_PARA='NOEUD_J',VALE_K=ind[1]))
359 mcfact.append(_F(NOM_PARA='NOM_CMP_I',VALE_K=ind[2]))
360 mcfact.append(_F(NOM_PARA='NOM_CMP_J',VALE_K=ind[3]))
362 aster.affiche('MESSAGE','INDICES :'+ind[0]+' - '+ind[1])
363 aster.affiche('MESSAGE','INDICES :'+ind[2]+' - '+ind[3]+'\n')
365 i_foncstat = ind[0] == ind[1]
366 dlign['NUME_ORDRE_I'], dlign['NUME_ORDRE_J'] = ind[0], ind[1]
367 mcfact.append(_F(NOM_PARA='NUME_ORDRE_I',VALE_I=ind[0]))
368 mcfact.append(_F(NOM_PARA='NUME_ORDRE_J',VALE_I=ind[1]))
370 aster.affiche('MESSAGE','INDICES :'+str(ind[0])+' - '\
373 __fon1=RECU_FONCTION(TABLE = INTE_SPEC,
374 NOM_PARA_TABL= 'FONCTION_C',
377 val = __fon1.Valeurs()
378 fvalx= Numeric.array(val[0])
379 fvaly= Numeric.array(val[1])
382 # -- moments spectraux
385 for i_mom in l_moments :
387 trapz = Numeric.zeros(n,Numeric.Float)
389 valy = fvaly*(2*pi*fvalx)**i_mom
390 trapz[1:n] = (valy[1:n]+valy[:-1])/2*(fvalx[1:n]-fvalx[:-1])
391 prim_y = Numeric.cumsum(trapz)
392 val_mom[i_mom] = prim_y[-1]
393 for i_mom in l_moments :
394 chmo='LAMBDA_'+str(i_mom).zfill(2)
395 dlign[chmo] = val_mom[i_mom]
397 #--- si auto-spectre:
399 # test si le spectre est bien à valeurs positives
400 if min(fvaly) < 0.0 :
401 aster.affiche('MESSAGE', str(ind)+'\n')
402 UTMESS('F','MODELISA9_95')
403 # -- fonctions statistiques
404 if NUME_VITE_FLUI or frez >= 0. :
405 # -- cas NUME_VITE_FLUI, seule la partie positive du spectre est utilisée
406 # -- Il faut donc doubler lambda pour calculer le bon écart type
407 dlign['ECART'] = sqrt(val_mom[0]*2.)
409 dlign['ECART'] = sqrt(val_mom[0])
410 if abs(val_mom[2])>=1e-20 :
411 dlign['NB_EXTREMA_P_S'] = 1./pi*sqrt(val_mom[4]/val_mom[2])
412 if abs(val_mom[0])>=1e-20 :
413 dlign['NB_PASS_ZERO_P_S'] = 1./pi*sqrt(val_mom[2]/val_mom[0])
414 dlign['FREQ_APPAR'] = 0.5*dlign['NB_PASS_ZERO_P_S']
415 if abs(val_mom[4])>=1e-20 :
416 dlign['FACT_IRRE'] = sqrt( val_mom[2]*val_mom[2]/val_mom[0]/val_mom[4])
418 # ajoute la ligne à la Table
421 #--- construction de la table produite
424 ord_para = tabres.para[nbpara0:]
426 ord_para = tabres.para[:nbpara0] + ord_para
427 dprod = tabres[ord_para].dict_CREA_TABLE()
429 tabout = CREA_TABLE(**dprod)