3

J'essaie d'adapter certaines données de vent horizontal à une courbe cosinus afin d'estimer la direction et la vitesse des vents à différentes hauteurs (affichage d'azimut de vitesse), mais il semble que chaque fois Je tente de le faire avec des valeurs> ~ 1, la courbe semble trop plate et la sortie de l'ajustement est plus faible que prévu.scipy curve_fit échoue lors de l'adaptation à de grandes valeurs

import numpy as np 
import scipy.optimize as sc 

azimuth = np.full((8), 60) #All values = 60 deg. 
velocity = [5.6261001,6.6962662,3.9316666,-0.88413334,-5.4323335,-6.5153003,-3.2538002,1.0269333] 
#Function that defines curve that data will be fitted to 
def cos_Wave(x,a, b, c): 
    return a * np.cos(x-b) + c 

azimuthData = np.deg2rad(azimuth) 
coeffs, matcov = sc.curve_fit(cos_Wave, azimuthData, velocity, p0 = (1,0,0) 

plt.scatter(azimuthData, velocity) 
plt.plot(azimuthData, cos_Wave(azimuthData, *coeffs)) 
plt.show() 
print(coeffs) 

Avec la sortie de coeffs être: [1, 0., 0,13705066] et l'intrigue attaché:

Python CurveFit

J'ai effectué une curvefit similaire en utilisant IDL de builtin fonction curvefit, et a reçu des valeurs plus réalistes donnant [7.0348234, 0.59962606, 0.079354301] et fournissant un bon ajustement. Y a-t-il une raison pour laquelle c'est le cas? Je suppose que cela a probablement quelque chose à voir avec l'estimation initiale (P0), cependant, l'utilisation d'une estimation initiale initiale dans la mise en œuvre de l'IDL fournit toujours des résultats beaucoup plus raisonnables.

+0

'azimut = [0: 8]' est pas python valide. Peut-être que vous essayez de simplifier le code pour la question, mais ce n'est pas une bonne façon de le faire. Idéalement, votre code est quelque chose que nous pouvons copier et gérer nous-mêmes. –

+0

Désolé à ce sujet, corrigé – bgoudeau

+0

Il y a plus à être fixé. La ligne contenant l'appel à 'curve_fit' manque une parenthèse fermante. Plus important encore, 'azimuth' (et par conséquent' azimuthData') est un tableau contenant toutes les mêmes valeurs. Si ce sont les coordonnées * x * de vos données, alors bien sûr 'curve_fit' ne fonctionnera pas. Cependant, je pense que ce code n'est pas le code qui a généré l'intrigue que vous montrez. Veuillez corriger le code et vérifiez que le code que vous incluez dans la question correspond exactement au code pour lequel vous avez une question. C'est-à-dire, exécutez * ce code *, et assurez-vous qu'il démontre le problème que vous avez. –

Répondre

2

Vous devez corriger quelques petites choses:

import numpy as np 
import scipy.optimize as sc 
import matplotlib.pyplot as plt 

azimuth = np.linspace(0, 360, 8) # deg values from 0 to 360 
velocity = [5.6261001, 6.6962662, 3.9316666, -0.88413334, -5.4323335, 
      -6.5153003, -3.2538002, 1.0269333] 


def cos_Wave(x, a, b, c): 
    """Function that defines curve that data will be fitted to""" 
    return a * np.cos(x-b) + c 


azimuthData = np.deg2rad(azimuth) 
coeffs, matcov = sc.curve_fit(cos_Wave, azimuthData, velocity, p0=[1, 0, 0]) 

plt.scatter(azimuthData, velocity) 
nx = np.linspace(0, 2 * np.pi, 100) 
plt.plot(nx, cos_Wave(nx, *coeffs)) 
plt.savefig("plot.png") 
print(coeffs) 

[6,63878549 1,03148322 -0,27674095]

enter image description here

+0

Ah, je me sens très bête. J'ai confondu l'azimut avec l'élévation et je vois où je me suis trompé maintenant. C'était un long lundi ... Merci pour l'aide! – bgoudeau

+1

@bgoudeau Les valeurs dans 'azimuth' sont-elles supposées être les 8 points cardinaux (c'est-à-dire [0, 45, 90, 135, 180, 225, 270, 315])? Si c'est le cas, alors le tableau 'azimuth' devrait être créé avec, par exemple,' azimuth = np.linspace (0, 360, 8, endpoint = False) '. Actuellement, dans cette réponse, 'azimuth' contient 0 * et * 360, et l'espacement entre les angles est de 51,43. –

+0

Oui, ils le sont. C'est une correction que j'ai faite dans mon code après avoir réalisé ce que je faisais mal après avoir vu la solution mise de l'avant par David. Merci pour l'aide Warren, désolé de ne pas avoir posté le code complet aussi. Je suis à peu près sûr que celui-ci est résolu. – bgoudeau