Bonjour tous,
je suis en galere avec la fonction "lsqnonlin", il me semble que mon programme est bien fait mais la fonction ne me minimise pas l'erreur.
J'ai donc plusieurs questions à vous posez, j'espere que vous pourrez m'aider.
1°) la syntaxe à utiliser est bien celle ci si je souhaite avoir en sortie de residu ainsi que le vecteur de parametres de sortie?
=> dans mon repertoire j'ai fais une fonction myfun qui prend en entrée le vecteur "vecteurEntree"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 [x,resnorm] = lsqnonlin(@myfun,vecteurEntree,-100000,+100000,1e-15)
=> en sortie cette fonction doit bien donner un vecteur qui est la différence entre les données experimentales et les données numerique l'on a calculé? il ne faut pas definir nous meme le residu d'apres ce que j'ai compris?
=> j'ai mis des limites car je ne veux pas que les valeurs contenues dans le vecteur soient < à -100000 et > à 100000
=> je veux que le residu en sortie de calcul soit inferieur à 1e-15
2°) j'ai lancé mon programme avec cette syntaxe mais il ne fait que quelques iterations et me donne: residu = 1e-4 ce qui est le residu que j'avais dès le depart
=> en fait j'ai l'impression qu'il n'a pas pris en compte la donnée que je lui est filé: 1e-15 ??
3°) vous trouverez ci dessous mon programme, peut etre que une de mes erreur viens tout simplement de la programmation
ma fonction "myfun" est en fait un logiciel qui est lancé à partir de son .exe, avant de lancer le logiciel je réecris le fichier "data" qui lui sert pour ses calculs; une fois le calcul terminé je recupére les resultats qui se trouvent dans un fichier texte avec la fonction loadResults que j'ai fais.
main.m
myfun.m
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 Gammamg5si6=0.1; Amg5si6=-918; Bmg5si6=-64; Gammamg2si=0.2; Amg2si=7145; Bmg2si=2.4539; parametresInitiaux=[Gammamg5si6 Amg5si6 Bmg5si6 Gammamg2si Amg2si Bmg2si]; normalisation=[1/Gammamg5si6 1/Amg5si6 1/Bmg5si6 1/Gammamg2si 1/Amg2si 1/Bmg2si]; vecteurEntree=parametresInitiaux.*normalisation; [x,resnorm] = lsqnonlin(@myfun,vecteurEntree,-100000,+100000,1e-15)
writeDataFile.m
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 function F = myfun(vecteurEntree) Yexp=[5*10^-9 0.017]; Gammamg5si6=0.1; Amg5si6=-918; Bmg5si6=-64; Gammamg2si=0.2; Amg2si=7145; Bmg2si=2.4539; normalisation=[Gammamg5si6 Amg5si6 Bmg5si6 Gammamg2si Amg2si Bmg2si]; vecteurEntreeData=vecteurEntree.*normalisation; writeDataBase=writeDataFile(vecteurEntreeData(1),vecteurEntreeData(2),vecteurEntreeData(3)... ,vecteurEntreeData(4),vecteurEntreeData(5),vecteurEntreeData(6)); if (writeDataBase==0) disp('error in dataBase writing'); end system('monLogicielDeCalculQuiDonneResultatsTXT.exe'); Ynum=loadResult(); vectorOfDifferences=(Ynum-Yexp); F=vectorOfDifferences;
loadResults.m
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 function test=writeDataFile(Gamma1,A1,B1,Gamma2,A2,B2) fid = fopen('dataExemple.txt','r'); fidm = fopen('data.txt','w+'); N = 21; for n = 1:N ligne = fgets(fid); fprintf(fidm,ligne); end ligne = fgets(fid); fprintf(fidm,'A 1.995e-28 %g %g %g 0 0 0 5 6 \n', Gamma1, A1, B1); ligne = fgets(fid); fprintf(fidm,'B 1.305e-28 %g %g %g 0 0 0 2 1 \n', Gamma2, A2, B2); while ~feof(fid) %fait la boucle en continu ligne = fgets(fid); fprintf(fidm, ligne); end fclose(fid); fclose(fidm); test=1;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 function NumericalData=loadResult() numericMeanRadius=load('RmFile.dat'); numericVolumicFraction=load('FvFile.dat'); numericalVector=[numericMeanRadius numericVolumicFraction]; NumericalData=numericalVector;
Partager