Seite 1 von 2

Funktion Ableilten/ Integrieren

Verfasst: Montag 30. November 2009, 17:39
von LP640
hallo
ich möchte versuchen, eine funktion abzuleiten beziehungsweise zu integrieren (aufleiten), jedoch habe ich keine ahnung wie das mit python funktionieren soll.

hier zum Beispiel die Funktion:

Code: Alles auswählen

funktion="x**2+4"
und dann soll folgendes bei raus kommen:

Code: Alles auswählen

ableitung="2*x"
aufleitung="(2/3)*x**3+4*x"
kann mir da jemand weiterhelfen???

mfg
LP640

Re: Funktion Ableilten/ Integrieren

Verfasst: Montag 30. November 2009, 18:06
von ms4py
LP640 hat geschrieben:kann mir da jemand weiterhelfen
Aber sicher:
http://code.google.com/p/sympy/

Code: Alles auswählen

In [11]: from sympy import Symbol, diff

In [12]: x = Symbol('x')

In [13]: func = 2*x**3 + 5*x**2 + x + 4

In [14]: diff(func, x)
Out[14]: 1 + 10*x + 6*x**2
Edit: Kleiner Fehler korrigiert

Verfasst: Montag 30. November 2009, 18:33
von numerix
Falls du aus irgendwelchen Gründen kein CAS verwenden willst und es sich wie in deinem Beispiel nur um Polynome handelt, dann ist es auch nicht so schwierig die Ableitungsfunktion bzw. Stammfunktion selbst zu entwickeln (zumindest so lange man sich darauf verlässt, dass eine gültige Darstellung eines Polynoms angegeben wurde).

Verfasst: Montag 30. November 2009, 18:46
von ms4py
numerix hat geschrieben:Falls du aus irgendwelchen Gründen kein CAS verwenden willst und es sich wie in deinem Beispiel nur um Polynome handelt, dann ist es auch nicht so schwierig die Ableitungsfunktion bzw. Stammfunktion selbst zu entwickeln (zumindest so lange man sich darauf verlässt, dass eine gültige Darstellung eines Polynoms angegeben wurde).
Das ist natürlich auch richtig. Eine übliche Darstellung eines Polynoms wäre eine Liste von Floats.
Z.B.

Code: Alles auswählen

poly = [3.5, 5, 4]
Das steht dann für

Code: Alles auswählen

3.5x^2 + 5x + 4
Das differnziert ergibt dann

Code: Alles auswählen

[7, 5]
Ein nicht vorhandene Potenz muss natürlich explizit mit 0 angeben werden, also wird damit zu

Code: Alles auswählen

[3, 0, 0]
Hinweis: ``numpy`` kann natürlich auch mit Polynomen rechnen (und ableiten/integrieren): http://docs.scipy.org/doc/numpy/referen ... .poly.html

Verfasst: Montag 30. November 2009, 18:57
von LP640
wow danke ice2k3 deine erste lösung klappt echt super aber ich hab auf der seite nichts zum hochleiten gefunden.
ich gehe mal davon aus, dass das "diff" durch einen anderen befehl ersetzt werden muss oder???

mfg
LP640

Verfasst: Montag 30. November 2009, 19:21
von ms4py
LP640 hat geschrieben:wow danke ice2k3 deine erste lösung klappt echt super aber ich hab auf der seite nichts zum hochleiten gefunden.
ich gehe mal davon aus, dass das "diff" durch einen anderen befehl ersetzt werden muss oder???

mfg
LP640
Versuchs mal mit ``integrate`` ;)
http://docs.sympy.org/tutorial.html#integration

Verfasst: Montag 30. November 2009, 19:31
von LP640
danke es funktioniert, aber folgendes funktioniert nicht:

Code: Alles auswählen

from sympy import*
x=Symbol('x') 
func=raw_input("f(x)=")
abl=integrate(func,x) 
print abl
x=2
print eval(abl)
ich glaube, ich muss abl in einen string umformen oder so
ich schau mal ob ich das hinbekomme, würde mich aber über antworten trotzdem freuen.
:wink:
mfg
LP640

Verfasst: Montag 30. November 2009, 19:36
von Dav1d
LP640 hat geschrieben:ich glaube, ich muss abl in einen string umformen oder so
ich schau mal ob ich das hinbekomme, würde mich aber über antworten trotzdem freuen.
:wink:
mfg
LP640
Versuchs doch mit dem "in einen String umformen"
auserdem wär immer noch gut, wieso funktionierts nicht, also Traceback

Verfasst: Montag 30. November 2009, 19:38
von ms4py
Schau dir doch einfach mal das sympy Tutorial genauer an (Abschnitt "Symbols")
http://docs.sympy.org/tutorial.html

Hinweise:
- *-Importe sollte man generell vermeiden
- ``eval`` sollte man auch grundsätzlich vermeiden, gibt normalerweise immer eine sicherere und komfortablere Methode
- PEP8 sagt, dass bei einer Zuweisung wie "a = 5" immer Leerzeichen zwischen dem = sein sollen.

Verfasst: Montag 30. November 2009, 19:43
von Darii
LP640 hat geschrieben:danke es funktioniert, aber folgendes funktioniert nicht:

Code: Alles auswählen

from sympy import*
x=Symbol('x') 
func=raw_input("f(x)=")
abl=integrate(func,x) 
print abl
x=2
print eval(abl)
Versuchs mal mit

Code: Alles auswählen

print abl.evalf(subs={x:2})
anstelle deiner letzten beiden Zeilen.

@ice2k3: *-Importe grundsätzlich zu verdammen ist wenig zielführend. Gerade Bibliotheken wie sympy sind prädestiniert dafür, sie zu verwenden. Man muss halt nur wissen, dass man sich damit potentiell unbewusst Namen überschreibt.

Verfasst: Montag 30. November 2009, 19:58
von ms4py
Darii hat geschrieben:@ice2k3: *-Importe grundsätzlich zu verdammen ist wenig zielführend. Gerade Bibliotheken wie sympy sind prädestiniert dafür, sie zu verwenden. Man muss halt nur wissen, dass man sich damit potentiell unbewusst Namen überschreibt.
Ja, zur Verwendung in der Kommandozeile. In einem Skript gibt es IMHO keinen Grund, die *-Importe zu verwenden. Aber das ist natürlich auch persönlicher Stil und darüber kann man sich streiten ;)

Das "evalf" funktioniert außerdem nicht so, wie du dir das vorstellst.

Code: Alles auswählen

>>> x = Symbol('x')
>>> func = x**2
>>> func.evalf(2)
x**2
``subs`` ist das Schlüsselwort:

Code: Alles auswählen

>>> func.subs(x, 2)
4
Noch ein Hinweis: Mischen von deutschen und englischen Variablennamen (abl, func) ist auch ein schlechter Code-Stil. (Ableitung heißt `derivate`;) )

Verfasst: Montag 30. November 2009, 20:08
von gkuhl
ice2k3 hat geschrieben:Hinweise:
- *-Importe sollte man generell vermeiden
- ``eval`` sollte man auch grundsätzlich vermeiden, gibt normalerweise immer eine sicherere und komfortablere Methode
- PEP8 sagt, dass bei einer Zuweisung wie "a = 5" immer Leerzeichen zwischen dem = sein sollen.
Darauf wurde LP640 schon mehrmals hingewiesen, aber wer weiß: "Steter Tropfen höhlt den Stein".

Verfasst: Montag 30. November 2009, 21:25
von Darii
ice2k3 hat geschrieben:Ja, zur Verwendung in der Kommandozeile. In einem Skript gibt es IMHO keinen Grund, die *-Importe zu verwenden. Aber das ist natürlich auch persönlicher Stil und darüber kann man sich streiten ;)
Nein, es gibt einfach keinen Grund für ein kurzes 10-zeiliges Script in dem man etwas ausrechnet, erstmal zwei Zeilen lang alle möglichen Namen einzeln zu importieren. Für genau solche Anwendungszwecke gibt es die *-Imports schließlich. ``import this`` gegen *-Imports spricht nur die 2. Regel – dafür spricht der Rest. Wie gesagt, man muss wissen was man macht, Pauschalisierungen helfen niemandem.
Das "evalf" funktioniert außerdem nicht so, wie du dir das vorstellst.
Ja, du hast recht, irgendwie war ich durcheinandergekommen und hatte mich von der Doku zu evalf verwirren lassen und ich könnte schwören es hätte vorhin bei mir funktioniert. Aber subs funktioniert auch nicht so wie du denkst. Subs führt verlustbehaftete Rechenoperationen nämlich nicht automatisch aus. Die Lösung ist ``abl.evalf(subs={x:2})`` ich habs in meinem Post schon angepasst.

Verfasst: Montag 30. November 2009, 21:26
von LP640
ich habs geschafft allerdings hab ich hier noch ein problem:

Code: Alles auswählen

from sympy import*
from math import*
x=Symbol('x') 
func="sqrt(x)"
abl=integrate(func,x) 
abl="%s"%abl
x=0
a=eval(abl)
x=6
b=eval(abl)
print abl
print b-a
der zeigt dann bei "print b-a" 4 an obwohl eigentlich 9.797958917... rauskommen müsste.
wie kann man den fehler beheben???
ich werde an meinem programmierstil arbeiten! :wink: :D

mfg
LP640

Verfasst: Montag 30. November 2009, 21:29
von Darii
LP640 hat geschrieben:der zeigt dann bei "print b-a" 4 an obwohl eigentlich 9.797958917... rauskommen müsste.
wie kann man den fehler beheben???
Les meinen verdammten Post.

Edit: Und du hast übrigens leider gerade ice2k3 in seinem Argument bestätigt. Dreimal darfst du raten welche Funktion aus sympy du mit deinem "from math import *" überschrieben hast? Richtig: sqrt. Ist in deinem Fall nicht schlimm, da du sie nicht direkt verwendest sondern nur einen String auswertest, könnte aber ins Auge gehen.
Edit2: Hmm du verwendest sie sogar. Wie ulkig. :)

Verfasst: Montag 30. November 2009, 21:31
von ms4py
Und beachte meine Hinweise :!: :evil:

Verfasst: Montag 30. November 2009, 21:54
von LP640
merci beaucoup
hiemit : abl.evalf(subs={x:2}) klappt es
danke an alle

mfg
LP640

(ich schätze mal meine nächste frage kommt so in 30 minuten :wink: )

Verfasst: Montag 30. November 2009, 22:53
von LP640
hallo
wieso klappt das jetzt wieder nicht???:

Code: Alles auswählen

from sympy import integrate, Symbol
x = Symbol('x') 
func = "sqrt(x)*cos(x)-4"
der = integrate(func,x) 
print der
a = der.evalf(subs={x:0})
b = der.evalf(subs={x:2})

print b-a
hääääääääää??? :shock:

mfg
LP640

Verfasst: Montag 30. November 2009, 22:56
von jbs
ich glaube du hast etwas falsch gemacht

Verfasst: Montag 30. November 2009, 23:07
von gkuhl
jbs hat geschrieben:ich glaube du hast etwas falsch gemacht
Das halte ich auch für sehr wahrscheinlich.