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:
und dann soll folgendes bei raus kommen:
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.
Das steht dann für
Das differnziert ergibt dann
Ein nicht vorhandene Potenz muss natürlich explizit mit 0 angeben werden, also
wird damit zu
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.
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.
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
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:
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!
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

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

)
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ääääääääää???
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.