Python : Nan
Bonjour à tous,
Voici mon code
Voici le résultat
Je pense que vous avez compris le problème. Je divise par $0$ et ça me complique un peu la vie. Si vous avez une idée pour éviter ça, c'est avec plaisir !
Voici mon code
import numpy as np import math from pylab import cm,imshow,colorbar,title,show #Paramétrisation N = 1000 #pas de discrétisation de l'intervalle [0,1]. N[i] correspond à la coordonnée i. epsilon = .000001 arret = .01 T = np.linspace(0,1,N, False) #points de discrétisation de l'intervalle [0,1] #Calcul de Gamma_Barre X,Y = np.meshgrid(T,T) C = (X-Y)**2 #Matrice contenant les c[i,j]=(xi-yj)² GammaB = np.exp(-C/epsilon) #Matrice contenant les GammaB[i,j] = Gamma_Barrei,j def SinkHorn(mu,nu,arret): a2 = np.ones(N) b2 = np.ones(N) erreur = math.inf while (erreur>arret): a1 = a2 b1 = b2 a2 = mu/(np.dot(GammaB,b1)) b2 = nu/(np.dot(GammaB.T,a2)) erreur = np.linalg.norm(a2-a1)+np.linalg.norm(b2-b1) return a2,b2 def gamma_star(mu,nu): a,b = SinkHorn(mu,nu,arret) Gamma = (((GammaB*a).T)*b).T return Gamma #définition de mu mu = np.ones(N) print("Quelque valeurs de mu : ") T = [mu[i] for i in range(10)] print(T) #définition de nu nu = np.exp(-np.arange(N)/100) print("Quelque valeurs de nu : ") T = [round(nu[i],3) for i in range(10)] print(T) #Calcul de Gamma* Gamma = gamma_star(mu,nu) print("Quelque valeur de gamma* : ") T = [Gamma[i][j] for i in range(3) for j in range(3)] print(T)
Voici le résultat
Résultat a écrit:Quelque valeurs de mu :
[1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]
Quelque valeurs de nu :
[1.0, 0.99, 0.98, 0.97, 0.961, 0.951, 0.942, 0.932, 0.923, 0.914]
Quelque valeur de gamma* :
[nan, nan, nan, nan, nan, nan, nan, nan, nan]
Je pense que vous avez compris le problème. Je divise par $0$ et ça me complique un peu la vie. Si vous avez une idée pour éviter ça, c'est avec plaisir !
Réponses
-
J'ai modifié le calcul de gamma * c'était trop petit mais ça ne résout pas encore le problème.
Le problème est que ma suite a^{n} converge vers + \infty.#Calcul de Gamma_Barre X,Y = np.meshgrid(T,S) C = (X-Y)**2 #Matrice contenant les c[i,j]=(xi-yj)² for i in range(N): for j in range(N): temp = (T[ i]-S[j])**2 if temp > 10*epsilon : C[ i][j] = 10*epsilon else : C[ i][j] = temp GammaB = np.exp(-C/epsilon) #Matrice contenant les GammaB[ i,j] = Gamma_Barrei,j
[Mettre une ' ' entre [ et i sinon, l'afficheur du forum le prend pour une bannière BBcode de mise en italique. AD] -
Je me trompe ou:
- T et S sont des vecteurs
- donc X et Y le sont aussi pour construire le maillage
- C est donc un vecteur et non une matrice non ?
Pourquoi il n'y a aucun indice à T dans les boucles, car je doute que ça soit un scalaire ? -
j'avais faux dans mon précédent message, $C$ est bien une matrice et du coup je ne comprends pas les indices dans les boucles.
si l'idée est de rechercher toutes la valeurs supérieures à $10\epsilon$ il est possible de faire avec np.where:C = (X-Y)**2 temp = (T-S)**2 indices = np.where(temp > 10*epsilon) temp[indices] = 10.*epsilon
Connectez-vous ou Inscrivez-vous pour répondre.
Bonjour!
Catégories
- 163.1K Toutes les catégories
- 8 Collège/Lycée
- 21.9K Algèbre
- 37.1K Analyse
- 6.2K Arithmétique
- 53 Catégories et structures
- 1K Combinatoire et Graphes
- 11 Sciences des données
- 5K Concours et Examens
- 11 CultureMath
- 47 Enseignement à distance
- 2.9K Fondements et Logique
- 10.3K Géométrie
- 62 Géométrie différentielle
- 1.1K Histoire des Mathématiques
- 68 Informatique théorique
- 3.8K LaTeX
- 39K Les-mathématiques
- 3.5K Livres, articles, revues, (...)
- 2.7K Logiciels pour les mathématiques
- 24 Mathématiques et finance
- 312 Mathématiques et Physique
- 4.9K Mathématiques et Société
- 3.3K Pédagogie, enseignement, orientation
- 10K Probabilités, théorie de la mesure
- 772 Shtam
- 4.2K Statistiques
- 3.7K Topologie
- 1.4K Vie du Forum et de ses membres