2017-07-20 4 views
1

I ont cette équation différentielle écrit en sympySymPy: Comment évaluer une expression avec des constantes?

diffeq = Eq(f(x).diff(x, x) - 2*f(x).diff(x) + f(x), sin(x)) 

où f (x) est un symbole de fonction de symbole et x est un symbole variable.

Quand je résous avec ceci:

expr = dsolve(diffeq, f(x)) 

Je reçois

f(x)=(C_1+C_2x)ex+12cos(x) 

Quelle est la bonne solution à cette équation. Mais maintenant je voudrais évaluer cette fonction en plusieurs points. Je sais que je peux remplacer le x par la fonction subs, mais existe-t-il un moyen de substituer les valeurs constantes C_1 et C_2 pour que je puisse évaluer la fonction?

Répondre

1

Il y a un PR ouvert pour ceci sur GitHub, cela ajouterait un drapeau ics à dsolve.

Pour l'instant, vous pouvez remplacer les valeurs manuellement à l'aide subs, utilisez solve pour résoudre pour C1 et C2, et utiliser subs pour remplacer les valeurs de retour dans la solution.

Par exemple, si f(0) = 1 et f'(0) = 0, vous utiliseriez quelque chose comme

>>> p1 = expr.subs([(x, 0), (f(0), 1)]) 
>>> dexpr = Eq(expr.lhs.diff(x), expr.rhs.diff(x)) 
>>> p2 = dexpr.subs([(x, 0), (f(x).diff(x).subs(x, 0), 0)]) 
>>> p1 
Eq(1, C1 + 1/2) 
>>> p2 
Eq(0, C1 + C2) 
>>> C1, C2 = symbols('C1 C2') 
>>> sol = solve([p1, p2], [C1, C2]) 
>>> sol 
{C1: 1/2, C2: -1/2} 
>>> expr.subs(sol) 
Eq(f(x), (-x/2 + 1/2)*exp(x) + cos(x)/2) 
0

Vous pouvez obtenir vos constantes à partir de votre expression. Il est un peu en désordre, mais il fonctionne:

v1 = expr.args[1].args[1].args[0].args[0] 
v2 = expr.args[1].args[1].args[0].args[1].args[0] 
expr.subs(v1,1).subs(v2,2) 

Explication: Jetez un oeil à expr.args. C'est un tuple à gauche et à droite de l'équation. Ici, nous voulons la deuxième entrée du tuple, donc l'index 1. Nous obtenons alors quelques sympy.core.add.Add. Nous pouvons à nouveau nous décomposer en utilisant args et continuer jusqu'à ce que nous atteignions nos constantes.