Ich habe eine kurze funktion geschrieben, die mir aus zwei inputs (Variable und Formel) die partielle ableitung nach der Variablen zurück geben soll:
Code: Alles auswählen
from math import log
from sympy import var, diff
def erzeuge_var(name, value):
globals()[name] = value
def part_abl(va, formel):
part_abl = []
for i in va:
erzeuge_var(i, var(i))
for i in va:
f = eval(formel)
part_abl.append(f.diff(i))
return part_abl
Code: Alles auswählen
v = ['a', 'b']
f = 'a**3+b
part_abl(v, f)
>>> [3*a**2, 1]
Code: Alles auswählen
v = ['a', 'b']
f = 'log(a)'
part_abl(v, f)
>>> Traceback (most recent call last):
File "<ipython-input-41-e5b07169c79e>", line 18, in <module>
part_abl(v, f)
File "<ipython-input-41-e5b07169c79e>", line 12, in part_abl
f = eval(formel)
File "<string>", line 1, in <module>
File "/home/leonfrcom/.local/lib/python3.6/site-packages/sympy/core/expr.py", line 256, in __float__
raise TypeError("can't convert expression to float")
TypeError: can't convert expression to float
Der Punkt ist, dass der "eval()" aufruf mit "math.log(x)" arbeiten kann, wenn man x als float oder integer definiert. Kann sympy.diff einfach kein log() ableiten?
Danke für jede Hilfe!
Und ja ich weiß, eval() wird nicht gerne gesehen... allerdings sind glaube ich 'Sicherheitslücken' in meinem kleinen mathe progrämmchen nicht so tragisch
