Bonjour à tous,

je travaille actuellement en spectrométrie infrarouge, plus précisément sur la détermination du taux d'argiles, de carbonates et de silicates dans des roches.
Le fichier joint contient les données d'un spectre d'un échantillon dont on cherche à déterminer les concentrations en argile, carbonate et silicate (data).
Les trois autres spectres sont ceux d'échantillons de références (clay, carbonate, silicate).

spectres.txt

Mon modèle est le suivant : f=a*clay+b*carbonate+c*silicate+residu. Ces coefficients (a,b et c) sont liés aux taux d'argile, de carbonate et de silicate.

Je cherche à réaliser une régression par les moindres carrés entre mon spectre échantillon (data) et mon modèle afin de déterminer les coefficients a,b,c et le résidu.

Mon code:

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
21
22
23
24
25
26
27
28
29
 
%Ouverture du fichier contenant données et références
[filename,pathname] = uigetfile({'*.txt'},'Choose the file contening spectra');
fullpathname = strcat (pathname, filename);
inputdata = readtable(fullpathname);
 
%Définition de chacun des éléments du fichier
[~,larg]=size(inputdata);
data=table2array(inputdata(5,2:larg));
clay=table2array(inputdata(2,2:larg));
carbonate=table2array(inputdata(3,2:larg));
silicate=table2array(inputdata(4,2:larg));
 
coeffinit = [0.33; 0.33; 0.33; 0];
[solut,res] = lsqnonlin(misfit,coeffinit);
 
%modèle
function f=compomodel(a, b, c, clay, carbonate, silicate, res)
    f=a*clay+b*carbonate+c*silicate+res;
end
 
 
function f=misfit(parms)
   a=parms(1);
   b=parms(2);
   c=parms(3);
   res=parms(4);
   f=abs(data-compomodel(a, b, c, clay, carbonate, silicate, res));
end
Je veux initialiser lsqnonlin avec les valeurs de coeffinit pour que a,b,c prennent les valeurs 0.33 et mon résidu 0. Cependant, lors de l'exécution, la fonction ne prend pas en compte mon initialisation et me dit que des paramètres sont manquants.

Je n'ai peut-être pas complètement saisi l'utilisation de la fonction lsqnonlin... Alors si quelqu'un peut m'aider ce serait génial.

Par avance, je vous remercie de m'avoir lu et de l'aide que vous pourrez m'apporter