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.
'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. –
Désolé à ce sujet, corrigé – bgoudeau
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. –