2017-08-11 2 views
0

J'ai ce code dans sympy:autant de paramètres que possible (sympy)

from sympy import * 
par_amplitude, par_const_force = symbols('Delta_U f') 
equation = par_amplitude * par_const_force 
print(equation.evalf(subs={'f':3, 'Delta_U':2})) 

La sortie est évidemment 6.

Mon problème se produit lorsque j'ai accès à un seul paramètre, comme ceci:

print(equation.evalf(subs={'Delta_U':2})) 

Au lieu d'attendre 2 * f je reçois Delta_U * f.

Qu'est-ce que je fais mal? Existe-t-il un moyen d'évaluer une expression, où tous les paramètres ne sont pas disponibles?

EDIT:

Oui, je suis après une sortie mixte numérique/symbolique. Imaginez une situation où il y a beaucoup de paramètres (générés automatiquement, donc vous n'êtes même pas sûr du nombre), et il y a une fonction fournissant toutes les valeurs subs. Si vous ne manquez qu'une seule valeur de substitution, vous n'avez pratiquement rien sur evalf.

Répondre

0

Vous pouvez remplacer dans votre expression symbolique avant d'évaluer numériquement:

print(equa.subs({'Delta_U':2})) 
print(equa.subs({'Delta_U':2}).evalf()) 

Remplacement donne également 6 même sans évaluation numérique:

print(equa.subs({'Delta_U':2, 'f':3})) 

EDIT: J'ai une idée pourquoi evalf(...) ne sera pas return 2*f. Je suppose que evalf essaye de retourner seulement le résultat complètement numérique, mais 2*f est clairement quelque chose mélangé. Un 2 numérique et un symbolique f.

0

Ceci est un problème connu et il y a une discussion à ce sujet here.

+0

Je dirais que le cas décrit dans votre lien diffère de celui ici. Dans le lien, le problème est des cas comme l'évaluation numérique de «1/0», alors que de tels problèmes numériques ne se posent pas ici. Je suppose que le problème est que l'OP veut 'evalf' pour retourner quelque chose mélangé avec' 2' numérique et symbolique 'f'. – Hannebambel

+1

référencé sur la page I site est une liste de questions connexes, par ex. https://github.com/sympy/sympy/issues/6974 est similaire au cas donné ici. – smichr