Partage
  • Partager sur Facebook
  • Partager sur Twitter

probleme algorithme d'euler

calcul diff

23 février 2016 à 21:41:54

Je dois réaliser un programme qui permet de calculer le résultat numérique d'un systeme différentiel mais je récolte "ValueError: setting an array element with a sequence" malgrès tout mes efforts , quelqu'un aurait il une odée ? merci d'avance
  • Partager sur Facebook
  • Partager sur Twitter
24 février 2016 à 0:15:02

Salut,

Utilise les balises codes du forum pour présenter ton code s'il te plaît. De plus, à quelle ligne t'indique-t-il l'erreur ?

  • Partager sur Facebook
  • Partager sur Twitter
24 février 2016 à 5:42:46

import numpy as np

def euler (t0,tf,fun,x0,N,n):
    T = np.linspace(t0,tf,n+1)
    X = np.empty([N+1,n],dtype='f')
    X[0,:] = x0
    Pas = (tf-t0)/N
    for i in range (1,N+1):
        X[i] = X[i-1] + np.dot(fun(T[i-1],X[i-1]),Pas)
    return(T,X)
def fun(x,y):
    return(np.array([x,(1-x**2)*y - x]))
t0 = 0
tf = 6.6632868593231301896996820305
N = 10
n = 2
x0 = np.array([2.00861986087484313650940188,0])
print(euler(t0,tf,fun,x0,N,n))
mon erreur est localisé ligne 15 ou ligne 18, merci d'avance :)
  • Partager sur Facebook
  • Partager sur Twitter
24 février 2016 à 7:15:23

Comment ça ligne 15 ou 18 x)
Que t'indique précisément l'erreur ? Il est censé te mettre la ligne où il la rencontre au moment de l’exécution :)
  • Partager sur Facebook
  • Partager sur Twitter
24 février 2016 à 11:01:57

line 9, in euler
    X[i] = X[i-1] + np.dot(fun(T[i-1],X[i-1]),Pas)
line 12, in fun
    return np.array([x,(1-x**2)*y - x])
ValueError: setting an array element with a sequence.

le probleme vient de la ligne 12

-
Edité par lewisbm 24 février 2016 à 11:02:29

  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
24 février 2016 à 12:36:40

Coucou! Plusieurs remarques sur ton script:

  • Dans ta fonction euler, \(t_0\), \(t_f\) et \(N\) sont des entiers ou des flottants, donc ta variable Pas est un entier ou un flottant, donc tu n'as pas besoin d'utiliser la fonction dot de Numpy. La fonction dot de Numpy n'est là que pour réaliser des produits matriciels (matrice-matrice, vecteur-matrice). La multiplication élément-par-élément (de Kronecher il me semble) est effectuée par défaut avec l'opérateur "*" de Python. Un exemple pour que tu te rende compte comment ça marche:
    In [1]: import numpy as np
    
    In [2]: A = np.linspace(0, 1, 10)
    
    In [3]: A
    Out[3]: 
    array([ 0.        ,  0.11111111,  0.22222222,  0.33333333,  0.44444444,
            0.55555556,  0.66666667,  0.77777778,  0.88888889,  1.        ])
    
    In [4]: b = np.pi
    
    In [5]: b * A
    Out[5]: 
    array([ 0.        ,  0.34906585,  0.6981317 ,  1.04719755,  1.3962634 ,
            1.74532925,  2.0943951 ,  2.44346095,  2.7925268 ,  3.14159265])
    
  • Ton fonction fun est assez mal nommée. Son nom ne suffit pas à comprendre à quoi elle sert.
  • On a l'habitude de donner les tailles avec des tuples, et pas spécialement avec des listes. C'est vraiment anecdotique, mais d'habitude ça se fait comme ça ;) Du coup ta ligne
    X = np.empty([N+1,n],dtype='f')
    deviendrai
    X = np.empty((N+1,n),dtype='f')

Ensuite ton problème... Une recherche rapide sur un moteur de recherche et j'ai trouvé ça. Ca a l'air de venir du fait que dans ton expression

np.array([x,(1-x**2)*y - x])

x est un flottant et (1-x**2)*y-x est un tableau de flottants. Regarde peut-être au niveau des procédures de concaténation offertes par Numpy :)

  • Partager sur Facebook
  • Partager sur Twitter
24 février 2016 à 15:46:36

merci a tous pour votre aide ;) je regarde ça au plus vite 

  • Partager sur Facebook
  • Partager sur Twitter