2017-06-07 2 views
1

je tentais d'adapter cet ensemble de données:jeu de données d'onde sinusoïdale Fitting amorti avec gnuplot, obtenir beaucoup d'erreurs

#Mydataset damped sine wave data 
#X ---- Y 
45.80 320.0 
91.60 -254.0 
137.4 198.0 
183.2 -156.0 
229.0 126.0 
274.8 -100.0 
320.6 80.0 
366.4 -64.0 
412.2 52.0 
458.0 -40.0 
503.8 34.0 
549.6 -26.0 
595.4 22.0 
641.2 -18.0 

qui, comme vous pouvez le voir par le tracé ci-dessous, a la tendance classique d'une onde sinusoïdale amortie : enter image description here

donc j'ai d'abord définir la macro pour l'ajustement

f(x) = exp(-a*x)*sin(b*x) 

alors je fait le bon ajustement

fit f(x) 'data.txt' via a,b 
iter  chisq  delta/lim lambda a    b    
    0 2.7377200000e+05 0.00e+00 1.10e-19 1.000000e+00 1.000000e+00 

Current data point 
========================= 
#    = 1 out of 14 
x    = -5.12818e+20 
z    = 320    

Current set of parameters 
========================= 
a    = -5.12818e+20 
b    = -1.44204e+20 

     Function evaluation yields NaN ("not a number") 

en obtenant un résultat NaN. J'ai donc regardé STackOverflow et je me suis souvenu que j'ai déjà eu des problèmes dans le passé en ajustant exponentielle en raison de leur croissance/désintégration rapide qui nécessite de définir les paramètres initiaux pour ne pas avoir cette erreur (comme je l'ai demandé).). J'ai donc essayé en définissant comme paramètres de départ a et b que ceux attendus, a = 9000, b=146000, mais le résultat était plus frustrant que le précédent:

fit f(x) 'data.txt' via a,b 
iter  chisq  delta/lim lambda a    b    
    0 2.7377200000e+05 0.00e+00 0.00e+00 9.000000e+03 1.460000e+05 
     Singular matrix in Givens() 

J'ai pensé: « ce sont trop grand nombre , essayons avec les plus petits ". donc je suis entré dans les valeurs jusqu'à ce que je représenté graphiquement la sortie a et b et a commencé à montage à nouveau

a = 0.01 
b = 2 
fit f(x) 'data.txt' via a,b 
iter  chisq  delta/lim lambda a    b    
    0 2.7429059500e+05 0.00e+00 1.71e+01 1.000000e-02 2.000000e+00 
    1 2.7346318324e+05 -3.03e+02 1.71e+00 1.813940e-02 -9.254913e-02 
    * 1.0680927157e+137 1.00e+05 1.71e+01 -2.493611e-01 5.321099e+00 
    2 2.7344431789e+05 -6.90e+00 1.71e+00 1.542835e-02 4.310193e+00 
    * 6.1148639318e+81 1.00e+05 1.71e+01 -1.481123e-01 -1.024914e+01 
    3 2.7337226343e+05 -2.64e+01 1.71e+00 1.349852e-02 -9.008087e+00 
    * 6.4751980241e+136 1.00e+05 1.71e+01 -2.458835e-01 -4.089511e+00 
    4 2.7334273482e+05 -1.08e+01 1.71e+00 1.075319e-02 -4.346296e+00 
    * 1.8228530731e+121 1.00e+05 1.71e+01 -2.180542e-01 -1.407646e+00 
    * 2.7379223634e+05 1.64e+02 1.71e+02 8.277720e-03 -1.440256e+00 
    * 2.7379193486e+05 1.64e+02 1.71e+03 1.072342e-02 -3.706519e+00 
    5 2.7326800742e+05 -2.73e+01 1.71e+02 1.075288e-02 -4.338196e+00 
    * 2.7344116255e+05 6.33e+01 1.71e+03 1.069793e-02 -3.915375e+00 
    * 2.7327905718e+05 4.04e+00 1.71e+04 1.075232e-02 -4.332930e+00 
    6 2.7326776014e+05 -9.05e-02 1.71e+03 1.075288e-02 -4.338144e+00 
iter  chisq  delta/lim lambda a    b    

After 6 iterations the fit converged. 
final sum of squares of residuals : 273268 
rel. change during last iteration : -9.0493e-07 

degrees of freedom (FIT_NDF)      : 12 
rms of residuals  (FIT_STDFIT) = sqrt(WSSR/ndf) : 150.905 
variance of residuals (reduced chisquare) = WSSR/ndf : 22772.3 

Final set of parameters   Asymptotic Standard Error 
=======================   ========================== 
a    = 0.0107529  +/- 3.114  (2.896e+04%) 
b    = -4.33814   +/- 3.678  (84.78%) 

correlation matrix of the fit parameters: 
       a  b  
a    1.000 
b    0.274 1.000 

je l'ai vu produit un résultat, donc je pensais que tout était ok, mais mon bonheur a duré quelques secondes,: enter image description here Wow. Un très bon.

Et je me demande toujours ce qui ne va pas et comment obtenir un ajustement correct d'un ensemble de données à onde sinusoïdale amortie avec gnuplot. Espérons que quelqu'un connaît la réponse :)

Répondre

3

La fonction pour laquelle vous ajustez les données n'est pas adaptée aux données. L'enveloppe des données est une fonction décroissante, vous voulez donc un paramètre d'amortissement positif a. Mais alors votre fonction d'ajustement ne peut pas être supérieure à 1 pour x positif, contrairement à vos données. De plus, en utilisant une fonction sinus dans votre ajustement, vous supposez quelque chose sur le comportement de la phase - la fonction ajustée sera toujours nulle à x = 0. Cependant, vos données semblent avoir une amplitude négative importante.

Donc, nous allons choisir une fonction meilleur ajustement, et donner un coup de main gnuplot en choisissant des estimations initiales raisonnables pour les paramètres:

f(x)=c*exp(-a*x)*cos(b*x) 
a=1./500 
b=2*pi/100. 
c=-400. 
fit f(x) 'data.txt' via a,b,c 
plot f(x), "data.txt" w p 

donne

enter image description here

+0

solution Smart! Merci beaucoup. Je me demande seulement maintenant: comment avez-vous choisi les valeurs devinées pour définir les paramètres initiaux 'a',' b' et 'c'? Quelle était ta méthode? – opisthofulax

+1

1/a est la "longueur de décroissance" de votre exponentielle, donc en regardant vos données, une valeur de quelques centaines semble à peu près juste. La période d'oscillation de la courbe du cosinus semble être d'environ 100, et b devrait être divisée par ce nombre. À x = 0, on s'attendrait à une amplitude négative importante, et -400 à peu près correct. – user8153