La fonction Python suivante présente un défaut dans la séquence des étapes de calcul de f (x). def f (x): f = np.zeros ((3)) f [0] = x [0] f [1] = f [2] + x [1] f [2] = x [2] return f L'entrée x = [1,1, ...

0
janpeter 14 mars 2021 à 19:06

3 réponses

Meilleure réponse

En utilisant sympy, vous pouvez écrire la fonction comme suit:

import numpy as np

def f(x):
    from sympy import symbols, Eq, solve
    f = symbols('f0:3')
    sol = solve([Eq(f[0], x[0]), Eq(f[1], f[2] + x[1]), Eq(f[2], x[2])], f)
    return np.array([sol[fi].evalf() for fi in f], dtype=float)

f(np.array([1, 1, 1]))

Cela suppose que vous n'utilisez qu'un exemple simple et qu'en réalité les équations sont beaucoup plus compliquées. Notez que l'approche peut être plus impliquée si vos équations ont plus d'une solution valide.

1
JohanC 14 mars 2021 à 20:05

Vous pouvez laisser sympy calculer les formules pour f0, f1 et f2:

import sympy as sym
f0, f1, f2 = sym.symbols('f0,f1,f2')
x0, x1, x2 = sym.symbols('x0,x1,x2')

eq1 = sym.Eq(f0, x0)
eq2 = sym.Eq(f1, f2 + x1)
eq3 = sym.Eq(f2, x2)

result = sym.solve([eq1,eq2, eq3],(f0, f1, f2))
print(result)
>>> {f0: x0, f1: x1 + x2, f2: x2}
0
kabooya 14 mars 2021 à 16:15

Vous comprenez fondamentalement ce que fait = en Python. Ce n'est pas l'égalité mathématique (qui fonctionne dans les deux sens), c'est une affectation . Quand vous dites a = b vous dites "oubliez ce qu'était a, c'est b à partir de maintenant".

Donc, étape par étape, nous obtenons:

   f[0] = x[0]         # f[0] becomes x[0] = 1
   f[1] = f[2] + x[1]  # f[1] becomes f[2] + x[1] = 0 + 1 = 1
   f[2] = x[2]         # f[2] becomes x[2] = 1

Notez que je ne cherche pas du tout à résoudre le système d'équations symboliquement, mais je veux juste que l'ordre d'évaluation soit correct et éviter de travailler avec la cartographie moi-même.

Vous devrez soit résoudre les équations symboliquement vous-même, soit le faire avec un système d'algèbre informatique. Le code Python régulier est impératif et ne fait aucune de ces choses (hors de la boîte).

Voir par exemple La réponse de kabooya pour la mise en place d'un tel système d'équations à l'aide de Sympy.

0
orlp 14 mars 2021 à 16:17