Gnuplot
Ajuster les données avec gnuplot
Recherche…
Introduction
La commande ajustement peut ajuster une fonction définie par l' utilisateur à un ensemble de points de données (x,y)
ou (x,y,z)
, en utilisant une implémentation de la méthode des moindres carrés non linéaire (NLLS) algorithme de Levenberg-Marquardt.
Toute variable définie par l'utilisateur apparaissant dans le corps de la fonction peut servir de paramètre d'ajustement, mais le type de retour de la fonction doit être réel.
Syntaxe
- adapter [xrange] [yrange] fonction "fichier de données" en utilisant le modificateur via parameter_file
Paramètres
Paramètres | Détail |
---|---|
Paramètres d'ajustement a , b , c et toute lettre qui n'a pas été utilisée précédemment | Utilisez des lettres pour représenter les paramètres qui seront utilisés pour adapter une fonction. Ex: f(x) = a * exp(b * x) + c , g(x,y) = a*x**2 + b*y**2 + c*x*y |
Paramètres de fichier start.par | Au lieu d'utiliser des paramètres non initialisés (le Marquardt-Levenberg initialise automatiquement pour vous a=b=c=...=1 ), vous pouvez les placer dans un fichier start.par et les appeler dans la section parameter_file . Ex: fit f(x) 'data.dat' u 1:2 via 'start.par' . Un exemple pour le fichier start.par est montré ci-dessous |
Remarques
Brève introduction
fit
est utilisé pour trouver un ensemble de paramètres qui correspondent le mieux à vos données à votre fonction définie par l'utilisateur. L'ajustement est jugé sur la base de la somme des différences au carré ou des «résidus» (SSR) entre les points de données d'entrée et les valeurs de fonction, évaluées aux mêmes endroits. Cette quantité est souvent appelée «chisquare» (c'est-à-dire la lettre grecque chi, à la puissance de 2). L'algorithme tente de minimiser le SSR, ou plus précisément le WSSR, car les résidus sont "pondérés" par les erreurs de données d'entrée (ou 1.0) avant d'être mis au carré. ( Ibidem )
Le fichier fit.log
Après chaque étape d'itération, une information détaillée est donnée sur l'état de l'ajustement à la fois sur l'écran et sur ce que l'on appelle le fichier journal fit.log
. Ce fichier ne sera jamais effacé mais toujours ajouté pour que l'historique de l'ajustement ne soit pas perdu.
Ajustement des données avec des erreurs
Il peut y avoir jusqu'à 12 variables indépendantes, il y a toujours une variable dépendante et un nombre quelconque de paramètres peut être ajusté. En option, des estimations d'erreur peuvent être entrées pour pondérer les points de données. (T. Williams, C. Kelley - gnuplot 5.0, un programme de traçage interactif )
Si vous avez un ensemble de données et que vous souhaitez l'ajuster si la commande est très simple et naturelle:
fit f(x) "data_set.dat" using 1:2 via par1, par2, par3
où plutôt f(x)
pourrait être aussi f(x, y)
. Si vous avez également des estimations d’erreurs de données, ajoutez simplement le {y | xy | z}errors
( { | }
représentent les choix possibles) dans l'option modificateur (voir Syntaxe) . Par exemple
fit f(x) "data_set.dat" using 1:2:3 yerrors via par1, par2, par3
où le {y | xy | z}errors
options d' {y | xy | z}errors
nécessitent respectivement 1 ( y
), 2 ( xy
), 1 ( z
) colonne spécifiant la valeur de l'estimation de l'erreur.
xyerrors
exponentiel avec xyerrors
d'un fichier
Les estimations d'erreur de données sont utilisées pour calculer le poids relatif de chaque point de données lors de la détermination de la somme pondérée des résidus au carré, WSSR ou chisquare. Ils peuvent affecter les estimations des paramètres, car ils déterminent l'influence de la déviation de chaque point de données par rapport à la fonction ajustée sur les valeurs finales. Certaines des informations d'ajustement, y compris les estimations des erreurs de paramètres, sont plus significatives si des estimations précises des erreurs de données ont été fournies. ( Ibidem )
Nous prendrons un ensemble de données échantillonné measured.dat
, composé de 4 colonnes: les coordonnées de l'axe des abscisses ( Temperature (K)
), les coordonnées de l'axe des ordonnées ( Pressure (kPa)
), les estimations d'erreur x ( T_err (K)
) et les estimations d'erreur y ( P_err (kPa)
).
#### 'measured.dat' ####
### Dependence of boiling water from Temperature and Pressure
##Temperature (K) - Pressure (kPa) - T_err (K) - P_err (kPa)
368.5 73.332 0.66 1.5
364.2 62.668 0.66 1.0
359.2 52.004 0.66 0.8
354.5 44.006 0.66 0.7
348.7 34.675 0.66 1.2
343.7 28.010 0.66 1.6
338.7 22.678 0.66 1.2
334.2 17.346 0.66 1.5
329.0 14.680 0.66 1.6
324.0 10.681 0.66 1.2
319.1 8.015 0.66 0.8
314.6 6.682 0.66 1.0
308.7 5.349 0.66 1.5
Maintenant, il suffit de composer le prototype de la fonction qui, d'après la théorie, devrait se rapprocher de nos données. Dans ce cas:
Z = 0.001
f(x) = W * exp(x * Z)
où nous avons initialisé le paramètre Z
car, sinon, évaluer la fonction exponentielle exp(x * Z)
donne des valeurs énormes, ce qui conduit à Infinity et NaN dans l’algorithme d’adaptation de Marquardt-Levenberg, vous n’avez généralement pas besoin d’initialiser variables - regardez ici , si vous voulez en savoir plus sur Marquardt-Levenberg.
Il est temps d'adapter les données!
fit f(x) "measured.dat" u 1:2:3:4 xyerrors via W, Z
Le résultat ressemblera
After 360 iterations the fit converged.
final sum of squares of residuals : 10.4163
rel. change during last iteration : -5.83931e-07
degrees of freedom (FIT_NDF) : 11
rms of residuals (FIT_STDFIT) = sqrt(WSSR/ndf) : 0.973105
variance of residuals (reduced chisquare) = WSSR/ndf : 0.946933
p-value of the Chisq distribution (FIT_P) : 0.493377
Final set of parameters Asymptotic Standard Error
======================= ==========================
W = 1.13381e-05 +/- 4.249e-06 (37.47%)
Z = 0.0426853 +/- 0.001047 (2.453%)
correlation matrix of the fit parameters:
W Z
W 1.000
Z -0.999 1.000
Où maintenant W
et Z
sont remplis avec les paramètres désirés et les erreurs estimées sur ceux-là.
Le code ci-dessous produit le graphique suivant.
set term pos col
set out 'PvsT.ps'
set grid
set key center
set xlabel 'T (K)'
set ylabel 'P (kPa)'
Z = 0.001
f(x) = W * exp(x * Z)
fit f(x) "measured.dat" u 1:2:3:4 xyerrors via W, Z
p [305:] 'measured.dat' u 1:2:3:4 ps 1.3 pt 2 t 'Data' w xyerrorbars,\
f(x) t 'Fit'
Terrain avec ajustement de measured.dat
En utilisant la commande with xyerrorbars
affiche des erreurs sur les estimations x et des y. set grid
placera une grille en pointillés sur les tics principaux.
Dans le cas où les estimations d'erreur ne sont pas disponibles ou sont sans importance, il est également possible d'adapter les données sans {y | xy | z}errors
correspondant à l'option:
fit f(x) "measured.dat" u 1:2 via W, Z
Dans ce cas, les xyerrorbars
devaient également être évités.
Exemple de fichier "start.par"
Si vous chargez vos paramètres d'ajustement à partir d'un fichier, vous devez déclarer tous les paramètres que vous allez utiliser et, le cas échéant, les initialiser.
## Start parameters for the fit of data.dat
m = -0.0005
q = -0.0005
d = 1.02
Tc = 45.0
g_d = 1.0
b = 0.01002
Fit: interpolation linéaire de base d'un ensemble de données
L'utilisation simple de l'ajustement s'explique mieux par un exemple simple:
f(x) = a + b*x + c*x**2 fit [-234:320][0:200] f(x) ’measured.dat’ using 1:2 skip 4 via a,b,c plot ’measured.dat’ u 1:2, f(x)
Des plages peuvent être spécifiées pour filtrer les données utilisées lors du montage. Les points de données hors plage sont ignorés. (T. Williams, C. Kelley - gnuplot 5.0, un programme de traçage interactif )
L'interpolation linéaire (ajustée avec une ligne) est la manière la plus simple d'adapter un ensemble de données. Supposons que vous ayez un fichier de données où la croissance de votre quantité y est linéaire, vous pouvez utiliser
polynômes linéaires pour construire de nouveaux points de données dans la gamme d'un ensemble discret de points de données connus. (extrait de Wikipedia, interpolation linéaire )
Exemple avec un polynôme de première classe
Nous allons travailler avec le jeu de données suivant, appelé house_price.dat
, qui comprend les mètres carrés d'une maison dans une certaine ville et son prix en 1000 dollars.
### 'house_price.dat'
## X-Axis: House price (in $1000) - Y-Axis: Square meters (m^2)
245 426.72
312 601.68
279 518.16
308 571.50
199 335.28
219 472.44
405 716.28
324 546.76
319 534.34
255 518.16
Nous allons adapter ces paramètres avec gnuplot La commande elle-même est très simple, comme vous pouvez le constater avec la syntaxe, définissez simplement votre prototype, puis utilisez la commande fit
pour obtenir le résultat:
## m, q will be our fitting parameters
f(x) = m * x + q
fit f(x) 'data_set.dat' using 1:2 via m, q
Mais il pourrait être intéressant d'utiliser également les paramètres obtenus dans l'intrigue elle-même. Le code ci-dessous correspond au fichier house_price.dat
, puis trace les paramètres m
et q
pour obtenir la meilleure approximation de la courbe de l'ensemble de données. Une fois que vous avez les paramètres, vous pouvez calculer la y-value
, dans ce cas le prix Maison , à partir de n'importe quelle x-vaule
( mètres carrés de la maison) en remplaçant simplement la formule
y = m * x + q
la x-value
appropriée. Commentons le code.
0. Définition du terme
set term pos col
set out 'house_price_fit.ps'
1. Administration ordinaire pour embellir le graphique
set title 'Linear Regression Example Scatterplot'
set ylabel 'House price (k$ = $1000)'
set xlabel 'Square meters (m^2)'
set style line 1 ps 1.5 pt 7 lc 'red'
set style line 2 lw 1.5 lc 'blue'
set grid
set key bottom center box height 1.4
set xrange [0:450]
set yrange [0:]
2. Le bon ajustement
Pour cela, il suffit de taper les commandes:
f(x) = m * x + q
fit f(x) 'house_price.dat' via m, q
3. Enregistrement des valeurs m
et q
dans une chaîne et tracé
Ici, nous utilisons la fonction sprintf
pour préparer l'étiquette (encadrée dans le object rectangle
) dans laquelle nous allons imprimer le résultat de l'ajustement. Enfin, nous traçons le graphique entier.
mq_value = sprintf("Parameters values\nm = %f k$/m^2\nq = %f k$", m, q)
set object 1 rect from 90,725 to 200, 650 fc rgb "white"
set label 1 at 100,700 mq_value
p 'house_price.dat' ls 1 t 'House price', f(x) ls 2 t 'Linear regression'
set out
La sortie ressemblera à ceci.