Funktion Ableilten/ Integrieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
LP640
User
Beiträge: 142
Registriert: Dienstag 29. September 2009, 14:40

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
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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).
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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
Benutzeravatar
LP640
User
Beiträge: 142
Registriert: Dienstag 29. September 2009, 14:40

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
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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
Benutzeravatar
LP640
User
Beiträge: 142
Registriert: Dienstag 29. September 2009, 14:40

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
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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
the more they change the more they stay the same
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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.
Zuletzt geändert von Darii am Montag 30. November 2009, 21:13, insgesamt 1-mal geändert.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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`;) )
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

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".
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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.
Zuletzt geändert von Darii am Montag 30. November 2009, 21:29, insgesamt 1-mal geändert.
Benutzeravatar
LP640
User
Beiträge: 142
Registriert: Dienstag 29. September 2009, 14:40

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
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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. :)
Zuletzt geändert von Darii am Montag 30. November 2009, 21:40, insgesamt 5-mal geändert.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Und beachte meine Hinweise :!: :evil:
Benutzeravatar
LP640
User
Beiträge: 142
Registriert: Dienstag 29. September 2009, 14:40

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: )
Benutzeravatar
LP640
User
Beiträge: 142
Registriert: Dienstag 29. September 2009, 14:40

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
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

ich glaube du hast etwas falsch gemacht
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

jbs hat geschrieben:ich glaube du hast etwas falsch gemacht
Das halte ich auch für sehr wahrscheinlich.
Antworten