Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1065 connectés 

  FORUM HardWare.fr
  Programmation
  Divers

  [traitement de nombres] Comment pourrais je faire ça sous Linux ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[traitement de nombres] Comment pourrais je faire ça sous Linux ?

n°630060
Mjules
Parle dans le vide
Posté le 03-02-2004 à 19:27:48  profilanswer
 

Bonsoir,
 
voilà le pb :
j'ai plusieurs fichiers texte (codage ASCII) contenant 2 colonnes de nombres. Ce sont des fichiers décrivant des courbes de diffraction X.
Ma première colonne contient des angles en degrées.
Je cherche à appliquer cette formule sur ces angles (ça me permettra de comparer des diagrammes fait dans différents appareils) :

angle_final (en degré) = arcsin{(lambda'/lambda)*sin(angle_initial)}


 
j'ai commencé par faire ça avec un tableur mais je suis vite limité (entre 3500 et 6000 valeurs à chaque fois, ça devient vite lourd).
Je cherches donc un moyen d'automatiser ces opérations avec un script/programme.
 
L'ennui c'est que je ne sais pas quoi utiliser :( ; j'ai quelques notions de BASH (je suis sous linux) et j'avais pensé à awk, mais celui ci ne semble pas faire les arcsin.
 
je m'en remets donc à vous pour me donner des pistes ou des noms de softs ou bien des liens. Enfin bref tout ce qui pourrait m'aider. :)
 
Merci d'avance.


---------------
Celui qui pose une question est idiot 5 minutes. Celui qui n'en pose pas le reste toute sa vie. |  Membre du grand complot pharmaceutico-médico-scientifico-judéo-maçonnique.
mood
Publicité
Posté le 03-02-2004 à 19:27:48  profilanswer
 

n°630074
uriel
blood pt.2
Posté le 03-02-2004 à 19:37:15  profilanswer
 

bon je dirais pour des calculs mathematique le Fortran est ce qu'il y a de mieux, mais bon pas top , avec du Perl tu devrais t'en sortir :jap:


---------------
IVG en france
n°630078
Mjules
Parle dans le vide
Posté le 03-02-2004 à 19:39:13  profilanswer
 

et c'est pas trop compliqué à apprendre le perl ? tu aurais des bons liens ?
 
HS : au fait, tu t'en es sortie avec ton DHCP ?


Message édité par Mjules le 03-02-2004 à 19:41:26

---------------
Celui qui pose une question est idiot 5 minutes. Celui qui n'en pose pas le reste toute sa vie. |  Membre du grand complot pharmaceutico-médico-scientifico-judéo-maçonnique.
n°630087
uriel
blood pt.2
Posté le 03-02-2004 à 19:45:43  profilanswer
 

Mjules a écrit :

et c'est pas trop compliqué à apprendre le perl ? tu aurais des bons liens ?
 
HS : au fait, tu t'en es sortie avec ton DHCP ?


 
Pour Perl : http://forum.hardware.fr/forum2.ph [...] 097&cat=10
 
compliqué... la syntaxe est un peu special mais c'est pas trop compliqué, maintenant la plupart de langages te permette de faire ce que tu veux, je prends Perl parce que je le connais un peu  [:spamafote]  
 
HS: :jap: pas encore verifier vu que j'ai pas la machine sous la main, mais je teste et je réup le sujet


---------------
IVG en france
n°630165
Evadream -​jbd-
Posté le 03-02-2004 à 20:53:35  profilanswer
 

Salut, je comprends pas trop :)
Tu as des fichiers texte contenant 2 colonnes de nombres, la première colonne réprésente des angles en dégré, et la deuxième, on s'en fiche ?
 
C'est "angle_initial" que l'on doit remplacer dans ta formule ?  
 
@+

n°630268
Evadream -​jbd-
Posté le 03-02-2004 à 21:31:46  profilanswer
 

Bon, je viens de me mettre au python y'a 10 minutes [:ddr555]
 
Pour un fichier essai.tmp de cette forme :


1.2 5.8
3.9 2.8
1.2 5.1


 
Et un script python qui ressemble à çà (indulgence demandé)

Code :
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. import math
  4. # angle_final (en degré) = arcsin{(lambda'/lambda)*sin(angle_initial)}
  5. fichier = open('essai.tmp','r')
  6. a = 1.9
  7. b = 2.47
  8. # on lit tout le fichier qu'on place dans lignes, ligne par ligne
  9. lignes = fichier.readlines()
  10. # on lit ligne par ligne
  11. for ligne in lignes :
  12. # split sépare les élements de la ligne (par défaut, l'espace est l'élément séparateur
  13.   donnees = ligne.split()
  14.   if len(donnees) == 2 :
  15.           s = "Angle initial:" + donnees[0] + " "
  16.           p = "Angle final:%f" % math.asin((a/b)*math.sin(float(donnees[0])))
  17.           print s+p
  18. fichier.close()


 
J'obtiens la sortie suivante :


$ ./files.py  
Angle initial:1.2 Angle final:0.799422
Angle initial:3.9 Angle final:-0.557482
Angle initial:1.2 Angle final:0.799422
$


 
Ca à l'air pas trop mal, à moins que je réponde à coté de la plaque :D
 
Enfin tout ca pour te dire que ca semble pas extremement complexe, d'autant plus que la doc python est super bien faite !
 
@++

n°630271
uriel
blood pt.2
Posté le 03-02-2004 à 21:33:34  profilanswer
 

c'est vrai que Python est peut être plus lisible et facile d'acces maintenant que tu en parles :D


---------------
IVG en france
n°630275
Mjules
Parle dans le vide
Posté le 03-02-2004 à 21:36:55  profilanswer
 

Evadream -jbd- a écrit :

Salut, je comprends pas trop :)
Tu as des fichiers texte contenant 2 colonnes de nombres, la première colonne réprésente des angles en dégré, et la deuxième, on s'en fiche ?
 
C'est "angle_initial" que l'on doit remplacer dans ta formule ?  
 
@+


oui exactement  :jap:


---------------
Celui qui pose une question est idiot 5 minutes. Celui qui n'en pose pas le reste toute sa vie. |  Membre du grand complot pharmaceutico-médico-scientifico-judéo-maçonnique.
n°630281
Mjules
Parle dans le vide
Posté le 03-02-2004 à 21:40:03  profilanswer
 

Evadream -jbd- a écrit :

Bon, je viens de me mettre au python y'a 10 minutes [:ddr555]
 
Pour un fichier essai.tmp de cette forme :


1.2 5.8
3.9 2.8
1.2 5.1


 
Et un script python qui ressemble à çà (indulgence demandé)

Code :
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. import math
  4. # angle_final (en degré) = arcsin{(lambda'/lambda)*sin(angle_initial)}
  5. fichier = open('essai.tmp','r')
  6. a = 1.9
  7. b = 2.47
  8. # on lit tout le fichier qu'on place dans lignes, ligne par ligne
  9. lignes = fichier.readlines()
  10. # on lit ligne par ligne
  11. for ligne in lignes :
  12. # split sépare les élements de la ligne (par défaut, l'espace est l'élément séparateur
  13.   donnees = ligne.split()
  14.   if len(donnees) == 2 :
  15.           s = "Angle initial:" + donnees[0] + " "
  16.           p = "Angle final:%f" % math.asin((a/b)*math.sin(float(donnees[0])))
  17.           print s+p
  18. fichier.close()


 
J'obtiens la sortie suivante :


$ ./files.py  
Angle initial:1.2 Angle final:0.799422
Angle initial:3.9 Angle final:-0.557482
Angle initial:1.2 Angle final:0.799422
$


 
Ca à l'air pas trop mal, à moins que je réponde à coté de la plaque :D
 
Enfin tout ca pour te dire que ca semble pas extremement complexe, d'autant plus que la doc python est super bien faite !
 
@++


ouaouh !  
c'est ça qu'il me faut  :love:  sauf que moi je veux avoir en sortie un fichier avec colonne1 modifié et colonne2 intact.
 
bon je vais regarder python :)
Merci


---------------
Celui qui pose une question est idiot 5 minutes. Celui qui n'en pose pas le reste toute sa vie. |  Membre du grand complot pharmaceutico-médico-scientifico-judéo-maçonnique.
n°630284
chaica
Posté le 03-02-2004 à 21:41:45  profilanswer
 

Be gorgeous, use python.

mood
Publicité
Posté le 03-02-2004 à 21:41:45  profilanswer
 

n°630286
Evadream -​jbd-
Posté le 03-02-2004 à 21:46:37  profilanswer
 

Mjules a écrit :


ouaouh !  
c'est ça qu'il me faut  :love:  sauf que moi je veux avoir en sortie un fichier avec colonne1 modifié et colonne2 intact.
 
bon je vais regarder python :)
Merci


 
C'est cool :)
Si tu veux pas te prendre la tete, tu remplaces :
 


  if len(donnees) == 2 :
         s = "Angle initial:" + donnees[0] + " "
         p = "Angle final:%f" % math.asin((a/b)*math.sin(float(donnees[0])))
         print s+p  


 
Par  
 


  if len(donnees) == 2 :
        s = "%f  " % math.asin((a/b)*math.sin(float(donnees[0]))) + donnees[1]
        print s


 
Et tu fais :
 


./nomduscript > nouveaufichier  


 
et hop :D


Message édité par Evadream -jbd- le 03-02-2004 à 21:49:42
n°630299
Mjules
Parle dans le vide
Posté le 03-02-2004 à 21:56:43  profilanswer
 

Evadream -jbd- a écrit :


 
C'est cool :)
Si tu veux pas te prendre la tete, tu remplaces :
 


  if len(donnees) == 2 :
         s = "Angle initial:" + donnees[0] + " "
         p = "Angle final:%f" % math.asin((a/b)*math.sin(float(donnees[0])))
         print s+p  


 
Par  
 


  if len(donnees) == 2 :
        s = "%f  " % math.asin((a/b)*math.sin(float(donnees[0]))) + donnees[1]
        print s


 
Et tu fais :
 


./nomduscript > nouveaufichier  


 
et hop :D


La grande classe  :wahoo:  
 
Merci 1000 fois  :jap:


---------------
Celui qui pose une question est idiot 5 minutes. Celui qui n'en pose pas le reste toute sa vie. |  Membre du grand complot pharmaceutico-médico-scientifico-judéo-maçonnique.
n°630334
Taz
bisounours-codeur
Posté le 03-02-2004 à 22:46:32  profilanswer
 

fichier = open('essai.tmp','r')
   
  a = 1.9
  b = 2.47
   
  # on lit tout le fichier qu'on place dans lignes, ligne par ligne
  lignes = fichier.readlines()
   
  # on lit ligne par ligne  
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
t'emmerdes pas
 
 
for ligne in open('fichier'):
    # ...

n°630335
Evadream -​jbd-
Posté le 03-02-2004 à 22:47:59  profilanswer
 

Ah ok ! Très bien ! Merci !

n°630336
Evadream -​jbd-
Posté le 03-02-2004 à 22:48:48  profilanswer
 

Mjules a écrit :


La grande classe  :wahoo:  
Merci 1000 fois  :jap:  


 
Pas de soucis, bon courage !
 
@+

n°630340
Taz
bisounours-codeur
Posté le 03-02-2004 à 22:52:38  profilanswer
 

juste une réflexion
 
le % prends en argument droit un tuple. python fait automatiquement de packing, unpacking
comme dans
 
f, = sequence
ou
pair = first, second
 
donc "..." % arg fonctionne
seulement, je pense que ce n'est pas une bonne habitude, et ça peut se révéler problématique si arg est lui même un tuple
 
donc je recommande d'écrire
 
"..." % (arg,)

n°630341
Evadream -​jbd-
Posté le 03-02-2004 à 22:55:00  profilanswer
 

Je note ! Merci pour cette remarque :)


Message édité par Evadream -jbd- le 03-02-2004 à 22:55:13
n°630343
Taz
bisounours-codeur
Posté le 03-02-2004 à 22:56:59  profilanswer
 

eih j'espère que t'as surtout compris que pas besoin de fermer explicitement les fichiers en python, ça se fait tout seul à la destruction (plus de références sur les descripteur de fichiers)

n°630347
Evadream -​jbd-
Posté le 03-02-2004 à 23:01:54  profilanswer
 

Ta remarque s'applique même lorsque qu'on fait un fichier = open('monnom'), ou bien c'était pour appuyer ta remarque précédente où le open se faisait dans le for ?


Message édité par Evadream -jbd- le 03-02-2004 à 23:02:26
n°630348
Taz
bisounours-codeur
Posté le 03-02-2004 à 23:04:00  profilanswer
 

oui. en règle générale, ne prends pas la peine de fermer un fichier. le seul cas ou tu le fermes explicitement, c'est quand tu veux faire une autre opération (réouverture dans un autre mode, suppression, déplacement, renommage, etc) afin d'assurer la cohérence

n°630349
Evadream -​jbd-
Posté le 03-02-2004 à 23:06:10  profilanswer
 

Très bien, encore merci :)

n°630368
chaica
Posté le 03-02-2004 à 23:19:36  profilanswer
 

taz a écrit :

juste une réflexion
 
le % prends en argument droit un tuple. python fait automatiquement de packing, unpacking
comme dans
 
f, = sequence
ou
pair = first, second
 
donc "..." % arg fonctionne
seulement, je pense que ce n'est pas une bonne habitude, et ça peut se révéler problématique si arg est lui même un tuple
 
donc je recommande d'écrire
 
"..." % (arg,)


 
Rapidement :
 
http://www.python.org/doc/current/tut/node9.html
 
String and Unicode objects have one unique built-in operation: the % operator (modulo). This is also known as the string formatting or interpolation operator. Given format % values (where format is a string or Unicode object), % conversion specifications in format are replaced with zero or more elements of values. The effect is similar to the using sprintf() in the C language. If format is a Unicode object, or if any of the objects being converted using the %s conversion are Unicode objects, the result will also be a Unicode object.  
 
If format requires a single argument, values may be a single non-tuple object. 2.8 Otherwise, values must be a tuple with exactly the number of items specified by the format string, or a single mapping object (for example, a dictionary).
 
Vraiment pour l'habitude alors :)


Message édité par chaica le 03-02-2004 à 23:21:22
n°632264
Mjules
Parle dans le vide
Posté le 05-02-2004 à 15:25:12  profilanswer
 

Bonjour,
 
alors voilà, après 2 jours d'apprentissage, j'ai finalement réussi à pondre ça :

Code :
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. # Ce petit programme permet de convertir des angles obtenu par diffraction X avec une anticathode donnée
  4. # en les angles qu'on obtiendrais avec une autre anticathode
  5. # pour me contacter : mjules chez ifrance point com
  6. # v 0.1
  7. #
  8. #NOTE : le fichier d'entrée doit être composé de 2 colonnes angles et intensités, dans cet ordre et séparé par un ou plusieurs espaces
  9. import math
  10. # angle_final (en degr?) = arcsin{(lambda'/lambda)*sin(angle_initial)}
  11. fichier_anal = raw_input('Entrer le nom du fichier à analyser :')      # on entre le fichier à analyser
  12. try:                                                                                    # on vérifie que ce fichier existe
  13.         f = open(fichier_anal, 'r')
  14.         f.close()
  15. except:
  16.         print "le fichier", fichier_anal, "est introuvable"
  17. cath1 = raw_input('Entrer l\'élément utilisé pour l\'analyse (Co, Cr, Cu) : ')       # on entre le métal de l'anticathode d'analyse
  18. if cath1 == 'Co' :                                                                                   # on assigne la valeur de la raie à la variable utilisée dans l'équation
  19.         anticath_anal = 1.788
  20. elif cath1 == 'Cu' :
  21.         anticath_anal = 1.541
  22. elif cath1 == 'Cr' :
  23.         anticath_anal = 2.2798
  24. else :
  25.         print "Les autres éléments ne sont pas encore supporté, désolé"           # si l'élément est inconnu, on le dit
  26. cath2 = raw_input('Entrer l\'élément vers lequel les angles doivent être convertis (Co, Cr, Cu) : ')    #idem pour l'anticathode vers laquelle on converti
  27. if cath2 == 'Co' :
  28.         anticath_result = 1.788
  29. elif cath2 == 'Cu' :
  30.         anticath_result = 1.541
  31. elif cath2 == 'Cr' :
  32.         anticath_result = 2.2798
  33. else :
  34.         print "Les autres éléments ne sont pas encore supporté, désolé"
  35. # on lit tout le fichier qu'on place dans lignes, ligne par ligne
  36. fichier_result = fichier_anal + cath1 + "vers" + cath2                                              # on donne un nom au fichier de résultat
  37.                                                                                                                     # fichier original suivi des 2 métaux utilisés
  38. result = open(fichier_result, 'w')                                                                          # on crée le fichier de résultat
  39. # on lit ligne par ligne
  40. for ligne in open(fichier_anal, 'r') :
  41. # split s?pare les ?lements de la ligne (par d?faut, l'espace est l'?l?ment s?parateur
  42.         donnees = ligne.split()
  43.         if len(donnees) == 2 :
  44.                 pre_resultat = (anticath_result/anticath_anal)*math.sin(float(donnees[0])*(math.pi/360))   # si le résultat du sinus de l'angle multiplié par le rapport
  45.                 if (pre_resultat > 1) :                                                                                                # est supérieur à 1, l'arcsinus risque de faire la tête
  46.                                                                                                                                            # alors on met la valeur 0
  47.                   print "certains angles sont trop grands pour la conversion, ils seront remplacés par des 0"
  48.                   s = "0 " + donnees[1] + "\n"
  49.                 else :
  50.                   s = "%f " %((360/math.pi)*math.asin(float(pre_resultat)),) + donnees[1] + "\n"                # on écrit le résultat dans le fichier de sortie
  51.         result.write(str(s))


 
ça marche pas trop mal mais ya encore du boulot dessus à faire.
 
Merci beaucoup pour m'avoir donné les pistes et à bientôt sur la subcat python parce que je sens que je vais pas tarder à avoir besoin d'un peu d'aide ;)
 
A+


---------------
Celui qui pose une question est idiot 5 minutes. Celui qui n'en pose pas le reste toute sa vie. |  Membre du grand complot pharmaceutico-médico-scientifico-judéo-maçonnique.
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Divers

  [traitement de nombres] Comment pourrais je faire ça sous Linux ?

 

Sujets relatifs
Adaptations entre Windows et Linux[VB .NET] Traitement vba trop lent ??
configurer MySQL et PHP sur Linux[ ASM INTEL LINUX ] - Besoin d'aide pour comprendre qques trucs Svp
portage vers linuxUn IDE C# sous linux qui soit bien?
Détecter si l'OS est Win ou linux...les nombres complexes en pascal
Remplir un tableau de nombres flottants avec une certaine valeurWindows : timer - coordonnées / Borland Windows <==> Linux
Plus de sujets relatifs à : [traitement de nombres] Comment pourrais je faire ça sous Linux ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR