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

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

lecture/écriture fichier texte et conversion en données numériques

n°1910072
cilouu
Posté le 29-07-2009 à 20:32:12  profilanswer
 

Reprise du message précédent :
Re ..
Oui mon programme est bien conçu j'imagine tout est paramétré .. héhéhé
Alors oui apparament pour déduire l'équation d'un crecle trois points seulement suffisent .. Après sur mes 10 points je peux en prendre 3 en déduire le cercle et calculer l'écart .
Par contre j'ai utilisé la fonction leastsq de optimize mais sa me donne quelque chose qui n'est pas tout à fait ce que je cherche car ma courbe étant symétrique à certains endroits, mes rayons obtenues devraients être égaux, et ce n'est pas le cas ..
Peux tu m'aider ?
 

Code :
  1. def eval_num(tab,borne1,borne2) :
  2.     def residuals(p,x,y) :
  3.         a,b,r = p
  4.         eq = ((a-x)*(a-x) + (b-y)*(b-y) -r*r)   # equation du cercle
  5.         return eq
  6.     def peval(x,p) :
  7.         return ((p[0]-x)*(p[0]-x) + (p[1]-y)*(p[1]-y) - p[2]*p[2])
  8.     from scipy.optimize import leastsq
  9.     p0 = [1.0,1.0,1.0]                          #initialisation du rayon
  10.     xvec =[]
  11.     yvec=[]
  12.     global px
  13.     global py
  14.     # creation des tableaux des valeurs connues
  15.     for j in range(taille_tab1) :
  16.         if (tab1[j] >= borne1 )&(tab1[j]<= borne2) :
  17.             xreel = tab1[j]
  18.             xvec.append(xreel)
  19.             yreel = tab[j]
  20.             yvec.append(yreel)
  21.     # calcul des rayrons et des centres (inconnues)
  22.     for k in range(len(xvec)) :
  23.         rayon_opt = leastsq(residuals,p0,args=(xvec,yvec),maxfev=100000)
  24.     print rayon_opt
  25.     px = rayon_opt[0][0]
  26.     py = rayon_opt[0][1]
  27. '''Calcul des rayons et des centres des cercles d?efinis par les points du profil (matrice_mini et maxi)
  28.     Methode des moindres carrees'''
  29. def essai_calculrayons() :
  30. # bornes _ R1 : origine-6 // R2 : 6.5 - 18.5  // R3 : 19 - 26.5
  31.     global Rx       # initialisation des variables des tableaux pour le graphique
  32.     global Ry
  33.     Rx = []; Ry = []
  34.     eval_num(matrice_mini,-26.5,-19)
  35.     Rx.append(px)
  36.     Ry.append(py)
  37.     eval_num(matrice_mini,-18.5,-6.5)
  38.     Rx.append(px)
  39.     Ry.append(py)
  40.     eval_num(matrice_mini,-6,6)
  41.     Rx.append(px)
  42.     Ry.append(py)
  43.     eval_num(matrice_mini,6.5,18.5)
  44.     Rx.append(px)
  45.     Ry.append(py)
  46.     eval_num(matrice_mini,19,26.5)
  47.     Rx.append(px)
  48.     Ry.append(py)
  49.     # trace les points des centres des cercles de rayons R1, R2 et R3
  50.     plot(Rx,Ry,"go" )


 
 

mood
Publicité
Posté le 29-07-2009 à 20:32:12  profilanswer
 

n°1910108
Sve@r
Posté le 29-07-2009 à 22:33:01  profilanswer
 

cilouu a écrit :

Re ..
Oui mon programme est bien conçu j'imagine tout est paramétré .. héhéhé


Ca c'est pas être "bien conçu" mais simplement configurable. Un programme bien conçu te permet de prendre un élément de base (par exemple une matrice) et le remplacer par autre chose (par exemple un tableau d'objets) sans que les éléments qui l'utilisent n'aient à en souffrir. Bien sûr certains détails du code doivent changer (surtout les liens entre l'élément de base et les éléments qui l'utilisent) mais sans plus.
 

cilouu a écrit :

Alors oui apparament pour déduire l'équation d'un crecle trois points seulement suffisent .. Après sur mes 10 points je peux en prendre 3 en déduire le cercle et calculer l'écart .
Par contre j'ai utilisé la fonction leastsq de optimize mais sa me donne quelque chose qui n'est pas tout à fait ce que je cherche car ma courbe étant symétrique à certains endroits, mes rayons obtenues devraients être égaux, et ce n'est pas le cas ..
Peux tu m'aider ?


 
Je peux pas lire ton code, il y a vraiment trop de commentaires. Mais je pense que ton écart vient du codage interne des flottants.
Ce problème n'est pas spécifique à Python mais il est inhérent à la conversion en binaire d'un nombre à virgule. En effet, convertir par exemple 0,3 en binaire donnera
0,3 * 2 = 0,6 => 0
0,6 * 2 = 1,2 => 1
0,2 * 2 = 0,4 => 0
0,4 * 2 = 0,8 => 0
0,8 * 2 = 1,6 => 1
0,6 * 2 = ... [ad infinitum]
Ce qui donne en valeur approchée 01001. Mais ce n'est qu'une valeur approchée et si tu reconvertis en décimal, ça te donnera
1 * 1/4 + 1 * 1/32 = 9/32 = 0,28 et non 0,3. Tu peux d'ailleurs tester en ouvrant une fenêtre Python et en tapant 0.3 ou mieux, 0.1 + 0.1 + 0.1 - 0.3
 
Et donc si tu as besoin d'utiliser des nombres à virgule avec précision exacte, il te faut passer par l'import decimal puis utiliser decimal.Decimal("0.3" ). Cet objet code les nombres en 2 parties (partie entière et partie décimale) mais permet d'y faire des opérations simples comme addition, soustraction, multiplication, division et même racine. C'est un peu plus long vu que les calculs se font chiffre à chiffre mais c'est rigoureusement exact.


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
ImageMagick: convert: couleur de texte = "négatif" ?Redirection et envoi de données en POST avec applet Java
Type de données incompatible dans l'expression du critèreconnecter à une base de données Mysql via ODBC à partir d'un programme
Afficher texte au survol javascriptVBS Copier le nom d'un fichier
récupérer une ligne de texte pointée dans un fichier txt[Résolu][VBA] Importer des données d'un fichier.txt
Plus de sujets relatifs à : lecture/écriture fichier texte et conversion en données numériques


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