Comment programmer cette équation?

Fermé
Ahamat - Modifié le 14 févr. 2023 à 09:53
mamiemando Messages postés 33407 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 29 novembre 2024 - 16 févr. 2023 à 12:30

Bonjour, Je cherche à programmer une équation mais je ne parviens pas. ça donne toujours des erreurs quand je compile le programme. voici l'équation à programmer:

Le programme en python:

sigmam= 0.43
a= 3.8
tmax= 100
N=150
r= 0,5
P= 75

zi1 = np.zeros(N+2)
zi1[0] = 0.25

for t in range (tmax):
    for i in range(1,N) :   
            S11= []        
            for j in range ((i-P), (i+P)):      
                if j<0:            
                    j=j+N
                if j>=0:                
                    j=j-N    
                S11=S11+((a*zi1[j]*(1-zi1[j]))-(a*zi1[i]*(1-zi1[i])))
            S11=(sigmam/(2*P))*S11
           
x = []
y1= []
for t in range (tmax):
            zi1[t+1]= a*zi1[i]*(1-zi1[i])+S11
            x.append(float(t))
            y1.append(float(zi1[t+1]))
pl.plot(x,y1)

L'erreur affichée

File "/Users/Ahamat/Desktop/untitled5.py", line 49, in <module>
    zi1[t+1]= a*zi1[i]*(1-zi1[i])+S11

ValueError: setting an array element with a sequence.

Le resultat attendu de cette équation

4 réponses

jordane45 Messages postés 38316 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 29 novembre 2024 4 705
14 févr. 2023 à 09:44

Bonjour

Je n'ai pas regardé en détails.. mais il ne faudrait pas mettre des "t" à la place des "i" ?


0
Ahamat004 Messages postés 1 Date d'inscription mardi 14 février 2023 Statut Membre Dernière intervention 15 février 2023
15 févr. 2023 à 07:41

@jordane45 StatutModérateur bonjour. Même en remplaçant i à la place ça donne toujours des erreurs.

0
mamiemando Messages postés 33407 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 29 novembre 2024 7 806
15 févr. 2023 à 15:50

Bonjour,

Ta fonction est définie de manière récursive mais ni f ni z0 ni sigma ni P ne sont définis dans leur formulation mathématique. Ensuite, ta somme dépend des zjt et des zit et ce serait une bonne idée de mémoriser les termes intermédiaires (voir programmation dynamique) car écrire la fonction récursive telle quelle sera beaucoup plus coûteux.

Vu que t est un paramètre muet, je suppose qu'on peut ignorer t, et voir (z_it) comme une suite (u_i). Est-ce le cas ?

Bonne chance

0

Merci beaucoup. ici f(z)= az(1-z), c'est ainsi que j'ai remplacé f(z[i][t)] par sa valeur qui est az[i][t](1-z[i][t]) tout en sachant que la fonction est comme un tableau a deux dimensions. le premier est le nombre des éléments (i= 1 à N avec ) et le second, le nombre d'itération (t). si possible veuillez me proposer une autre méthode pour programmer cette équation. Merci beaucoup

0
mamiemando Messages postés 33407 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 29 novembre 2024 7 806
16 févr. 2023 à 12:30

Bonjour,

Vu que je ne comprends pas ce que sont a et t dans ce que tu expliques, je vais te montrer comment tu peux faire sur un exemple classique, une suite de Fibonnacci et te laisse l'adapter. C'est quasiment le même sujet que toi puisqu'un le terme à l'index i dépend des termes précédents.

Voici la version récursive :

def fibonacci_rec(i: int, f0: int = 0, f1: int = 1) -> int:
    if i == 0:
        # F_0 = 0
        ret = f0
    elif i == 1:
        # F_1 = 1
        ret = f1
    else:
        # F_n = F_{n-1} + F_{n-2}
        ret = fibonacci_rec(i - 1) + fibonacci_rec(i - 2)
    return ret

def fibonacci(i: int, f0: int = 0, f1: int = 1) -> int:
    return fibonacci_rec(i, f0, f1)

for i in range(0, 16):
    print(f"F_{i} = {fibonacci(i)}")

Voici la version en programmation dynamique : l'idée est d'accumuler les résultats précédents dans un dictionnaire d.

def fibonacci_dp(i: int, d: dict, f0: int = 0, f1: int = 1) -> int:
    ret = d.get(i)
    if ret is None:
        if i == 0:
            # F_0 = 0
            ret = f0
        elif i == 1:
            # F_1 = 1
            ret = f1
        else:
            # F_n = F_{n-1} + F_{n-2}
            ret = fibonacci_dp(i - 1, d) + fibonacci_dp(i - 2, d)
    d[i] = ret
    return ret

def fibonacci(i: int, f0: int = 0, f1: int = 1) -> int:
    d = dict()
    return fibonacci_dp(i, d, f0, f1)

for i in range(0, 16):
    print(f"F_{i} = {fibonacci(i)}")

Comme tu peux le voir le code est extrêmement proche de la version récursive.

Note : pour plus de performances on peut même remplacer les dernières lignes par :

d = dict()
for i in range(0, 16):
    print(f"F_{i} = {fibonacci_dp(i, d)}")

... car comme ça au cours de la boucle for, les calculs intermédiaires sont partagés.

Bonne chance

0