Ableitung mit SciPy
Verfasst: Mittwoch 19. Juli 2006, 16:21
Hat schonmal jemand mit hilfe von SciPy die ableitung einer Funktion berechnet? Ich werde nämlich aus den beispielen nicht ganz schlau, wie ich das machen muss.
Seit 2002 Diskussionen rund um die Programmiersprache Python
https://www.python-forum.de/
Code: Alles auswählen
#Ableitung berechnen:
dif = diff(y)
#zweite Ableitung berechnen:
dif2 = diff(dif)
#matplotlib installiert?
pylab.plot(x,y,'k-') #Rohdaten
pylab.plot(x,dif,'g-') #1.Ableitung
pylab.plot(x,dif2,'r-) #2.Ableitung
Wohl nicht direkt. Und ja, für analytische Lösungen sind CAS besser geeignet.darkfrog hat geschrieben:geht das überhaupt mit scipy? Oder sollte man das über ein Computer Algebra System wie Maxima machen?
Und wieso nicht? Bei einfachen Polynomen ist das kein Problem:Joghurt hat geschrieben:Wohl nicht direkt.
Code: Alles auswählen
>>> import scipy
>>> a = scipy.poly1d([2,3,4])
>>> print a
2
2 x + 3 x + 4
>>> print a*a
4 3 2
4 x + 12 x + 25 x + 24 x + 16
>>> print a.integ.__doc__
Return the mth analytical integral of this polynomial.
See the documentation for polyint.
>>> print scipy.polyint.__doc__
Return the mth analytical integral of the polynomial p.
If k is None, then zero-valued constants of integration are used.
otherwise, k should be a list of length m (or a scalar if m=1) to
represent the constants of integration to use for each integration
(starting with k[0])
>>> print a.integ(k=6)
3 2
0.6667 x + 1.5 x + 4 x + 6
>>> print a.deriv.__doc__
Return the mth derivative of this polynomial.
>>> print a.deriv()
4 x + 3
Code: Alles auswählen
from string import Template
from subprocess import Popen, PIPE, STDOUT
def diff(func, var):
def output_filter(line):
return line.startswith('(%o')
def strip_output(line):
return line.split(None, 1)[1].strip()
maxima_program = Template('$func $$'
' diff(%o1, $var)$$'
' diff(diff(%o1, $var), $var)$$'
' string(%o2);'
' string(%o3);')
maxima_pipe = Popen(('maxima',
'--batch-string',
maxima_program.substitute(locals())),
stdout=PIPE,
stderr=STDOUT)
result = filter(output_filter, maxima_pipe.stdout)
maxima_pipe.wait()
return map(strip_output, result)
print diff('1/8*x^3+3/8*x^2-9/8*x-3/8', 'x')
darkfrog hat geschrieben:- result = filter(output_filter, maxima_pipe.stdout) : Was macht die Funktion filter?
Also sie filtert alle Items heraus, die der gegebenen Bedingung nicht entsprechen. Nett für funktionale Programmierung in Python.help(filter) hat geschrieben:filter(...)
filter(function or None, sequence) -> list, tuple, or string
Return those items of sequence for which function(item) is true. If
function is None, return the items that are true. If sequence is a tuple
or string, return the same type, else return a list.
darkfrog hat geschrieben:- return map(strip_output, result) : was macht hier das map?
map ruft die als erstes Argument angegebene Funktion mit allen Items der als zweiten Argument Liste auf. Auch wieder funktionale Programmirung.help(map) hat geschrieben:map(...)
map(function, sequence[, sequence, ...]) -> list
Return a list of the results of applying the function to the items of
the argument sequence(s). If more than one sequence is given, the
function is called with an argument list consisting of the corresponding
item of each sequence, substituting None for missing values when not all
sequences have the same length. If the function is None, return a list of
the items of the sequence (or a list of tuples if more than one sequence).
Die erstellt eine Liste. Das erste Argument ist eine Funktion die auf jedes Element im zweiten Argument angewendet wird. Wenn die Funktion `True` zurückgibt, dann ist das Element in der Ergebnisliste, sonst nicht. In PHP gibt's für so etwas `array_filter()` und `remove_copy_if()` in der STL (`algorithm`) für C++.darkfrog hat geschrieben:- result = filter(output_filter, maxima_pipe.stdout) : Was macht die Funktion filter?
Das erzeugt auch wieder eine neue Liste und zwar in dem es die angegebene Funktion auf jedes Element des zweiten Arguments anwendet. Vergleichbar mit `array_map()` in PHP oder der `transform()` Funktion aus der STL (`algorithm`) bei C++.- return map(strip_output, result) : was macht hier das map?
`line` ist ja eine der gewünschten Ausgabezeilen von Maxima. Erst wird diese Zeile an "Whitespace" Zeichen maximal einmal gesplittet (split(None, 1)) und davon dann der zweite Teil genommen ([1]) und davon dann noch führende und nachfolgende "Whitespace" Zeichen entfernt. So etwas kann man im interaktiven Interpreter immer ganz gut ausprobieren:- return line.split(None, 1)[1].strip() : was machen hier die übergebenen Parameter?
Code: Alles auswählen
In [43]: line = '(%o4) 3*x^2/8+3*x/4-9/8\n'
In [44]: line.split(None, 1)
Out[44]: ['(%o4)', '3*x^2/8+3*x/4-9/8\n']
In [45]: line.split(None, 1)[1]
Out[45]: '3*x^2/8+3*x/4-9/8\n'
In [46]: line.split(None, 1)[1].strip()
Out[46]: '3*x^2/8+3*x/4-9/8'Na, Ableitung halt. Wie wäre es Du generierst einmal ein array und testest das Beispiel? Was Du erhalten wirst ist der Wert Ableitung für jedes Intervall im array. Das kann in der Numerik ganz praktisch sein. Wenn es Dir in einem konkreten Fall nicht präzise genug ist, kannst du interpolieren und danach ableiten. - Aber Vorsicht: Oft erhält man so allenfalls scheinbare zusätzliche Präzesion.darkfrog hat geschrieben:@CM
in deinem ersten Beitrag oben hast du ja ein Stück code.
Ich wollte eigentlich nur wissen, was der macht und was dabei der Bergriff Ableitung bedeutet.
Geht doch auch - alles was Du möchtest geht auch mit scipy. Jedenfalls wenn ich nicht einen wesentlichen Teil übersehen habe. Allerdings vielleicht nicht so "schön" wie mit Maxima und man soll ja die Software wählen, die eher tut, was man eigentlich möchte und wenn Du Deine Wahl schon getroffen hast, ist das ja auch gut.darkfrog hat geschrieben: Danke für die Antworten: Ich dachte zwar das ich irgendwo auf der seite von Scipy was von Funktionsabletitungen gelesen habe, vielleicht hab ich mich aber auch nur getäuscht.![]()