#1 Le 24/10/2007, à 15:22
- laroche1
précision resultat matlab
Bonjour
Voila j'ai une petite question : est ce que la précision des résultats peut changer suivant les versions de matlab ( par ex entre une version 5.3 et 6.5)??
Merci
Hors ligne
#2 Le 24/10/2007, à 18:22
- mfc_alpha
Re : précision resultat matlab
Wouha! Ca c de la question!
Ha priori ca peut dependre des fonctions que tu utilise, si elles ont ete ameliorer entre temps, c'est possible!
Hors ligne
#3 Le 24/10/2007, à 22:07
- Le Farfadet Spatial
Re : précision resultat matlab
Salut à tous !
Que veux-tu dire par la précision ? Si c'est le nombre de chiffres à l'affichage, c'est paramétrable. Si tu parles de la précision intrinsèque des calculs, c'est-à-dire que tu parles des erreurs d'arrondis, cela appelle une réponse un peu plus fine :
Tout d'abord, cela dépend de l'ensemble utilisé pour faire les calculs --- typiquement virgule flottante, décimaux ou précision arbitraire, --- quoique ce ne soit pas vraiment l'essentiel.
Ensuite, cela va dépendre pour chaque fonction, vu qu'une façon de faire des calculs peut changer la propagation des erreurs et ce changement peut-être vraiment radical. Donc, si une fonction a été réécrite, sa précision peut avoir changé. Par contre, les opérations de bases --- addition, soustraction, multiplication et division --- ne peuvent pas avoir vu leur précision s'améliorer, vu que ce sont celles du processeurs.
Enfin, les calculs de types développements limités peuvent voir leur précision changer d'une version à l'autre, mais ce serait vraiment exceptionnel. Dans certain cas, c'est paramétrable.
Pour finir, sache que des méthodes pour maîtriser les erreurs de calcul (typiquement intervalles et approche stochastique) ont été développées pour Matlab.
Donc, si la précision dont tu parles c'est celle intrinsèque du calcul, la réponse est globalement non, mais ponctuellement sur certaines fonctions c'est possible.
Je ne sais pas si ça peut t'aider, mais tu pourras trouver une analyse de la propagation des erreurs de calcul sur ordinateur et une présentation des méthodes utilisées pour les contrôler dans mon rapport de master, que tu peux trouver à cette adresse : http://www.legos.obs-mip.fr/~lebars/publications
Voilà, j'ai essayé de répondre au mieux en fonction des éléments que j'avais. J'espère que cela t'aidera.
À bientôt.
Le Farfadet Spatial
Hors ligne
#4 Le 24/10/2007, à 23:37
- Le Farfadet Spatial
Re : précision resultat matlab
Re-salut à tous !
Ah ! Petite précision, pour le cas où tu te perdrais dans mon impressionnante bibliographie scientifique : le titre de mon mémoire est « Implémentation de la méthode CESTAC dans la bibliothèque BLAS. »
À bientôt.
Le Farfadet Spatial
Hors ligne
#5 Le 25/10/2007, à 10:12
- laroche1
Re : précision resultat matlab
Bonjour, Quand je parlais de précision de calcul
je parlais de ceci
mes résultats (version6.5)
27132.315 483.1681 12.1576 -13.1959 -5.7039 0 0 -23.6157 40952.7182 1659.7886 28.337
resultats obtenus avec version 5.3
27383,78 487,51 12,33 -13,14 -5,77 -23,62 41033,52 1660,56 28,4
J'utilise les memes données (à priori)
Voila merci
Hors ligne
#6 Le 25/10/2007, à 15:14
- kkneo
Re : précision resultat matlab
Tu parles de précision à l'affichage là.
Il me semble que Matlab utilise le flottant double précision par défault donc si tu t'intéresse à 3 chiffres après la virgule tu as de la marge ne t'inquiète pas donc un encodage sur 64 bits.
Si tu n'est pas trop au fait de tout ça regardes là :
http://fr.wikipedia.org/wiki/Nombre_flottant
Pour ce qui est de l'affichage, un petit
format long
devrai t'aider voilà le help :
http://www.mathworks.com/access/helpdes … cher&meta=
Dernière modification par kkneo (Le 25/10/2007, à 15:15)
Hors ligne
#7 Le 25/10/2007, à 19:36
- Le Farfadet Spatial
Re : précision resultat matlab
Salut à tous !
Tu parles de précision à l'affichage là.
Ben, à lire son message précédent, je ne crois pas... En effet :
-- 27132,315 arrondi à la deuxième décimale donne 27132,32 et non pas 27383,78 ;
-- 483,1681 arrondi à la deuxième décimale donne 483,17 et non pas 487,51 ;
-- et ainsi de suite, vu qu'il y a le même genre d'erreur à chaque chiffre.
Donc, ce n'est pas qu'une question d'affichage. Cela peut en effet venir d'un problème de précision des calculs. Toutefois, avant d'être catégorique, j'aimerais un peu savoir comment Laroche1 obtient ces résultats.
À bientôt.
Le Farfadet Spatial
Hors ligne
#8 Le 25/10/2007, à 23:52
- kkneo
Re : précision resultat matlab
Salut à tous !
kkneo a écrit :Tu parles de précision à l'affichage là.
Ben, à lire son message précédent, je ne crois pas... En effet :
-- 27132,315 arrondi à la deuxième décimale donne 27132,32 et non pas 27383,78 ;
-- 483,1681 arrondi à la deuxième décimale donne 483,17 et non pas 487,51 ;
-- et ainsi de suite, vu qu'il y a le même genre d'erreur à chaque chiffre.
Donc, ce n'est pas qu'une question d'affichage. Cela peut en effet venir d'un problème de précision des calculs. Toutefois, avant d'être catégorique, j'aimerais un peu savoir comment Laroche1 obtient ces résultats.
À bientôt.
Le Farfadet Spatial
En effet, pour tout avouer j'ai survolé le message et je me suis concentré sur le nombre de chiffre après la virgule
Désolé, un peu surbooké en ce moment
Sinon je dis peut être un truc bête mais j'ai des vieux souvenirs avec une histoire de précision numérique relative qui varie en fonction de la machine sur laquelle matlab est installé ... je crois que c'est la constante eps qui donne ça ... il peu peut être essayer de voir si cette constante est la même d'une version à l'autre ... peut être aussi que ce n'est pas lié à la version de matlab mais plus à la machine sur laquelle matlab est installé? Il a les 2 versions sur la même machine là?
Dernière modification par kkneo (Le 26/10/2007, à 00:02)
Hors ligne
#9 Le 26/10/2007, à 08:51
- laroche1
Re : précision resultat matlab
Bonjour à tous
en fait je n'ai qu'une version matlab installé
J'ai testé sur différentes et je n'obtiens jamais le meme resultat !!! c'est du n'importe quoi j'ai bien le meme fichier data et error.txt je vais devenir dingue....
avec version 5.3
36061.7575 638.5522 19.3896 -11.7031 59311.6443 2524.1463 21.687
avec version 6.5
36061.4769 638.5272 19.4119 0 0 -11.7029 0 0 0 59311.6068 2524.1508 21.687
et la version qui a été initialement utilisé par l'auteur du code
version inconnue
36061,0357 638,4909 19,4097 -11,7032 59311,2555 2524,1382 21,6867
Voila si vous avez des idées ....
Merci
Hors ligne
#10 Le 26/10/2007, à 08:56
- Chessangel
Re : précision resultat matlab
Hello laroche !
Petite question quant à ces approximations :
-Est-ce que les résultats sont générés par une méthode de simulation (genre Monte Carlo) ?
-Est-ce qu'une fonction de solveur est utilisée ?
Une commission d'enquête pour être efficace, ne doit compter que trois membres, dont deux sont absents. G. Clémenceau
Hors ligne
#11 Le 26/10/2007, à 09:14
- laroche1
Re : précision resultat matlab
Bonjour
Premiere question
Oui il s'agit d'une simulation genre monte carlo (mais plus developpé je crois )
Deuxieme question :
C'est quoi une fonction de solveur??? (par rapport à l'utilisation d'excel??)
Dernière modification par laroche1 (Le 26/10/2007, à 09:17)
Hors ligne
#12 Le 26/10/2007, à 09:19
- Le Farfadet Spatial
Re : précision resultat matlab
Salut à tous !
Laroche1, pour que nous puissions t'aider davantage, il faut que tu nous dises comment tu obtiens ces résultats. Là, tu nous montres des suites de chiffres, sans nous dire ce que c'est, d'où ça vient et ainsi de suite... Pour l'instant, la seule chose que nous pouvons dire, c'est que ce n'est pas pareil.
Comment obtiens-tu ces résultats ?
À bientôt.
Le Farfadet Spatial
Hors ligne
#13 Le 26/10/2007, à 09:27
- Chessangel
Re : précision resultat matlab
1. S'il s'agit d'une simulation Monte-Carlo, il est logique de ne pas obtenir les mêmes résultats :
- Matlab utilise des nombres générés de manière aléatoire, et cette génération a sans doute changé de version en version.
Pour tester si c'est le cas, fixe-toi sur une version et entre la commande :
rand('state', sum(clock));
puis relance ta procédure. Tu devrais alors obtenir encore un résultat différent de ceux que tu mentionnes.
Explication : la ligne demande à Matlab de passer en algorithme de génération de nombres aléatoires 'state', avec comme paramètre la somme des nombres de l'horloge (qui est pseude-aléatoire).
2. En ce qui concerne le solveur, il existe quelques fonctions du même genre que le solveur d'Excel : fsolve, linsolve.
Dernière modification par Chessangel (Le 26/10/2007, à 09:27)
Une commission d'enquête pour être efficace, ne doit compter que trois membres, dont deux sont absents. G. Clémenceau
Hors ligne
#14 Le 26/10/2007, à 09:29
- Le Farfadet Spatial
Re : précision resultat matlab
Re-salut à tous !
Le temps que je poste mon message et déjà un premier élément de réponse.
Oui il s'agit d'une simulation genre monte carlo (mais plus developpé je crois )
Ah ! Les choses deviennent beaucoup plus claires. D'ailleurs, as-tu essayé de lancer deux fois de suite le même programme avec le même jeux de données sur la même machine avec la même version de MatLab ?
Essaye : il est probable que tu obtiennes deux fois des résultats différents. En effet, la méthode de Monte Carlo est une méthode statistique : en gros, le code comprend une part d'aléatoire. Donc, une légère divergence dans les résultats est tout à fait normale. Il y a (beaucoup) moins de 1% d'erreur, donc on peut dire que tes résultats sont bons, même si, en effet, ce ne sont pas exactement les mêmes.
Voilà, un mystère de résolu.
C'est quoi une fonction de solveur??? (par rapport à l'utilisation d'excel??)
Pour faire simple : une fonction qui résout un système d'équations.
À bientôt.
Le Farfadet Spatial
Hors ligne
#15 Le 26/10/2007, à 09:32
- laroche1
Re : précision resultat matlab
AHhh mais j'avais pas vu qu'il n'y avait pas le code, je suis vraiment desolée
(en fait j'avais ouvert une autre conversation avec tout expliqué dedans)
le code d'origine et la procedure expliquée qui marche avec une version 5.3
INVERSION PROGRAM (MATLAB© 5.3.0.1)
All the files must be within the WORK folder under MATLAB
For additional information on the program or on its application, please contact ncoussae@africamuseum.be
To prepare the Input Files
Prior data file.
Create a table where each line corresponds to the values of a specific datum type and each column to the set of values for a given experiment. On each line, individual data are separated by a space or a tab.
Example:
P 0.2 0.5 1 1 1.5
T 1473 1473 1373 1473 1273
Ca cpx 0.802 0.779 0.872 0.806 0.894
Ca opx 0.080 0.085 0.056 0.075 0.032
Insert this table into a data.txt file (discard the first column):
0.2 0.5 1 1 1.5
1473 1473 1373 1473 1273
0.802 0.779 0.872 0.806 0.894
0.080 0.085 0.056 0.075 0.032
Prior error file.
Create a table where each line corresponds to the variances of a specific datum type and each column to the set of variances for a given experiment. As above, the individual data are separated by a space or a tab on each line.
P 4.444E-07 2.778E-06 1.111E-05 1.111E-05 2.500E-05
T 1.361E+00 1.361E+00 1.361E+00 1.361E+00 1.361E+00
Ca cpx 4.391E-05 2.323E-05 1.533E-05 6.254E-05 2.237E-05
Ca opx 5.082E-05 4.799E-05 9.072E-06 2.622E-05 3.906E-05
Insert this table into a error.txt file (discard the first column):
4.444E-07 2.778E-06 1.111E-05 1.111E-05 2.500E-05
1.361E+00 1.361E+00 1.361E+00 1.361E+00 1.361E+00
4.391E-05 2.323E-05 1.533E-05 6.254E-05 2.237E-05
5.082E-05 4.799E-05 9.072E-06 2.622E-05 3.906E-05
How to use the program
Paste the program onto the programming MATLAB® window
Select the prior parameter values through the line :
X0=[100000 10000 1000 0 0 10 0 0 0 100000 10000 1000 m']';
The values must follow the order specified in the comment :
%line matrix of the posterior parameter values (delta U.... ) to which is added the line matrix (m’) of the posterior data.
Select the prior variances on the parameters through line E, e.g.,
E=[1E9;1E8;1E5;0;0;1000;0;0;0;1E9;1E8;1E5;e];
The values must follow the order specified in the comment :
%column matrix of the prior errors on the parameters ( ) to which is added the column matrix (e) of the prior errors on the data.
Select the number of iterations through the line:
for h=1:50
Save the program.
Start the program within the MATLAB® application window.
Results
When the program has ended, it creates two files within the MATLAB® work folder
reslt.txt : result file for the parameters; the first line recalls the prior variances, the second gives the posterior values and the others are the posterior covariance matrix.
rcomp.txt : line matrix of the recalculated experimental data
Program:
% M = input matrix of the prior data (format as shown in the .xls file; orthopyroxene data follow clinopyroxene data, unlike in the text or titles)
% m = column matrix of the prior data
% X0 = line matrix of the prior parameters and data
% e = column matrix of the errors
% E = column matrix of the prior errors on the parameters and data
% C0 = creation of a nth order diagonal matrix, where n is the total number of parameters and data
% placement of the errors onto the diagonal to create the prior covariance matrix
% X = matrix of the prior data as used in iteration
% a = number of data
% start of inversion
% h = number of iterations
% p = form of the thermodynamic law used for the En-transfer reaction
% application of p to the whole set of data
% P1 = p derivative for the thermodynamic parameters of the En-reaction
% P2 = p derivative for the thermodynamic parameters of the Di-reaction
% P3 = p derivative for the various pressures
% P4 = p derivative for the various temperatures
% P5 = p derivative for the various Ca contents in clinopyroxene
% P6 = p derivative for the various Ca contents in orthopyroxne
% P whole set of p derivatives
% f = form of the thermodynamic law used for the Di-transfer reaction
% application of p to the whole set of data
% F1 = f derivative for the thermodynamic parameters of the En-reaction
% F2 = f derivative for the thermodynamic parameters of the Di-reaction
% F3 = f derivative for the various pressures
% F4 = f derivative for the various temperatures
% F5 = f derivative for the various Ca contents in clinopyroxene
% F6 = f derivative for the various Ca contents in orthopyroxne
% F whole set of f derivatives
% g = set of the two thermodynamic laws describing both reactions
% G= set of the derivatives for the two reactions
% mathematical form of the Tarantola et Valette's theorem
% parameter intermediate values during inversion
% end of inversion
% C = computation of the final covariance matrix
% W = final covariance matrix for the parameters
% Z = prior variance matrix before inversion
% Q = set of results and variances for the parameters
% k = matrix of the recalculated data after inversion
clear
M=DLMREAD('/data.txt','\t');
j=size(M);
m=DLMREAD('/data.txt');
X0=[100000 10000 1000 0 0 10 0 0 0 100000 10000 1000 m']';
e=DLMREAD('/error.txt');
E=[1E9;1E8;1E5;0;0;1000;0;0;0;1E9;1E8;1E5;e];
D=size(X0);
C0=eye(D(1));
for i=1:D(1)
C0(i,i)= E(i);
X=X0;
a=[j(1,2)];
for h=1:50
p=[X(1)+X(12+1)*X(2)-X(12+a+1)*X(3)+8.314*X(12+a+1)*log((1-X(12+2*a+1))/(1-X(12+3*a+1)))+((X(12+2*a+1))^2)*(X(4)+X(12+1)*X(5)-X(6)*X(12+a+1))-((X(12+3*a+1))^2)*(X(7)+X(8)*X(12+1)-X(9)*X(12+a+1))];
for b=14:a+12
p=[p;X(1)+X(b)*X(2)-X(a+b)*X(3)+8.314*X(a+b)*log((1-X(2*a+b))/(1-X(3*a+b)))+((X(2*a+b))^2)*(X(4)+X(b)*X(5)-X(6)*X(a+b))-((X(3*a+b))^2)*(X(7)+X(8)*X(b)-X(9)*X(b+a))];
end
P1=[1 X(13) -X(12+a+1) (X(12+2*a+1))^2 (X(12+2*a+1))^2*X(13) -(X(12+2*a+1))^2*X(12+a+1) -(X(12+3*a+1))^2 -(X(12+3*a+1))^2*X(13) (X(12+3*a+1))^2*X(12+a+1)];
for z=14:a+12
P1=[P1;1 X(z) -X(z+a) (X(z+2*a))^2 (X(z+2*a))^2*X(z) -(X(z+2*a))^2*X(z+a) -(X(z+3*a))^2 -(X(z+3*a))^2*X(z) (X(z+3*a))^2*X(z+a)];
end
P2=zeros(a,3);
P3=eye(a);
P4=eye(a);
P5=eye(a);
P6=eye(a);
for y=1:a
P3(y,y)=X(2)+(X(12+y+2*a))^2*X(5)-(X(12+y+3*a))^2*X(8);
P4(y,y)=-X(3)+8.314*log((1-X(2*a+12+y))/(1-X(3*a+12+y)))-X(6)*(X(2*a+12+y))^2+X(9)*(X(3*a+12+y))^2;
P5(y,y)=-8.314*X(12+a+y)/(1-X(2*a+12+y))+2*X(12+2*a+y)*(X(4)+X(12+y)*X(5)-X(12+a+y)*X(6));
P6(y,y)=8.314*X(12+a+y)/(1-X(3*a+12+y))-2*X(12+3*a+y)*(X(7)+X(8)*X(12+y)-X(12+a+y)*X(9));
end
P=[P1 P2 P3 P4 P5 P6];
f=[X(10)+X(12+1)*X(11)-X(a+12+1)*X(12)+8.314*X(12+a+1)*log(X(12+3*a+1)/X(12+2*a+1))-(1-X(12+2*a+1))^2*(X(4)+X(12+1)*X(5)-X(6)*X(12+1+a))+(1-X(12+3*a+1))^2*(X(7)+X(8)*X(12+1)-X(9)*X(12+a+1))];
for b=14:a+12
f=[f;X(10)+X(b)*X(11)-X(a+b)*X(12)+8.314*X(a+b)*log(X(3*a+b)/X(2*a+b))-(1-X(2*a+b))^2*(X(4)+X(b)*X(5)-X(6)*X(a+b))+(1-X(3*a+b))^2*(X(7)+X(8)*X(b)-X(9)*X(b+a))];
end
F2=[-(1-X(12+2*a+1))^2 -(1-X(12+2*a+1))^2*X(12+1) (1-X(12+1+2*a))^2*X(12+a+1) (1-X(12+3*a+1))^2 (1-X(12+3*a+1))^2*X(12+1) -(1-X(12+3*a+1))^2*X(12+a+1) 1 X(12+1) -X(12+a+1)];
for z=14:a+12
F2=[F2;-(1-X(z+2*a))^2 -(1-X(z+2*a))^2*X(z) (1-X(z+2*a))^2*X(z+a) (1-X(z+3*a)^2) (1-X(z+3*a))^2*X(z) -(1-X(z+3*a)^2)*X(z+a) 1 X(z) -X(z+a)];
end
F1=zeros(a,3);
F3=eye(a);
F4=eye(a);
F5=eye(a);
F6=eye(a);
for y=1:a
F3(y,y)=X(11)-(1-X(12+y+2*a))^2*X(5)+(1-X(12+y+3*a))^2*X(8);
F4(y,y)=-X(12)+8.314*log(X(3*a+12+y)/X(2*a+12+y))+X(6)*(1-X(2*a+12+y))^2-X(9)*(1-X(3*a+12+y))^2;
F5(y,y)=-8.314*X(12+a+y)/X(2*a+12+y)+2*(1-X(12+2*a+y))*(X(4)+X(12+y)*X(5)-X(12+a+y)*X(6));
F6(y,y)=8.314*X(12+a+y)/X(3*a+12+y)+2*(X(12+3*a+y)-1)*(X(7)+X(8)*X(12+y)-X(12+y+a)*X(9));
end
F=[F1 F2 F3 F4 F5 F6];
g=[p;f];
G=[P;F];
X=X0+C0*G'*inv(G*C0*G')*(G*(X-X0)-g);
R=[X(1) X(2) X(3) X(4) X(5) X(6) X(7) X(8) X(9) X(10) X(11) X(12)]
end
C=C0-C0*G'*inv(G*C0*G')*G*C0;
W=[C(1,1) C(1,2) C(1,3) C(1,4) C(1,5) C(1,6) C(1,7) C(1,8) C(1,9) C(1,10) C(1,11) C(1,12)];
for v=2:12
W=[W; C(v,1) C(v,2) C(v,3) C(v,4) C(v,5) C(v,6) C(v,7) C(v,8) C(v,9) C(v,10) C(v,11) C(v,12)];
end
D=[E(1) E(2) E(3) E(4) E(5) E(6) E(7) E(8) E(9) E(10) E(11) E(12)];
Q=[D;R;W];
for i=1:a
ka(i)=[X(i+12)];
kb(i)=[X(i+12+a)];
kc(i)=[X(i+12+2*a)];
kd(i)=[X(i+12+3*a)];
end
K=[ka;kb;kc;kd];
dlmwrite('/MATLABR11/work/reslt.txt',Q,'\t')
dlmwrite('/MATLABR11/work/rcomp.txt',K,'\t')
le code utilisé (modifié qui donne les memes resultats en 5.3 que le code d'origine mais en version 6.5 c'est différent)
%clear;
M=DLMREAD('F:/prog/inversionNC/data1.txt','\t');
j=size(M);
m=DLMREAD('F:/prog/inversionNC/data1.txt');
m=m.';
X0=[100000;10000;1000;0;0;10;0;0;0;100000;10000;1000;m(:)];
e=DLMREAD('F:/prog/inversionNC/error1.txt');
e=e.';
E=[1E9;1E8;1E5;0;0;1000;0;0;0;1E9;1E8;1E5;e(:)];
D=size(X0);
C0=eye(D(1));
for i=1:D(1)
C0(i,i)= E(i);
end
X=X0;
a=[j(1,2)];
for h=1:2000
p=[X(1)+X(12+1)*X(2)-X(12+a+1)*X(3)+8.314*X(12+a+1)*log((1-X(12+2*a+1))/(1-X(12+3*a+1)))+((X(12+2*a+1))^2)*(X(4)+X(12+1)*X(5)-X(6)*X(12+a+1))-((X(12+3*a+1))^2)*(X(7)+X(8)*X(12+1)-X(9)*X(12+a+1))];
for b=14:a+12
p=[p;X(1)+X(b)*X(2)-X(a+b)*X(3)+8.314*X(a+b)*log((1-X(2*a+b))/(1-X(3*a+b)))+((X(2*a+b))^2)*(X(4)+X(b)*X(5)-X(6)*X(a+b))-((X(3*a+b))^2)*(X(7)+X(8)*X(b)-X(9)*X(b+a))];
end
P1=[1 X(13) -X(12+a+1) (X(12+2*a+1))^2 (X(12+2*a+1))^2*X(13) -(X(12+2*a+1))^2*X(12+a+1) -(X(12+3*a+1))^2 -(X(12+3*a+1))^2*X(13) (X(12+3*a+1))^2*X(12+a+1)];
for z=14:a+12
P1=[P1;1 X(z) -X(z+a) (X(z+2*a))^2 (X(z+2*a))^2*X(z) -(X(z+2*a))^2*X(z+a) -(X(z+3*a))^2 -(X(z+3*a))^2*X(z) (X(z+3*a))^2*X(z+a)];
end
P2=zeros(a,3);
P3=eye(a);
P4=eye(a);
P5=eye(a);
P6=eye(a);
for y=1:a
P3(y,y)=X(2)+(X(12+y+2*a))^2*X(5)-(X(12+y+3*a))^2*X(8);
P4(y,y)=-X(3)+8.314*log((1-X(2*a+12+y))/(1-X(3*a+12+y)))-X(6)*(X(2*a+12+y))^2+X(9)*(X(3*a+12+y))^2;
P5(y,y)=-8.314*X(12+a+y)/(1-X(2*a+12+y))+2*X(12+2*a+y)*(X(4)+X(12+y)*X(5)-X(12+a+y)*X(6));
P6(y,y)=8.314*X(12+a+y)/(1-X(3*a+12+y))-2*X(12+3*a+y)*(X(7)+X(8)*X(12+y)-X(12+a+y)*X(9));
end
P=[P1 P2 P3 P4 P5 P6];
f=[X(10)+X(12+1)*X(11)-X(a+12+1)*X(12)+8.314*X(12+a+1)*log(X(12+3*a+1)/X(12+2*a+1))-(1-X(12+2*a+1))^2*(X(4)+X(12+1)*X(5)-X(6)*X(12+1+a))+(1-X(12+3*a+1))^2*(X(7)+X(8)*X(12+1)-X(9)*X(12+a+1))];
for b=14:a+12
f=[f;X(10)+X(b)*X(11)-X(a+b)*X(12)+8.314*X(a+b)*log(X(3*a+b)/X(2*a+b))-(1-X(2*a+b))^2*(X(4)+X(b)*X(5)-X(6)*X(a+b))+(1-X(3*a+b))^2*(X(7)+X(8)*X(b)-X(9)*X(b+a))];
end
F2=[-(1-X(12+2*a+1))^2 -(1-X(12+2*a+1))^2*X(12+1) (1-X(12+1+2*a))^2*X(12+a+1) (1-X(12+3*a+1))^2 (1-X(12+3*a+1))^2*X(12+1) -(1-X(12+3*a+1))^2*X(12+a+1) 1 X(12+1) -X(12+a+1)];
for z=14:a+12
F2=[F2;-(1-X(z+2*a))^2 -(1-X(z+2*a))^2*X(z) (1-X(z+2*a))^2*X(z+a) (1-X(z+3*a)^2) (1-X(z+3*a))^2*X(z) -(1-X(z+3*a)^2)*X(z+a) 1 X(z) -X(z+a)];
end
F1=zeros(a,3);
F3=eye(a);
F4=eye(a);
F5=eye(a);
F6=eye(a);
for y=1:a
F3(y,y)=X(11)-(1-X(12+y+2*a))^2*X(5)+(1-X(12+y+3*a))^2*X(8);
F4(y,y)=-X(12)+8.314*log(X(3*a+12+y)/X(2*a+12+y))+X(6)*(1-X(2*a+12+y))^2-X(9)*(1-X(3*a+12+y))^2;
F5(y,y)=-8.314*X(12+a+y)/X(2*a+12+y)+2*(1-X(12+2*a+y))*(X(4)+X(12+y)*X(5)-X(12+a+y)*X(6));
F6(y,y)=8.314*X(12+a+y)/X(3*a+12+y)+2*(X(12+3*a+y)-1)*(X(7)+X(8)*X(12+y)-X(12+y+a)*X(9));
end
F=[F1 F2 F3 F4 F5 F6];
g=[p;f];
G=[P;F];
X=X0+C0*G'*inv(G*C0*G')*(G*(X-X0)-g);
R=[X(1) X(2) X(3) X(4) X(5) X(6) X(7) X(8) X(9) X(10) X(11) X(12)]
end
C=C0-C0*G'*inv(G*C0*G')*G*C0;
W=[C(1,1) C(1,2) C(1,3) C(1,4) C(1,5) C(1,6) C(1,7) C(1,8) C(1,9) C(1,10) C(1,11) C(1,12)];
for v=2:12
W=[W; C(v,1) C(v,2) C(v,3) C(v,4) C(v,5) C(v,6) C(v,7) C(v,8) C(v,9) C(v,10) C(v,11) C(v,12)];
end
D=[E(1) E(2) E(3) E(4) E(5) E(6) E(7) E(8) E(9) E(10) E(11) E(12)];
Q=[D;R;W];
for i=1:a
ka(i)=[X(i+12)];
kb(i)=[X(i+12+a)];
kc(i)=[X(i+12+2*a)];
kd(i)=[X(i+12+3*a)];
end
K=[ka;kb;kc;kd];
dlmwrite('F:/prog/inversionNC/reslt1.txt',R,'\t')
dlmwrite('/rcomp.txt',K,'\t')
et je vous mets egalement les fichiers data et error si vous voulez tester pour voir les valeurs
data
0.2 0.5 1.0 1.0 1.5 1.5 1.5 1.5 1.5 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.5 2.5 2.5 3.0 3.0 3.0 3.0 3.0 3.0 3.0 3.0 4.0 4.0 4.0 4.0 5.0 5.0 5.0 5.0 5.0 6.0
1473 1473 1373 1473 1273 1373 1473 1573 1673 1173 1273 1373 1473 1573 1673 1273 1373 1473 1573 1673 1173 1273 1673 1176 1273 1373 1168 1264 1373 1173 1473 1773 1773 1673 1373 1473 1573 1773 1173 1373 1573 1673 1773 1573
0.8023 0.7790 0.8725 0.8065 0.8940 0.8655 0.8355 0.7550 0.6240 0.9320 0.9075 0.8810 0.8355 0.7765 0.6445 0.9090 0.8710 0.8320 0.7665 0.6300 0.9380 0.9120 0.6275 0.9420 0.9130 0.8770 0.9400 0.9100 0.8790 0.9340 0.8590 0.5635 0.5550 0.7035 0.8710 0.8570 0.7870 0.5260 0.9310 0.8830 0.8000 0.7380 0.5970 0.8080
0.0805 0.0855 0.0560 0.0755 0.0320 0.0450 0.0610 0.0865 0.1175 0.0240 0.0360 0.0440 0.0550 0.0720 0.0970 0.0360 0.0430 0.0545 0.0795 0.1055 0.0210 0.0300 0.1025 0.0180 0.0270 0.0250 0.0110 0.0250 0.0270 0.0180 0.0530 0.0985 0.1090 0.0560 0.0340 0.0360 0.0520 0.0960 0.0075 0.0275 0.0470 0.0630 0.0860 0.0370
error
4.4444E-07 2.7778E-06 1.1111E-05 1.1111E-05 2.5000E-05 2.5000E-05 2.5000E-05 2.5000E-05 2.5000E-05 4.4444E-05 4.4444E-05 4.4444E-05 4.4444E-05 4.4444E-05 4.4444E-05 4.4444E-05 4.4444E-05 4.4444E-05 4.4444E-05 4.4444E-05 4.4444E-05 4.4444E-05 4.4444E-05 6.9444E-05 6.9444E-05 6.9444E-05 1.0000E-04 1.0000E-04 1.0000E-04 1.0000E-04 1.0000E-04 1.0000E-04 1.0000E-04 1.0000E-04 1.7778E-04 1.7778E-04 1.7778E-04 1.7778E-04 2.7778E-04 2.7778E-04 2.7778E-04 2.7778E-04 2.7778E-04 4.0000E-04
1.3611E+00 1.3611E+00 1.3611E+00 1.3611E+00 1.3611E+00 1.3611E+00 1.3611E+00 1.3611E+00 1.3611E+00 1.3611E+00 1.3611E+00 1.3611E+00 1.3611E+00 1.3611E+00 1.3611E+00 1.3611E+00 1.3611E+00 1.3611E+00 1.3611E+00 1.3611E+00 1.3611E+00 1.3611E+00 1.3611E+00 1.3611E+00 1.3611E+00 1.3611E+00 1.3611E+00 1.3611E+00 1.3611E+00 1.3611E+00 1.3611E+00 1.3611E+00 1.3611E+00 1.3611E+00 1.3611E+00 1.3611E+00 1.3611E+00 1.3611E+00 1.3611E+00 1.3611E+00 1.3611E+00 1.3611E+00 1.3611E+00 1.3611E+00
4.3911E-05 2.3225E-05 1.5332E-05 6.2539E-05 2.2370E-05 4.0673E-05 3.4954E-05 7.1128E-05 1.8976E-04 1.4516E-06 7.8743E-06 4.1203E-05 7.9719E-05 1.0939E-04 1.1325E-04 1.2755E-05 2.9395E-05 5.2257E-05 1.2809E-04 6.1330E-05 7.3046E-06 1.4516E-06 1.2420E-04 4.1649E-06 3.2661E-06 3.6415E-05 2.7778E-04 9.3711E-06 1.2559E-04 1.4062E-03 5.5241E-05 1.1114E-04 1.1186E-03 6.0363E-04 5.0333E-05 5.8569E-05 1.7782E-05 2.6297E-04 3.2985E-05 1.1816E-05 9.2902E-05 7.1128E-05 3.1497E-05 1.0412E-04
5.0816E-05 4.7993E-05 9.0724E-06 2.6219E-05 3.9063E-05 5.8064E-06 3.2661E-06 4.4455E-06 4.8659E-06 3.2661E-06 1.3064E-05 1.7782E-05 3.2661E-06 2.3225E-05 3.6290E-05 1.3064E-05 2.9395E-05 2.0413E-05 7.3487E-06 2.6219E-05 2.9395E-05 3.6290E-07 9.7656E-06 1.4516E-06 3.2661E-06 2.5000E-03 3.9062E-05 1.7782E-05 2.7778E-04 3.9062E-05 1.3064E-05 4.8659E-06 2.1626E-06 2.3361E-01 1.3064E-05 1.0412E-06 3.9063E-05 4.1649E-06 1.6721E-06 5.2712E-06 2.1626E-06 3.9063E-05 3.9062E-05 2.1626E-06
Voila j'espere avoir été complete
Merci de votre aide
Hors ligne
#16 Le 26/10/2007, à 09:40
- laroche1
Re : précision resultat matlab
AH mais je comprends mieux maintenant le probleme
Oui Oui J'ai bien testé 2 fois le programme sur la meme version avec les memes données mais j'obtiens les memes resultats .
Hors ligne
#17 Le 26/10/2007, à 09:44
- Chessangel
Re : précision resultat matlab
AH mais je comprends mieux maintenant le probleme
Oui Oui J'ai bien testé 2 fois le programme sur la meme version avec les memes données mais j'obtiens les memes resultats .
Même en lançant rand('state',sum(clock)) entre les deux ?
Une commission d'enquête pour être efficace, ne doit compter que trois membres, dont deux sont absents. G. Clémenceau
Hors ligne
#18 Le 26/10/2007, à 09:45
- laroche1
Re : précision resultat matlab
atta je ressaye ,
Bé j'ai lancé une premiere fois j'obtiens
ceci :
36061.4769 638.5272 19.4119 0 0 -11.7029 0 0 0 59311.6068 2524.1508 21.687
je lance la commande que tu m'as dit
et je relance une seconde fois
36061.4769 638.5272 19.4119 0 0 -11.7029 0 0 0 59311.6068 2524.1508 21.687
C'est pareil
Que me conseilleriez vous?? continuer sur une autre version plus recente ....?
Dernière modification par laroche1 (Le 26/10/2007, à 09:48)
Hors ligne
#19 Le 26/10/2007, à 09:49
- Chessangel
Re : précision resultat matlab
Est-ce que tu pourrais m'envoyer les fichier .txt pour que j'essaye sur ma version (7.4) ? Mon adresse est jerome.prog<at>gmail.com.
Une commission d'enquête pour être efficace, ne doit compter que trois membres, dont deux sont absents. G. Clémenceau
Hors ligne
#20 Le 26/10/2007, à 09:51
- Le Farfadet Spatial
Re : précision resultat matlab
Salut à tous !
Oui Oui J'ai bien testé 2 fois le programme sur la meme version avec les memes données mais j'obtiens les memes resultats .
Les choses seront probablement différentes avec la ligne qu'a donné Chessangel :
rand('state', sum(clock));
Désolé, ça m'était sortie de la tête, j'utilise trop peu souvent MatLab pour ça.
En tout cas, il y a une morale à cette histoire : avant d'accuser ton compilateur --- ici, ton interpréteur, à savoir MatLab, --- remet en cause ton code, puis ton algorithme. Les bogues de compilateurs (ou d'interpréteurs) arrivent, mais moins souvent que les erreurs d'algorithme ou de codage. Le bon ordre est celui-ci :
1. Est-ce que je n'ai pas fait une erreur dans mon code ?
2. Si la réponse à la première question est non, est-ce que mon algorithme est bon ?
3. Si la réponse à la première question est non et celle à la deuxième oui, est-ce que mon compilateur (ou interpréteur) est bogué ?
4. Si rien n'explique les réactions étranges du code, alors il faut voir si ce n'est pas le processeur qui est en cause.
En l'occurrence, il n'y a pas d'erreur, mais l'algorithme employé explique les réactions de ton code.
À bientôt.
Le Farfadet Spatial
Hors ligne
#21 Le 26/10/2007, à 09:54
- laroche1
Re : précision resultat matlab
je t'ai tout envoyé
Merci pour ton aide
petite précision
J'ai recupéré ce code que quelqu'un avait crée pour une version matlab x , le probleme c'est que cette personne n'est plus joignable
J'ai donc fait des modifications pour le faire marcher sous 6.5. Apparemment ça marche puisqu'avec son code et le mien j'obtiens les memes resultats sous la version 5.3
Mais son code ne marche pas sous 6.5
Dernière modification par laroche1 (Le 26/10/2007, à 09:56)
Hors ligne
#22 Le 26/10/2007, à 10:21
- Chessangel
Re : précision resultat matlab
Ok, voici ce que j'obtiens sur la version 7.4
36062 638.52 19.413 0 0 -11.703 0 0 0 59312 2524.1 21.687
Donc les résultats m'ont l'air à première vue corrects.
Par contre, il est impératif de vérifier que ton changement de code n'a pas d'impact ! Parce que j'ai remarqué que ta matrice m est de dimension 4x44 après la lecture de Matlab, ce qui ne devrait pas être le cas, vu comment le code a été formulé dans sa version originale (cela devrait être un vecteur ligne (1x176)). Donc, il faut absolument vérifier que ta transformation
m=m.';
X0=[100000;10000;1000;0;0;10;0;0;0;100000;10000;1000;m(:)];
préserve les chiffres dans l'ordre désiré... Pour cela, il faut malheureusement bien comprendre le but de l'algorithme, ce qui n'est pas mon cas, n'étant pas du tout du domaine. Parce qu'à mon avis, il est possible que la différence entre tes deux résultats vienne de là (l'algorithme n'utilise pas de nombres aléatoires). Ou alors, c'est réellement un problème de précision, mais ça m'étonne beaucoup !
Dernière modification par Chessangel (Le 26/10/2007, à 10:22)
Une commission d'enquête pour être efficace, ne doit compter que trois membres, dont deux sont absents. G. Clémenceau
Hors ligne
#23 Le 26/10/2007, à 10:24
- laroche1
Re : précision resultat matlab
mais avec son code d'origine , je n'obtiens pas les bons résultats!!! et logiquemement il fonctionne
Le souci quand je ressors X0 , je n'arrive pas à voir si les chiffres sont bien positionnés car il met les resultats en 1E5
Dernière modification par laroche1 (Le 26/10/2007, à 10:27)
Hors ligne
#24 Le 26/10/2007, à 10:27
- Chessangel
Re : précision resultat matlab
Non, d'après le code d'origine que tu m'as envoyé, le problème n'est pas d'obtenir les bons résultats, le problème est qu'il ne tourne pas : il plante parce que la matrice m, lue du fichier data.txt via la commande dlmread, n'a pas les bonnes dimensions...
Une commission d'enquête pour être efficace, ne doit compter que trois membres, dont deux sont absents. G. Clémenceau
Hors ligne
#25 Le 26/10/2007, à 10:29
- laroche1
Re : précision resultat matlab
oui c'est sur il ne marche pas avec les versions recentes mais c bon avec une version 5.3 par contre le fichier data.txt d'origine (c'est le meme mais pas le meme format mais je ne comprends pas ...) je te l'envoie
Hors ligne