NaN erreur : Probleme à 1 million d'euros ... ou presque

ltchris

evidemment c le contraire que je voulais ecrire :D
qd tu passe de double à float les naN sont plus proche. Ce qui parait normal dans l'hypothese de la precision qui fout la merde!

j'edit cette phrase desuite.

avoue que sinon t'aurai rien eu a dire ! et puis ca a fait un petit moment de suspens ! Bref j'essaye de justifier le fait que je me suis trompé ;)

fredericmazue

Quote:
n'as-t'on pas du tout de NaN ? ou alors se produit'il trop loin pour qu'on l'observe ?

Moi pas comprendre.

Ce que je peux dire c'est

1) J'ai lancé une myriade fois le code avec matrice aléatoire avec Math.random() mais en forçant, la non nullité de coordonnées et je n'ai pas vu seul Nan

2) j'ai fait pareil avec Math.random() * 0.0001 et je n'ai pas vu un NaN

3) j'ai fait pareil avec Math.random() * 0.0000001 et j'ai vu des Nan

4) j'ai donc raison depuis longtemps: le code et les fonctions mathématique sont convenables avec des coordonnées non nulles. Mais au voisinage des zéros la division par zéro est problèmatique ce qui est quand même normal, Java ou pas.

5) je voudrais bien savoir où facturer pour le million d'Euro.

ltchris

par contre j'ai un code tout pret avec une matrice tout jolie qui donne du naN à 26. Le code est adapté pour lire les fichiers txt ou il y a la matrice d'ecrite.
Donc y'a le code Geotest, et la matrice qu'il faut mettre dans un fichier test_matrix_30.txt, et puis creer une methode qui lit cette matrice (moi je l'ai dcette methode, mais secret defense je la garde, et en plus ca marche pas chez certain)

desolé pour le post immense, mais j'ai pas reussi à mettre sur mon serveur web, il plante ce con, pil poil quand j'en ai besoin !


Le code de Geotest.java


import java.io.File;
import java.util.ArrayList;

class Geotest {
    final int NB_POINTS = 30;
    // type Matrice de départ :  0 = c'est nous qui la créons ;  1 = aléatoire ; 2=on la lit dans un fichier
    final int typeMat = 2;
    /* typeAffichage : 
     *  0 = on affiche toutes les étapes de calcul
     *  1 = on affiche juste résultats
     *  2 = on affiche juste quand y'a du NaN    */  
    public int typeAffichage = 2;
    
    
    
    //  n = nombre de points
    //  m = dimension de l'espace
    private int n = NB_POINTS;
   
    private int m = NB_POINTS - 1;
    
    // Matrice des positions initiales
    public double[][] coordonneesInitiales = new double[n][m];;
                                     
    // Matrice des positions reconstruites par l'algorithme
    public double[][] coordonnees = new double[n][m];
   
    // Matrice des distances
    public double[][] distances = new double[n][n];
    
    // vecteur pour controle de division par zero
    // zeroPos[0]=position en i ; zeroPos[1]=position en j ; zeroPos[2] = valeur de coord
    public double[] zeroPos = { -1,-1,-1};
   
    // petite methode pour calculer un carre
    double carre(double x) {
        return x * x;
    }
   
    // Calcul de la distance euclidienne pour la matrice de position
    double dist(double[][] coords, int a, int b) {
        double sum = 0;
        for (int i = 0; i < m; i++) {
            sum = sum + carre(coords[a][i] - coords[b][i]);
        }
        return Math.sqrt(sum);
    }
   
    public void creationMatrice(int type){
    	if(typeAffichage==0) System.out.println("Matrice Initiale");
    	switch(type) {
    	case 0 : 
    		// ON cree nous même la matrice
    			double[][] temp =  
    			{
    			        { 0.0, 0.0, 0.0 } ,
    			        { 2.0, 0.0, 0.0 },
    			        { 7.0, 0.0, 0.0 },
    			        { 0.0, 1.0, 2.0 } 
    			};
    			for(int i=0;i<n;i++){
    				if(typeAffichage==0) System.out.print(i + "=>   ");
    				for(int j=0;j<m;j++){
    					coordonneesInitiales[i][j]= temp[i][j]; 
    					if(typeAffichage==0) System.out.print(coordonneesInitiales[i][j] + " ");
    				}
    				if(typeAffichage==0) System.out.println();
    			}
    			break;
 		
       	case 1 :
       		// On crée une matrice triangulaire aléatoire
       		for (int i = 0; i < n; i++) {
       			if(typeAffichage==0) System.out.print(i + "=>   ");
    			for (int j = 0; j < i; j++) {
    				coordonneesInitiales[i][j] = (Math.random()*10);
    				if(typeAffichage==0) System.out.print(coordonneesInitiales[i][j] + " ");
    			}
    			if(typeAffichage==0) System.out.println();
    		}
       		break;
       	case 2 :
       		coordonneesInitiales = readMatrixFromFile(new File("test_matrix_30.txt"));
    	}
    }
    
    public void executeTest() {
       
    	creationMatrice(typeMat);
       
        // On calcul les distances euclidiennes entre les points
    	if(typeAffichage==0) System.out.println("Matrice distance");
        for (int i = 0; i < n; i++) {
            //System.out.print(i + "=>   ");
            for (int j = 0; j < m; j++) {
                distances[i][j] = dist(coordonneesInitiales, i, j);
                distances[j][i] = dist(coordonneesInitiales, i, j);
                if(typeAffichage==0) System.out.print(distances[i][j] + " ");
              
            }
            if(typeAffichage==0) System.out.println();
        }
       
        
        if(typeAffichage==0) System.out.println("Matrice Résultat (intermediaire)");
        if(typeAffichage==0) System.out.print("1=>   ");
        // Le premier point a tout ces coordonnées nulles
        // Le deuxième n'a qu'une seule coordonnée nulle
        coordonnees[1][0] = distances[1][0];
        if(typeAffichage==0) System.out.println(coordonneesInitiales[1][0] + " ");
       
        /* On lance notre algorithme pour trouver les coordonnées des points 3 à n */
        double zero = 0;
        for (int WichPoint = 2; WichPoint < n; WichPoint++) {
            int i = WichPoint; // je met i juste pour simplifier le code, et Wichpoint pour comprendre de
            // quoi je parle
            if(typeAffichage==0) System.out.print(i + "=>   ");
            // La norme du vecteur sera sa distance au point 1
            double norme = carre(distances[0][i]);
           
            // On calcul d'abord les n-2 premières coordonnées du point courant
            for (int p = 0; p < i - 1; p++) {
                coordonnees[i][p] = norme - carre(distances[p + 1][i]) + carre(distances[p + 1][0]);
                if(typeAffichage==0) System.out.print("p=" + p + "  norme-d²=" + coordonnees[i][p]);
                double sumCoord = 0;
                for (int k = 0; k <= p - 1; k++) {
                    sumCoord += coordonnees[i][k] * coordonnees[p + 1][k];
                    
                }
                if(typeAffichage==0) System.out.print("  sumCoord=" + sumCoord + " ");
                coordonnees[i][p] = coordonnees[i][p] - 2 * sumCoord;
                coordonnees[i][p] = coordonnees[i][p] / (2 * coordonnees[p + 1][p]);
                if(typeAffichage==0) System.out.print("  x=" + coordonnees[i][p] + " ");
                if(typeAffichage==0) System.out.println();
            }
            if(typeAffichage==0) System.out.println();
            // On calcul enfin la dernière coord du point courant en utilisant les coord calculés à
            // l'instant
            double sumSQR = 0;
            for (int j = 0; j < i - 1; j++) {
                sumSQR += carre(coordonnees[i][j]);
            }
           
            // Le dernier calcul devrait tjs etre vrai car norme > sumSQR (mathematiquement j'entend)
            coordonnees[i][i - 1] = Math.sqrt(norme - sumSQR);
            // on test si un des résultats s'approche de zero = controle division par zero
            if(Math.abs(coordonnees[i][i-1])<0.0000001){
            	System.out.println(" petit resultat= " + coordonnees[i][i-1]);
            	zeroPos[0]=i;
            	zeroPos[1]=i-1;
            	zeroPos[2]=coordonnees[i][i-1];
            }
            // Or y'a du NaN ???? donc norme < sumSQR et c pas normal !!!
           
            // On test le dernier calcul voir quand apparait ce NaN
            if (Double.isNaN(coordonnees[i][i - 1]) == true && zero == 0) {
                zero++;
                System.out.println("Nan a " + i);
                System.out.println("  Position du zero : i=" + zeroPos[0] + " j=" + zeroPos[1] + " coord="+ zeroPos[2]);
                if(typeAffichage==0) typeAffichage=2; // on chg la valeur pour arreter l'affichage au NaN
            }
        }
        if(typeAffichage==1) System.out.println("Matrice resultat");
        for (int i = 0; i < n; i++) {
        	if(typeAffichage==1) System.out.print(i + "=>   ");
            for (int j = 0; j < i; j++) {
            	if(typeAffichage==1) System.out.print(coordonnees[i][j] + " ");
            }
            if(typeAffichage==1) System.out.println();
        }
       
    } 
   
    public static void main(String[] args) {
        Geotest test = new Geotest();
        test.executeTest();
    }
    
    
    
} 

La matrice à mettre dans un fichier : test_matrix_30.txt

0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0
0.884835806012859	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0
0.832323022491365	0.036436172600721406	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0
0.6311192536331574	0.14478180244547423	0.5527677037634355	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0
0.08184903783612796	0.6588912437932238	0.0697487389959821	0.9657546713477779	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0
0.22592785222362266	0.34957171919571906	0.25930577548043454	0.28720262564280796	0.8257459423735519	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0
0.8187799329907967	0.16607371464830267	0.0899651075652369	0.8037861437337379	0.06692412952536086	0.3830089592478706	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0
0.6036319349074115	0.8061170205012897	0.20631045715173257	0.0763491981832567	0.20183912779389912	0.0709429937370265	0.8346381605358244	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0
0.5376393261288451	0.2392273122277907	0.11034203697155409	0.5534465532984181	0.032358956098987424	0.3308527119632809	0.5277312274051124	0.20136845011272553	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0
0.6080232310855562	0.6287683180402466	0.29457707194469585	0.9745841154396978	0.29123141125765717	0.6436578229371733	0.59209389257074	0.24065827612475243	0.15098816879726973	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0
0.6838181292842362	0.8871504446433999	0.5169824034659658	0.03472491005273337	0.03945071636435493	0.25633105834411407	0.7813329874143402	0.39379966488729146	0.6271361575830806	0.09807454682713668	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0
0.009596166258000971	0.5068553726787381	0.9275302694581542	0.28004055882238454	0.5944974254860023	0.58226870706289	0.6987337390887098	0.45732948992590905	0.08921492604095416	0.6750223393072425	0.12845254313998145	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0
0.7669088036608006	0.5410435187311502	0.08868563397704865	0.7999789260236976	0.35457511414755705	0.5328156002343838	0.9497900247446245	0.09018776590491695	0.2230079300109592	0.9335745476779055	0.9397371335031128	0.3921571885395051	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0
0.7029474347610151	0.27503475998381066	0.7484791336050535	0.8606858420857649	0.44425554425454017	0.6166520470378947	0.6745622309783114	0.21589369184573592	0.19959566408785046	0.7396668133833951	0.937726219937573	0.5082571614695286	0.8306933354885354	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0
0.5192716716751788	0.6931038669531542	0.6478436368543566	0.9056165177038288	0.364094211409536	0.4401664103959686	0.9311741349398815	0.9752408017397829	0.6834744467547265	0.5049119226509414	0.7610570818023241	0.11804139949045112	0.44555615083950506	0.5403959545153296	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0
0.24790062798036194	0.6245802591061037	0.02299943862293541	0.5385543448284509	0.40542420410535396	0.7565333155992402	0.6881619243289825	0.6753708309659225	0.20935479866825135	0.3598294865605631	0.315884199622388	0.4217923549019098	0.8746073230487217	0.73744934293672	0.07955490763486939	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0
0.7443977019849305	0.32461192339799694	0.594658243671378	0.18491917985553952	0.8926759991485461	0.975866216262537	0.05792518185789797	0.9761340121600734	0.22387319898751912	0.6414534843739419	0.7385048724129606	0.06986246655010164	0.7517165389378858	0.5691825215961611	0.5626378943476783	0.525738272431683	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0
0.621928241339715	0.37316866252696657	0.6225491979688798	0.44532097698559814	0.5152915131199974	0.8920897647897882	0.6159030817065331	0.8067011806223844	0.05813318503004128	0.8130145024442241	0.53609808126326	0.7882043836774667	0.6804392024928498	0.23661528884559813	0.1517628339878575	0.312180832607311	0.003420451068332886	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0
0.22774104942876683	0.47103980086849695	0.04865814364734389	0.7611983210254031	0.7947402008134099	0.8247206083457889	0.6586722517970199	0.46538046760158025	0.6715876582230207	0.4220235201682627	0.6283816199032652	0.5066494476917603	0.7387836044426609	0.2337794057938185	0.6476080967998145	0.154087612828125	0.9121567213588406	0.8400201887870318	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0
0.12023788302525129	0.960814343967968	0.8531173610755111	0.44243929177426666	0.058953903087271775	0.41361201505179956	0.9095711880314575	0.5869208584936199	0.3130611288259523	0.2745695441869207	0.28361780369509115	0.2673107715999822	0.8057043701899983	0.9543737851986248	0.5403219202943735	0.9888290680637707	0.21556820312427083	0.42973008813147673	0.2212604453380168	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0
0.05800008852007754	0.3281866434317975	0.6714956647975279	0.5072112053184524	0.8357030910447685	0.1032802813603445	0.28546020774433434	0.5862639801253183	0.9409226648984181	0.3570769303659157	0.08431052318666254	0.6267988653930325	0.42500478286349697	0.8423611270345855	0.6071667404772269	0.02918981928658304	0.7497011938409323	0.4240370193197428	0.18217991791479338	0.9357569491361837	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0
0.9970108286715035	0.994278088457864	0.9880318054865044	0.81540357219017	0.11480426648433284	0.7488763026041543	0.7117798317243613	0.3075393934378705	0.15944289740049178	0.455192101333342	0.8233408057703047	0.40930445398397264	0.43508206463405996	0.38214620706999647	0.19101003105368686	0.5207728258676576	0.14907295790721597	0.6339828194041424	0.7477621359921874	0.8247291267171366	0.7038553541413224	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0
0.7320728953382243	0.1846832712036417	0.9707748747189795	0.027959823096946335	0.4228155653704516	0.195734770845143	0.0579359928001123	0.4122137350123425	0.8547346113949698	0.6271503237196656	0.46560622347683367	0.16197342377363821	0.46415569531901957	0.9951201509537538	0.16957642532170636	0.0021798232239363946	0.13638988405533958	0.22701752052103563	0.7980623820001497	0.5792628259519104	0.468137106121558	0.15427416118880943	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0
0.8320589615310925	0.5923952978867936	0.2468629545366383	0.2391127083718807	0.03501191039459228	0.05632442632373913	0.5841910676408687	0.25269620698801876	0.4087128471458996	0.9489851981579431	0.4928923659733343	0.13885598785088027	0.7154869561083419	0.029326347065554037	0.08084140139604479	0.09541075887402761	0.8811571887623337	0.9242566941164151	0.9503494461929138	0.9841915401960744	0.3989324602470009	0.6783456509431589	0.8375725973075101	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0
0.5412384229174511	0.19128184125813286	0.8358886042448742	0.00423255452971516	0.5002367448183707	0.25502039282906797	0.7821742712402913	0.40267674861220903	0.6651121234029616	0.8142465184323083	0.5092678017748492	0.17534333970814953	0.17180470459565955	0.6364350675043261	0.1913499570932785	0.620985904020291	0.6645952393793091	0.6289039184963455	0.9556289539016877	0.36255158737755666	0.8789567617207328	0.8260360519187775	0.017068791859279453	0.08539575445650627	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0
0.17075734840653878	0.40205377734391234	0.9086536690716341	0.8795545988562985	0.8607408604445984	0.3998045975886013	0.8836351455163112	0.9160872907105595	0.873564367027216	0.4529335443561986	0.6921853398849701	0.9150373294900491	0.042272302235482284	0.8969800831150255	0.8421054324580372	0.6213522226797684	0.6219390318475704	0.314352019975231	0.14171604739025556	0.2951399061847215	0.010313055168913565	0.7387927447798781	0.7927821242773831	0.043928833781175736	0.40864790725833877	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0
0.45687261092718146	0.5523016131479356	0.6771383576382142	0.1725056787814474	0.5871986891648072	0.5142140387246676	0.6467543219867836	0.9001715565852147	0.392451864325182	0.8755611871900919	0.5532449309622605	0.8854185402934808	0.5850236779007731	0.6463591830709612	0.6420396975620302	0.42171365291675134	0.7239399588854027	0.6384174359028641	0.6934344913202377	0.5865580928610735	0.16892186545531784	0.2255665083384878	0.7175740265686558	0.5575055993443997	0.9568492987736473	0.30623388932167106	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0
0.9062027747751876	0.2155048247070046	0.39655571929389244	0.6190326812654285	0.3641636059243415	0.7765628148421408	0.1397972550168709	0.06300532560124261	0.24616331134887448	0.4593288956601348	0.9794032958721697	0.9563903571268112	0.05811280692620169	0.7440488755407824	0.6500296395811282	0.2312577596011759	0.04738873633206486	0.6074419581945975	0.4625993923682621	0.4060838144096858	0.8026527020217352	0.2284038389877312	0.6904309645009424	0.8043140847123768	0.41140309078002013	0.051041023035695465	0.24321642723681047	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0
0.8941887250369136	0.7822235337314847	0.7643930827083455	0.3144276613796638	0.8135817486005854	0.028731283718802292	0.7123011569966703	0.368391696153732	0.11333173487325543	0.1335176098935852	0.4822325599765829	0.0451907979335503	0.5035185194429305	0.4629118029063213	0.9384726868487052	0.3047069383899782	0.9193666058563429	0.08718861707922465	0.7629472585964651	0.4055441614253362	0.5369329244993848	0.2758792564556588	0.6460395851296205	0.12022662921509597	0.46346287015770127	0.9841337053812017	0.6301185495352376	0.9249842531105986	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0
0.7032752462317123	0.623622556493114	0.7500952257836828	0.7706013133485501	0.657263323033316	0.9202545226891166	0.038177203759164335	0.44021848822578324	0.8525755460530731	0.20102545381837644	0.16409141812818662	0.43064192567302406	0.8187665953415513	0.023603633609766694	0.46739778646457864	0.7556274080337204	0.027684965999322575	0.6647952272886908	0.9051174658327739	0.06277177930610689	0.5965912143443002	0.6178223297829308	0.4857512592091937	0.9800577274467146	0.01747633882091848	0.9133862294438387	0.08986515195656775	0.6637620852881948	0.5202770137895673	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0	0
[/code]
ltchris

Quote:
Quote:
n'as-t'on pas du tout de NaN ? ou alors se produit'il trop loin pour qu'on l'observe ?

Moi pas comprendre.

ben plus le nombre de points est grand plus on des chances de touver un NaN, et dans ton cas si tu fait avec une matrice de 100 tu va rien trouver, alors qu'avec n=1000 tu va en trouver du NaN

Quote:
1) J'ai lancé une myriade fois le code avec matrice aléatoire avec Math.random() mais en forçant, la non nullité de coordonnées et je n'ai pas vu seul Nan

tu as lancé avec quel nombre de points ?

Quote:
3) j'ai fait pareil avec Math.random() * 0.0000001 et j'ai vu des Nan

si tu force la division par zero, tu va en trouver.

Quote:
4) j'ai donc raison depuis longtemps: le code et les fonctions mathématique sont convenables avec des coordonnées non nulles. Mais au voisinage des zéros la division par zéro est problèmatique ce qui est quand même normal, Java ou pas.

certe! mais dans une execution normal, on est jamais proche de zero. Mon avant dernier code avec le test de non nullite t'en convaincra!

Quote:
5) je voudrais bien savoir où facturer pour le million d'Euro.
alors le nom c'est Jean Vouarnac, 13 place de la sainte redemption, 11111 desole cedex
fredericmazue

Sans vouloir ton peiner, il est bien compliqué ton code BBReader :shock:

Au fait pendant que j'y pense: mets tes classes dans des PACKAGES screugneugneu (arf ces scientifiques) :evil: :evil:

Donc bien compliqué disais je ce code, avec des buffers psychédéliques ...
final byte[] r_buffer = new byte[500000];

Rien que ça.... :shock:
Pourquoi faire simple quand on peut faire compliqué... (arf ces scientifiques)

Bref quand j'ai vu ce code, mauvaise langue comme je suis, je me suis dit:" va pas marcher ce tromblon". Bref, téméraire, je fais quand même un copier/coller et quoi ?

Exception in thread "main" java.lang.NumberFormatException: For input string: "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1224)
at java.lang.Double.parseDouble(Double.java:510)
at readtest.Geotest.readMatrixFromFile(Geotest.java:202)
at readtest.Geotest.creationMatrice(Geotest.java:84)
at readtest.Geotest.executeTest(Geotest.java:90)
at readtest.Geotest.main(Geotest.java:177)
Java Result: 1

:twisted: :lol:

Alors toi, comanktafé pour avoir du NaN avec un code qui marche pas.. Sasréti pas des fois que tu as lancé une autre classe que celle que tu croyais, avec ta manie de pas les mettre dans un package...

Et puis je ne vois pas ce que tu cherches, obstiné que tu es, de plus que ce que je t'ai dis dans mon post où je dis "J'ai lancé une myriade fois le code". Les choses ne peuvent pas être plus claires...
Tes formules marchent sauf au voisinage de 0, parce que là tu t'étais planté. Parce qu'on à pas le droit de diviser par zéro quoi... C'est tout. (arf...)

MON CHEEEQQUUUEEEEEEE !!!!!!!!!!!!
:twisted: :twisted: :twisted:

ltchris

Mes excuses, j'ai pas voulu me faire chié, en postant le code de lecture de fichier que j'utilise, mais il marche chez moi et pas chez les autres, bref je pense que vous s'aurez faire un code pour lire cette matrice

Quote:
Et puis je ne vois pas ce que tu cherches, obstiné que tu es, de plus que ce que je t'ai dis dans mon post où je dis "J'ai lancé une myriade fois le code". Les choses ne peuvent pas être plus claires...

Lance mon code en mode matrice aléatoire avec 20 points t'aura pas de naN , avec 500 t'en aura,c'est tout. donc je demandais avec combien de point t'avais testé ?

Et c'est toi qu'es borné, les valeurs au voisinage de zero, y'en a pratiquelment aucune quand on lance l'algo avec des matrices aléatoires et pourtant on a du Nan!

fredericmazue

Quote:
j'ai pas voulu me faire chié, en postant le code de lecture de fichier que j'utilise, mais il marche chez moi et pas chez les autres

cool 8)
Quote:
bref je pense que vous s'aurez faire un code pour lire cette matrice

Ben tiens, on a que ça à faire :lol:
Que tu ne veuilles pas te faire chier est quelque chose que je conçois volontiers. Par contre quand d'autres t'aident, (bénévolement, n'est-ce pas M Vouarnac ;) ) il faut essayer de savoir jusqu'où tu peux user les patiences :lol:

Quote:

Lance mon code en mode matrice aléatoire avec 20 points, t'aura pas de naN avec 500 t'en aura

Effectivement.

Quote:
Et c'est toi qu'es borné, les valeurs au voisinage de zero, y'en a pratiquelment aucune quand on lance l'algo avec des matrices aléatoires et pourtant on a du Nan!

:lol:
Borné et obtu, tout le monde le sait ici.
Le borné dit quand même que plus les valeurs sont petites plus les NaN apparaissent vite.

Ce que je remarque aussi, c'est que les Nan apparaissent (chez moi du moins) en bas et à droite du triangle de la matrice triangulaire résultat, où ils y forment à leur tour un triangle.
On dirait que tu as inventés le NaN de Sierpinski :lol:
Sans doute le matheux averti que tu es, et que n'étant pas allé à l'école je ne suis pas, saura comprendre le pourquoi du comment.
Mais à ce niveau, je ne pense pas que le problème soit dans Java ou dans le code stricto sensu.

ltchris

desole pour le :

Quote:
bref je pense que vous s'aurez faire un code pour lire cette matrice

Je voulez flatter vos ego en fait ;) mais effectivement lu comme tu la lu ca fait vraiment : demerdez vous a debbuger mon code ! et plus vite que ca!
Mille excuses encore une fois !

Les valeurs petites qui donnent du NaN c'est ok, mathématiquement je sais pourquoi, mais c loin d'etre La raison du NaN.

après : NaN de Sierpinski , aucune idée de ce que c'est, je vais voir mes amis wikipedia et google, ils auront la réponse.

fredericmazue

Quote:
Mille excuses encore une fois !

Pas de problème :)
Et puis sur ce forum j'en ai vu d'autres.

Quote:
mais c loin d'etre La raison du NaN.

Mais là je dirais que c'est dans tes formules que ça se passe. Et non dans leur codagre. Alors je crains de ne pas t'être d'une grande aide. Même si sur le fond le problème m'intéresse.

D'ailleurs question naïve... quand tu cherches des coordonnées, à partir de distances, les solutions ne sont pas uniques. Tes formules ne donnent qu'une solution unique. Mais je pense que ceci est chose évidente pour toi et que tu y as pensé.

Quote:
NaN de Sierpinski , aucune idée de ce que c'est

Un triangle de Sierpinski construit avec des NaN :lol:
willbback
Bon, je vais encore me mêler de la chose...

Comme je ne sais pas faire des maths, et comme je ne fais qu'une chose de bien, c'est de tracer l'exécution du programme, je vous propose de modifier légèrement la boucle du calcul de sumSQR avec la code que voici :

            double sumSQRant = 0;
            for (int j = 0; j < i - 1; j++) {
                sumSQR += carre(coordonnees[i][j]);
                if (Double.isNaN(sumSQR)) {
                	System.out.println("NaN dans le carré sumSQRant, coordonnees[i][j], carre(coordonnees[i][j]):"+sumSQRant+"|"+coordonnees[i][j]+"|"+(carre(coordonnees[i][j])));
                }
                sumSQRant = sumSQR;
            }

Bref, je cherche simplement ou se déclenche le NaN. (je vais finir par aller manger Indien à force de parler de NaN .... j'ai pas pu m'empêcher de la faire celle-là).
J'ai déclenché plusieurs éxécutions aléatoires, car j'ai la flemme d'écrire la fonction de lecture du fichier, mais bon, je ferais peut-être ça plus tard...
Et voilà ce que j'obtiens comme résultat :
NaN dans le carré i, j, sumSQRant, coordonnees[i][j], carre(coordonnees[i][j]):37|35|15.706202875865124|NaN|NaN
NaN dans le carré i, j, sumSQRant, coordonnees[i][j], carre(coordonnees[i][j]):38|35|11.689362043699964|NaN|NaN
NaN dans le carré i, j, sumSQRant, coordonnees[i][j], carre(coordonnees[i][j]):38|36|NaN|NaN|NaN
NaN dans le carré i, j, sumSQRant, coordonnees[i][j], carre(coordonnees[i][j]):39|35|10.739514060053297|NaN|NaN
NaN dans le carré i, j, sumSQRant, coordonnees[i][j], carre(coordonnees[i][j]):39|36|NaN|NaN|NaN
NaN dans le carré i, j, sumSQRant, coordonnees[i][j], carre(coordonnees[i][j]):39|37|NaN|NaN|NaN

Le Nan se propage car il s'appuit sur un Nan précédement calculé. Le Nan précédement calculé provient de la racine carré d'un nombre négatif.
J'ai fait afficher norme et sumSQR côte à côte et l'on voit bien le phénomène se produire (sumSQR>norme)
Même en utilisant des BigDécimaux, le problème se pose également.
Donc si tout est juste (formule math, algo etc...), soit java ne peut pas t'apporte la précision que nécessite tes calculs, donc change de language pour faire ton problème, soit, puisque le problème temps a disparaître avec des nombres plus grands, transpose tes unités de mesure si c'est possible (*100 ou *1000) et ton problème sera résolue. En tout cas, je lirai la suite de cette aventure avec plaisir, mais là moi, je jette l'éponge
ltchris

transposer mes unités de mesure c'est une idée auquel je vais réfléchir !

Hier dans le ReR de retour j'ai eu une idée sur comment le naN pourrai apparaitre qui me semble bonne. Faut que je fasse un peu de math pour le prouver donc je vais voir ca aujourd'hui, je vous tiens au courant si y'a des news!

fredericmazue

Quote:
transposer mes unités de mesure c'est une idée auquel je vais réfléchir !

Déjà fait. Mais je me demande si je l'ai dit hier.
J'ai lancé un calcul sur mille points aléatoires, mais sans valuer nulle tirés par Math.random() *1000 et j'ai vu du NaN. Sans doute comme dit willbback un Nan qui se propage en effet, d'où une apparition en remplissage d'un triangle en bas à droite de la matrice résultat.
Quote:
Hier dans le ReR de retour

Allo ?

Quote:
que je fasse un peu de math pour le prouver donc je vais voir ca aujourd'hui, je vous tiens au courant si y'a des news!

Oui tiens nous au courant. Ca m'intéresse, bien que, je dois l'avouer, je n'ai toujours pas regardé tes formules de près faute de temps :oops: En admettant par ailleurs que j'en sois capable ce qui n'est pas sûr du tout :)
ltchris
yahoooooooo !!!!!!

fredericmazue wrote:

Quote:
Hier dans le ReR de retour

Allo ?

ben le RER quoi ?!

Bon j'annonce solenellement que je tiens quelque chose de carrèment bien, et qui expliquerai tout !

Mais d'abord faisons encore une fois un résumé de ce que je veux faire :

J'ai une matrice de distance et je veux trouver une matrice de position.

J'ai donc un programme de test, qui lui tire une matrice au hasard (triangulaire) calcul les distances et a partir de celle ci trouve la matrice position. Ce programme plante au bout d'un moment en ressortant du NaN.
Une facon de controler la justesse de ce programme est de verifier que les distances entre les points reconstruit sont bien les mêmes que celle de la matrice de distance de départ. Et ca je le verifie parfaitement à 10^-15 près en moyenne.
Il y a un mois je vérifiais si mon programme était correcte d'une autre manière : Je regardais la différence entre la matrice de positionInitiale et la matrice de positionFinale. Et cette étude nous montrait une divergence (desole je me rend compte que je suis con je vous l'ai jamais dit). C'est a dire que sur la diagonale des matrices position plus on avance et plus la difference est grande (10^-17 puis 10-16 puis 10^-15 etc ...).

Alors pourquoi je ne vous l'avais pas dit, et que maintenant je ressors cette histoire de divergence des positions du chapeau ?
C'est parce que les distances, elles, ne montrent aucune divergence. Cette matrice de distance étant la seule accessible dans mon programme futur, et donc la seule matrice interessante, et sur lequel je dois me baser, dans mon futur programme la matrice positionInitiales ne sera pas accessible.
J'avais donc éludé la question des divergences de position en me disant que y'avait pas de raison pour que la matrice positionInitiales et la Finale soit les mêmes . alors que si !!!
J'ai montré ce matin avec les math que c obligatoirement les mêmes! Donc la divergence qu'on observe reflete totalement une divergence dans l'algorithme!!!!

La blague qui fait qu'on le voit pas est que : Les positions divergent, mais la structure de mes équations font que les distances ne connaissent aucune divergence! et cela est du au fait que mes calculs utilisent les distances pour trouver les positions.

En résumé : Moi y'en a avoir une matrice diagonale de position au départ -> moi y'en a retrouver la même à la fin, mais ca y'en pas marcher car ca diverge. Mais moi y'en a pas le voir avec ma facon de verifier les calculs, car les distances entre les positions y'en a rester constante à cause de la structure de mes équations!
Bref moi y'en a tres tres content d'avoir trouvé ca !!!

C la fête, merci à tous pour votre aide. Ca m'a permis de bien defricher ce qui pouvait etre et ce qui ne pouvait pas être.
Maintenant si le sujet vous interesse vraiment la question nouvelle est de savoir, comment controler la divergence ???

Car dans mon programme finale je n'aurai aucun acces à la matrice positionInitiales, il faut que je me demerde juste avec la matrice de distance pour controler cette divergence! or cette matrice ne subit aucune divergence .... :roll:
Ah la recherche, j'adore ! maintenant je sais ou je dois aller, j'ai plus l'impression d'etre emprisonné par l'ordi, ca soulage.
On the road again .... :P

willbback
Euh!!!!!!!!!!!!!

J'ai absolument rien compris à ton explication.... Ce qui veut dire que ce n'est plus un problème de précision de Java, c'est ça ? :?
J'ai refait des essais et c'est bien sumSQR qui devient supérieur à norme dans certain cas. Un NaN apparaît alors dans la matrice coordonnee, puis est utilisé dans les calculs de la boucle suivante, provancant alors un autre Nan et ainsi de suite. C'est pour celà que les Nan sont bien rangé dans la matrice.
Le fichier qui fait des Nan à tous les coups sans 0 null part :

0.0   
0.8258121228762393 
0.4351105287438414 0.12237432932435299 
0.5327709474189217 0.7000459275363958 0.21350011408574165 
0.9406325879391644 0.9000275618058943 0.021725656204959032 0.815383627170236 
0.1797104572213044 0.31231995251951916 0.8870431599995025 0.8220554334452608 0.3751891134624348 
0.5844473799251894 0.9999269451081397 0.37665415966694915 0.43004036625705677 0.164237820048297 0.4822209130496964 
0.997493184405741 0.32838913237765643 0.9972477584284324 0.4863387322095235 0.9897429335445984 0.45596643283329497 0.2213962789992766 
0.5823486276504557 0.7137956791549614 0.9801641677145397 0.7003526146874178 0.423669260884759 0.3524337996911785 0.5404544481654118 0.6789113487239924 
0.5090344354992934 0.23396019185543493 0.5790385145954299 0.6492523307995289 0.953110224066749 0.21474015377536848 0.0019404585347156944 0.8538977344257871 0.05412568727828482 
0.10214156523646223 0.5023643077489098 0.7193414499027627 0.10410371379066807 0.6076504148761512 0.8009830036597285 0.913741262420347 0.3257562980563513 0.8599771514245075 0.261930133708428 
0.6527274323958945 0.039834114433238366 0.07925869317989609 0.8286171031291222 0.33929566831779057 0.16769739855291577 0.6159998758325982 0.9900991893238641 0.6169169286427709 0.9561015419772351 0.19218704092528138 
0.536566046540919 0.4394098165883328 0.37466739726764864 0.8470460809220901 0.1916338413054196 0.8167858049475911 0.9812326902994241 0.7862054013796586 0.8194673596422478 0.48319192543715905 0.17625784532837185 0.06056430373595134 
0.7963622382504586 0.8512388503889449 0.6746856495600004 0.759955627675495 0.3092692628845992 0.26641680839530524 0.7121311867100979 0.1967309660140707 0.797843494596559 0.7559660942034603 0.9720046992527608 0.3756856192352718 0.4919536594127477 
0.17848226696792324 0.47114677822669093 0.8992796448798065 0.013187641843781739 0.9237011025132872 0.6737816782469808 0.34090020838379254 0.30674221477144104 0.08632129394724075 0.9170714482126415 0.03394994016118291 0.7491867100272276 0.34338834055046075 0.8262796736099111 
0.1708344946989927 0.13794133438002865 0.601675856653144 0.7735305983168326 0.0834620773447281 0.40991302302417887 0.8496652895473352 0.5913756826949271 0.5856564310635599 0.3595828618294489 0.5481390314674033 0.6908564227995901 0.2979238657223906 0.33094101852283164 0.3240657562456247 
0.45347847457198354 0.9463044856283235 0.8430161773918762 0.6943711322645969 0.26748936151360914 0.7295758154533992 0.3753488326991089 0.03935071239374843 0.861077627282576 0.9828670718910154 0.08760831863177443 0.06989664135865903 0.648588951178112 0.5307810256509246 0.07665605728610747 0.5883727520077309 
0.6505802426673418 0.3194092656275569 0.8847083016975545 0.42988787614075097 0.1745103624901846 0.14416590798572648 0.36385361851002573 0.08888045161129143 0.8500915313153401 0.5491540745741775 0.6750317957960065 0.6853417157396376 0.801803122958776 0.26381806734400315 0.15368228243467308 0.605669131012305 0.7107954043046945 
0.8639236082341686 0.009622366681606542 0.36505561145291754 0.269387694607114 0.6964474561856909 0.34531589265060125 0.9814837708400468 0.06359156975744162 0.4917467506059039 0.7745459110494485 0.4258092723355117 0.23256700992605361 0.5014173104049443 0.0026056883887644045 0.5180807706649168 0.3486450697125939 0.44653982314476115 0.08947389416686924 
0.9771580634292424 0.8375281807386941 0.03855087158033632 0.7590419058522968 0.19885471370699037 0.9155046882850341 0.3437660435434532 0.040312243600516884 0.7372445005693308 0.45899169942561646 0.8026202320531561 0.7305888692852841 0.3944361737545805 0.4414465614950215 0.28598027509398316 0.6560318615512218 0.2860340804173168 0.5736634887321116 0.1734235684916643 
0.47154993103430876 0.24266706557528084 0.5656991142621228 0.07216535650347089 0.7898569306505807 0.4323816731940394 0.9921466204178492 0.46035707802794 0.758618385165259 0.1443596712982259 0.087205379276866 0.23476612694745502 0.8149676090309681 0.2613346795092788 0.9219686475662245 0.8703877261629895 0.2382707064406021 0.06624552367507208 0.323579531049086 0.6583274436834983 
0.2948728350374673 0.6780793650262101 0.5843810057353855 0.2783330385703626 0.22265830627483585 0.5925205990733998 0.4789131608550383 0.783642478372054 0.03861002365795041 0.5149363582904368 0.35758656932920685 0.9283545302816857 0.1691540606157722 0.9163929489559774 0.11808817803631566 0.6513175074710358 0.20092763581012119 0.5178119266274275 0.6690517364138275 0.44557037108500697 0.6287099578315583 
0.21303884271997564 0.09525212414296103 0.28865954990627185 0.3376068288670421 0.7785107695689634 0.10955907620395522 0.786694409610585 0.6981819054842519 0.08537412434428093 0.5341123904930425 0.1937927470093217 0.5760785197372505 0.4293171905815827 0.4916572924241639 0.008606894164696066 0.26177812602624473 0.024046550245190534 0.7077055950276625 0.9209103520148986 0.3114922551454987 0.6662503791070471 0.8251639779758417 
0.9837637669169298 0.5567873963671852 0.07305565432644523 0.9152982290540531 0.020567903734407422 0.08839276594480483 0.41740037311517275 0.4323781748853395 0.44135069651599734 0.848743255873891 0.14240624290001058 0.7040749415144408 0.8389243846426182 0.5781609204808176 0.2227507098505338 0.6756585353389397 0.963087719911139 0.25118043030032344 0.6592019984083356 0.03327059372507468 0.9298372583689489 0.8123748271793112 0.1418943424239616 
0.02002334527155758 0.8125912321488616 0.9751400208932061 0.4985850338541804 0.22840256398180847 0.08371779194960804 0.08224789823535972 0.756048628764671 0.4034290333292404 0.7271992768784818 0.5435792367837828 0.38592804823209415 0.8232592636132794 0.22705283350355132 0.16429955751978265 0.5807760823426464 0.13738294238463644 0.0511664516531074 0.7558422571642021 0.21168512603331135 0.6373013066251683 0.6964995028425662 0.7824152332180585 0.4558168625404717 
0.8105468448644705 0.8391347309368233 0.43734841114095235 0.9503075405455057 0.6861315254845841 0.6414587198092824 0.46645174300038983 0.7284392992034665 0.9179874931582571 0.8087863346402009 0.2596538668830667 0.12463062637090971 0.7726900591212211 0.5590339756993542 0.21754436206083017 0.29671485393040586 0.18873039579464457 0.2715851760628917 0.16604305521042406 0.007138162840625961 0.8568308323541988 0.2152818164539978 0.6402718084840262 0.8291234773575591 0.8342730286982364 
0.4205126221846559 0.1878062055043782 0.9995104902108322 0.5509355559636875 0.45665983948210154 0.4518352202106477 0.7268959214605177 0.19071373926850732 0.6037044652620353 0.6863591967343017 0.8818625097460622 0.3392217230784226 0.665578799457962 0.5284078572489596 0.6454990480829347 0.47715272395701325 0.46289477161679393 0.3063617066015044 0.8730778715316492 0.3684005001302103 0.8639650049334743 0.8988111787205124 0.6416704915509689 0.6430211359188391 0.06557324580301827 0.1749905246957869 
0.693645642681549 0.9073411594098815 0.7187391764277349 0.34567396133218353 0.2624088432424262 0.5269946363592553 0.40976223052441363 0.13252357308183138 0.07240563312375636 0.8233979291240563 0.9531179850857899 0.5242305186444759 0.14232572341997385 0.8001479006369447 0.9303194067939836 0.029391358649661137 0.38860864927778993 0.6730558856354335 0.917644792746773 0.7589144865626304 0.9257658262410307 0.41600574454426076 0.8856729182046598 0.3748519445387546 0.3906980241698159 0.2545517414342253 0.32485537292891264 
0.9279040332547838 0.5801013405066134 0.5401477320031622 0.7538945889222928 0.8724457104846273 0.1832184931342068 0.7201262056775153 0.4014854837489401 0.09577510048475912 0.41660695872161324 0.18202220526877122 0.017017951818995236 0.6273861458596612 0.9232588009000089 0.5955636590854526 0.9621257519084117 0.8044188996421693 0.38532167586310495 0.0016259655798483985 0.962507091634372 0.06104286330060871 0.9178342507721473 0.304675961592091 0.15823101443595955 0.18237959145458704 0.46030355317626026 0.013705955130062786 0.380782624701857 
0.8176732927613861 0.06361544014481046 0.04638617179268678 0.9063895996697265 0.2827688569522011 0.18168402837407915 0.1621392949592234 0.2877110361945313 0.19855898311326514 0.8204094452109054 0.12206869111146335 0.24975923968358216 0.30991317691100095 0.67092758248206 0.9871474559436413 0.0509636740758973 0.9087030977909469 0.1597996767532871 0.060802021513587046 0.15657571403956416 0.6448904751908485 0.6857032776487979 0.858001640191109 0.5491516430617266 0.15124508376069035 0.1803506922333924 0.14019022500226674 0.5096405221893736 0.8301119804473803 
0.5307744753525325 0.49387468063308837 0.24264272641510343 0.3547489140444644 0.33078425311820703 0.15040972821014198 0.29069370675910755 0.923105894578873 0.8913126756299271 0.7454963945585598 0.2849668694534233 0.06852117364894061 0.4325326667920396 0.499137239950903 0.21357840071153955 0.8796588490468878 0.9050420624285835 0.8602684513907685 0.053716062016825994 0.8111150836594905 0.9430759776655097 0.00501543249088976 0.3101028108381997 0.876471625673115 0.03962086707292867 0.7034947442275813 0.729845310239015 0.907176800403228 0.15146906917996694 0.9773123555722888 
0.22250654585169194 0.7334852795134285 0.5916657251630438 0.6583840034495254 0.804280601925168 0.597790449519714 0.24746492094478367 0.42943101788083826 0.2064369046729514 0.8460337604319619 0.8738253549629089 0.17748038114590237 0.6407402653052479 0.9594776283463315 0.45564023916792884 0.5239252912541742 0.09834190652400954 0.28697971486859686 0.406309889059828 0.20817869250898258 0.47367610975515495 0.41700823133772147 0.6759299802887491 0.5966784456638591 0.7511858646854854 0.9889892142453897 0.6792819563835069 0.9649803335193188 0.47024012985584485 0.885178413882675 0.3219766357960756 
0.3579004181131604 0.6923941439683394 0.1671020244500998 0.3025157793113248 0.7711460469821223 0.7351837201763934 0.8247120649501332 0.29870071618419725 0.11760033955045868 0.007933060221299137 0.39175348321731385 0.6087307331255609 0.9424022044382513 0.38759496608429744 0.7474422074247166 0.3104988012187183 0.1331903409839661 0.7064312862520137 0.9724042943715223 0.0270052823718262 0.9353561278092433 0.08838066739635009 0.9559282867815053 0.9414751697817455 0.4268768872261516 0.06724917696876143 0.5619344622148356 0.7926779425501392 0.23327760258768138 0.6473993679785343 0.5526658191145547 0.19911345842481176 
0.6704960096308439 0.7264017299202536 0.14195775698008473 0.8101411891384785 0.6919019499701328 0.5891512657973133 0.004044560334543257 0.46279436934956153 0.9854487831089542 0.5042422571420366 0.799212599355864 0.7349345674994756 0.3179116681829166 0.8059316863126914 0.7942114514832017 0.02856598870331195 0.7553928748934073 0.2288122386178707 0.9531861200827118 0.5915436632775619 0.7027523009705848 0.6773541203752966 0.9539946286397893 0.6915726837554529 0.7993468307141887 0.058764038383819384 0.9451272155717612 0.493310657846012 0.5844391337154404 0.28514918914289134 0.5000446555097181 0.057548983379606566 0.5028633058337055 
0.059762601783938996 0.14860502026892985 0.28086297194900167 0.2600108445445519 0.6021456489372713 0.06934939383046179 0.5247846264743472 0.7549272584028598 0.03827243492568977 0.011769175509524943 0.14546634049631513 0.8212863756164641 0.7843398507110251 0.284278543024981 0.12796716039565958 0.7882354690502215 0.8866360966026705 0.6914678014962714 0.55370833736808 0.43658130840625553 0.9449598191991773 0.6333142865895409 0.6853079387578106 0.2705137692431493 0.9433503919740862 0.18937978311363912 0.03991881984703338 0.15103986662011148 0.03943012055602635 0.9026242182071859 0.9403585339751624 0.2445280815629285 0.12244658022493882 0.15031747737715218 
0.6827332891839586 0.9282390615260607 0.7401440635318141 0.4436327541057492 0.6399227806022512 0.7644455426740618 0.8158808823538983 0.7328559093381719 0.3322057486725031 0.9057208425617245 0.4299490528122474 0.8117474356196598 0.7394717703184653 0.32620186428384845 0.8228415193564562 0.2124450634317384 0.9038770035849515 0.08710892446792007 0.6932516619272509 0.5613961273087474 0.1774672306814823 0.4395315679508355 0.809878291278839 0.22716127003273545 0.30620476827833054 0.9434661612595445 0.9336486839362282 0.23253159654969713 0.9099999006906435 0.9393168094540227 0.05576151600614854 0.8262539738329985 0.8177620091101565 0.6465491159308421 0.9969900939968577 
0.8137596513167065 0.14714917720003295 0.8839113615261793 0.48497585397246923 0.7316441743772735 0.9806093445808175 0.9066155397442872 0.9287806216089564 0.21724689738390146 0.9824701311323769 0.13809605925901924 0.24375593451395672 0.4725308328212273 0.32624825171686855 0.6374416409681855 0.24482579958521278 0.5505648057561285 0.8570142196875958 0.9883216585854064 0.3225695112183238 0.3032613489849032 0.5005609075628121 0.9212048792639657 0.3440289416711635 0.22062575667990458 0.5492899946628023 0.3878957325213017 0.9789548310237403 0.06462251452352852 0.6041431987288044 0.9958887707074939 0.9422452213400158 0.15486789260217393 0.6325699468130593 0.6797695332208784 0.9646180263769476 
0.39870808354197385 0.8144370333356639 0.23786598353776756 0.6560992217283076 0.6748445432862038 0.5909497938202753 0.8945812880653298 0.8106971779507038 0.977519299419545 0.6060682722377863 0.36231579983538453 0.11567200257813648 0.8073748393854282 0.035566508261741014 0.9716119099928573 0.67509911800068 0.6554545713254691 0.1357962574031497 0.3141324243898256 0.23496403180020442 0.0684115086525704 0.7123812217823323 0.5003098808630051 0.5058151673765066 0.7058444678284052 0.6084816790141073 0.5719801191003936 0.519040437305347 0.004782255018016546 0.2429333689171096 0.8300409080832223 0.5241221817408956 0.5516885414553038 0.6904786623106037 0.8381517410273974 0.5367644126287302 0.028960945682770634 
0.7894722440212386 0.6457191505437186 0.2815750478574742 0.6507499653384332 0.2868572718471303 0.3368865357785541 0.938025313950769 0.3320247605908022 0.08587226769874046 0.35697587485881765 0.7946969980506722 0.4451642201344145 0.24886311139717787 0.19380384630358305 0.6443677961290152 0.9099536709871473 0.5257382330445426 0.8985221665975185 0.5112738762477214 0.5357184903569137 0.8280197328887632 0.6191086707383521 0.09192778773758647 0.9884284982841253 0.2491065822221784 0.7893614457427608 0.11215876095901123 0.4909573601063272 0.9432805400553694 0.8672255729093569 0.6555821370161253 0.3812836740728688 0.4191493785723788 0.5485086569312664 0.40249286254002015 0.9512716983061037 0.5776361162527137 0.19551690149163736 
0.6332176765707948 0.5677710493600786 0.13028674910342164 0.8148718017570619 0.7962494353671954 0.9381265991005195 0.8705835056634891 0.29474181398032795 0.4190262481566547 0.5237910750328777 0.639114350799775 0.7689524527225595 0.14800661482041932 0.5285846938288492 0.7228634890992033 0.9139123222392694 0.7447319047705063 0.592247425960193 0.8595520900853127 0.704021355704556 0.935855316207408 0.3052812143208047 0.9798720930486186 0.6522024460049457 0.11765640670045241 0.9276813534806357 0.3136201496887421 0.844425261330125 0.04934897724060816 0.24200684825670582 0.510152887271976 0.1405669816818158 0.8345293256188088 0.3003423229730492 0.9792488130178407 0.7586815913186641 0.6864007373095546 0.9350548780959642 0.7453758849074144 

"norme - sumSQR"= -0.11681206539908295 (en mode debug avec "i"= 38
)
Pas de division par zero, rien un gros problème d'algorithmie, c'est tout.
Bref ce fut passionnant.
Bon courrage pour la suite de tes aventures.
Ah si, juste une remarque : il est inutile de faire des calculs avec des précisions astronomiques mais avec une précision légèrement inférieure à celles des mesures (1/100) en principe le résultat reste juste. Je crois que c'est un reste de mes cours de physique
ltchris

lance ce joli code, et le secret sur la divergence tu comprendra! Pour le point situé juste avant le NaN je calcule les différences entre ce qu'on trouve et ce qu'on aurait du avoir, et tu vois que les erreur sont de plus en plus grande:

class Geotest {
    final int NB_POINTS = 50;
    // type Matrice de départ :  0 = c'est nous qui la créons ;  1 = aléatoire ; 2=on la lit dans un fichier
    final int typeMat = 1;
    /* typeAffichage : 
     *  0 = on affiche toutes les étapes de calcul
     *  1 = on affiche juste résultats
     *  2 = on affiche juste quand y'a du NaN
     *  3 = difference entre somme des distance init et finale
     *  4 = on affiche difference entre matrice position depart et matrice position finale   */
    public int typeAffichage = 4;
    
    int quelLigne=9;
    
    
    
    //  n = nombre de points
    //  m = dimension de l'espace
    private int n = NB_POINTS;
   
    private int m = NB_POINTS - 1;
    
    // Matrice des positions initiales
    public double[][] coordonneesInitiales = new double[n][m];
                                     
    // Matrice des positions reconstruites par l'algorithme
    public double[][] coordonnees = new double[n][m];
   
    // Matrice des distances
    public double[][] distances = new double[n][n];
    
    // vecteur pour controle de division par zero
    // zeroPos[0]=position en i ; zeroPos[1]=position en j ; zeroPos[2] = valeur de coord
    public double[] zeroPos = { -1,-1,-1};
   
    // petite methode pour calculer un carre
    double carre(double x) {
        return x * x;
    }
   
    // Calcul de la distance euclidienne pour la matrice de position
    double dist(double[][] coords, int a, int b) {
        double sum = 0;
        for (int i = 0; i < m; i++) {
            sum = sum + carre(coords[a][i] - coords[b][i]);
        }
        return Math.sqrt(sum);
    }
   
    public void creationMatrice(int type){
    	if(typeAffichage==0) System.out.println("Matrice Initiale");
    	switch(type) {
    	case 0 : 
    		// ON cree nous même la matrice
    			double[][] temp =  
    			{
    			        { 0.0, 0.0, 0.0 } ,
    			        { 2.0, 0.0, 0.0 },
    			        { 7.0, 0.0, 0.0 },
    			        { 0.0, 1.0, 2.0 } 
    			};
    			for(int i=0;i<n;i++){
    				if(typeAffichage==0) System.out.print(i + "=>   ");
    				for(int j=0;j<m;j++){
    					coordonneesInitiales[i][j]= temp[i][j]; 
    					if(typeAffichage==0) System.out.print(coordonneesInitiales[i][j] + " ");
    				}
    				if(typeAffichage==0) System.out.println();
    			}
    			break;
 		
       	case 1 :
       		// On crée une matrice triangulaire aléatoire
       		for (int i = 0; i < n; i++) {
       			if(typeAffichage==0) System.out.print(i + "=>   ");
    			for (int j = 0; j < i; j++) {
    				coordonneesInitiales[i][j] = (Math.random()*0.1);
    				if(typeAffichage==0) System.out.print(coordonneesInitiales[i][j] + " ");
    			}
    			if(typeAffichage==0) System.out.println();
    		}
       		break;
    	}
    }
    
    public void executeTest() {
       
    	creationMatrice(typeMat);
       
        // On calcul les distances euclidiennes entre les points
    	if(typeAffichage==0) System.out.println("Matrice distance");
        for (int i = 0; i < n; i++) {
            //System.out.print(i + "=>   ");
            for (int j = 0; j < m; j++) {
                distances[i][j] = dist(coordonneesInitiales, i, j);
                distances[j][i] = dist(coordonneesInitiales, i, j);
                if(typeAffichage==0) System.out.print(distances[i][j] + " ");
              
            }
            if(typeAffichage==0) System.out.println();
        }
       
        
        if(typeAffichage==0) System.out.println("Matrice Résultat (intermediaire)");
        if(typeAffichage==0) System.out.print("1=>   ");
        // Le premier point a tout ces coordonnées nulles
        // Le deuxième n'a qu'une seule coordonnée nulle
        coordonnees[1][0] = distances[1][0];
        if(typeAffichage==0) System.out.println(coordonneesInitiales[1][0] + " ");
       
        /* On lance notre algorithme pour trouver les coordonnées des points 3 à n */
        double zero = 0;
        for (int WichPoint = 2; WichPoint < n; WichPoint++) {
            int i = WichPoint; // je met i juste pour simplifier le code, et Wichpoint pour comprendre de
            // quoi je parle
            if(typeAffichage==0) System.out.print(i + "=>   ");
            // La norme du vecteur sera sa distance au point 1
            double norme = carre(distances[0][i]);
           
            // On calcul d'abord les n-2 premières coordonnées du point courant
            for (int p = 0; p < i - 1; p++) {
                coordonnees[i][p] = norme - carre(distances[p + 1][i]) + carre(distances[p + 1][0]);
                if(typeAffichage==0) System.out.print("p=" + p + "  norme-d²=" + coordonnees[i][p]);
                double sumCoord = 0;
                for (int k = 0; k <= p - 1; k++) {
                    sumCoord += coordonnees[i][k] * coordonnees[p + 1][k];
                    
                }
                if(typeAffichage==0) System.out.print("  sumCoord=" + sumCoord + " ");
                coordonnees[i][p] = coordonnees[i][p] - 2 * sumCoord;
                coordonnees[i][p] = coordonnees[i][p] / (2 * coordonnees[p + 1][p]);
                // on controle la divergence en soustrayant ou additionnant une erreur qui pourrait apparaitre
                
                if(typeAffichage==0) System.out.print("  x=" + coordonnees[i][p] + " ");
                if(typeAffichage==0) System.out.println();
            }
            if(typeAffichage==0) System.out.println();
            // On calcul enfin la dernière coord du point courant en utilisant les coord calculés à
            // l'instant
            double sumSQR = 0;
            for (int j = 0; j < i - 1; j++) {
                sumSQR += carre(coordonnees[i][j]);
            }
           
            // Le dernier calcul devrait tjs etre vrai car norme > sumSQR (mathematiquement j'entend)
            coordonnees[i][i - 1] = Math.sqrt(norme - sumSQR);
            if(i%2==0) coordonnees[i][i - 1]=coordonnees[i][i - 1]-Math.pow(10,-17);
            else coordonnees[i][i - 1]=coordonnees[i][i - 1]+Math.pow(10,-17);
            // on test si un des résultats s'approche de zero = controle division par zero
            if(Math.abs(coordonnees[i][i-1])<0.0000001){
            	System.out.println(" petit resultat= " + coordonnees[i][i-1]);
            	zeroPos[0]=i;
            	zeroPos[1]=i-1;
            	zeroPos[2]=coordonnees[i][i-1];
            }
            // Or y'a du NaN ???? donc norme < sumSQR et c pas normal !!!
           
            // On test le dernier calcul voir quand apparait ce NaN
            if (Double.isNaN(coordonnees[i][i - 1]) == true && zero == 0) {
                zero++;
                quelLigne=i-1;
                System.out.println("Nan a " + i);
                System.out.println("  Position du zero : i=" + zeroPos[0] + " j=" + zeroPos[1] + " coord="+ zeroPos[2]);
                if(typeAffichage==0) typeAffichage=2; // on chg la valeur pour arreter l'affichage au NaN
            }
        }
        if(typeAffichage==1) System.out.println("Matrice resultat");
        for (int i = 0; i < n; i++) {
        	if(typeAffichage==1) System.out.print(i + "=>   ");
            for (int j = 0; j < i; j++) {
            	if(typeAffichage==1) System.out.print(coordonnees[i][j] + " ");            	
            }
            if(typeAffichage==1) System.out.println();
        }
        
        
        // sommme des distances
        if(typeAffichage==3){
        	for(int i=0;i<quelLigne;i++){
            	double sumInit=0;
            	double sumFinale=0;
            	 System.out.print(i + "=>   ");
            	for(int j=0;j<i;j++){
            		sumInit+=distances[i][j];
            		sumFinale+=dist(coordonnees,i,j);
            	}
            	if(typeAffichage==3) System.out.println(" erreur somme des distances= " + (sumInit-sumFinale));
            }
        }
        
        // difference de coordonnées
        if(typeAffichage==4){
        	for(int j=0;j<quelLigne-1;j++){
        		System.out.print("j="+j+" erreur="+ (coordonneesInitiales[quelLigne-1][j]-coordonnees[quelLigne-1][j]));
        		System.out.println();
        	}
        }
                
    } 
   
    public static void main(String[] args) {
        Geotest test = new Geotest();
        test.executeTest();
    }    
} 

change maintenant typeAffichage=4 en typeAffichage=3 et tu verra que les distances ne divergent pas.

fredericmazue

Quote:
ben le RER quoi ?!

Ah :!: :lol:
Y a qu'un parisien qui se croit au centre du monde pour penser que c'est évident pour tout monde.
Moi quand j'ai vu ReR (et non RER), dans le contexte de la conversation, je me suis demandé quel coin obscur de l'informatique j'avais l'infortune d'ignorer. :lol:

Ah... la région parisienne... quand je pense que j'ai habité cet asile de dingues pendant 12 longues années. Mais je me suis évadé! Pour me réfugier dans un trou du sud de la France on on sait à peine ce que c'est qu'une voiture :) Alors le RER...

Le RER... c'était dans une autre vie pour moi ça :)

Pour ton problème je crois que j'ai compris au moins l'idée dans les grandes lignes. Mais ce que je ne comprends pas c'est pourquoi le calcul diverge. Si à l'occasion tu a sle temps d'écrire deux ou trois lignes bien vulgarisées à l'attention du primate que je suis :)

ltchris

j'ai fait expres de repondre : Ben le RER quoi ! je sentais que ca allait te faire grommeler !

sinon pour l'explication, je te fait des que j'ai un peu de temps, la je suis en pleine bourre post decouverte :D

fredericmazue

Quote:
la je suis en pleine bourre post decouverte

Je vois :lol:

Pages