Ableiten von Exponentialfunktionen

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
rob_bes
User
Beiträge: 8
Registriert: Sonntag 23. Januar 2022, 19:31

Servus zusammen,

ich würde gerne eine Exponentialfunktion ableiten und als abgeleitete Funktion ausgeben.

Das Problem: Die Exponentialfunktion aus Numpy hätte ich mit der diff(func) aus Sympy abgeleitet, wie die normalen Funktionen auch - das funktioniert jedoch nicht.

Könnte mir jemand helfen, wie ich Exponentialfunktionen in Python ableite?

Besten Dank vorab!
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn Du mit Sympy arbeiten möchtest, mußt Du auch alle Funktionen aus sympy verwenden. Erst wenn Du mit allen Symbolischen Operationen fertig bist, kannst Du das Ergebnis per lambdify so umwandeln, dass Du es mit numpy-Arrays verwenden kannst.
rob_bes
User
Beiträge: 8
Registriert: Sonntag 23. Januar 2022, 19:31

Sirius3 hat geschrieben: Montag 24. Januar 2022, 07:37 Wenn Du mit Sympy arbeiten möchtest, mußt Du auch alle Funktionen aus sympy verwenden. Erst wenn Du mit allen Symbolischen Operationen fertig bist, kannst Du das Ergebnis per lambdify so umwandeln, dass Du es mit numpy-Arrays verwenden kannst.
Servus, danke schonmal für deine Antwort. Bin ein ziemlicher Anfänger in Python, weshalb ich eventuell etwas mehr Hilfe benötige ...

Ich habe die Newton-Methode versucht zu programmieren und wollte es so einrichten, dass die Ableitung nicht von mir gemacht werden muss, sondern direkt im Programm berechnet wird. Bei mir wird aber kein Ergebnis ausgegeben ... irgendwas stimmt nicht

import math as m
from sympy import *
import numpy as np
import sympy as sy
x = sy.symbols('x')

def newton(func, ableitung, x, n):


func = input("Funktion: ")
ableitung = str(sy.diff(func))

def f(x):
f = eval(func)
return f

def df(x):
df = eval(ableitung)
return df

for itercept in range(1, n):
i = x - (f(x)/df(x))
x = i
print(f"Die Nullstelle wurde bei {x} nach {n} Iterationen gefunden")


newton("func", "ableitung" ,-1000,1000)
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Man benutzt keine *-Importe und kürzt auch keine Module ab, wenn es nicht einen weitverbreiteten Namen dafür gibt, wie bei `numpy`. `math` wird importiert, aber gar nicht benutzt.

Die Funktion `newton` benutzt die Argumente func und ableitung gar nicht, können also weg.
Eine Funktion sollte nicht auf Nutzereingaben warten (wenn sie nicht ausdrücklich dafür geschrieben worden ist). Das `input` gehört ins Hauptprogramm.
Man benutzt arbeitet nicht mit der Stringrepräsentation von Formeln und `eval` (ganz böse), sondern benutzt lambdify, wie ich ja schon im ersten Post geschrieben hatte.

`i` wird gar nicht gebraucht, weil das eh gleich wieder in `x` umbenannt wird. Du hast nur n-1 Iterationen.

Code: Alles auswählen

import sympy

def newton(func, x, n):
    func = sympy.sympify(func)
    ableitung = sympy.diff(func)
    
    f = sympy.lambdify('x', func)
    df = sympy.lambdify('x', ableitung)
    
    for _ in range(n):
        x = x - f(x) / df(x)
    return x, n

def main():    
    func = input("Funktion: ")
    x, n = newton(func, -1000, 1000)
    print(f"Die Nullstelle wurde bei {x} nach {n} Iterationen gefunden")
    
if __name__ == "__main__":
    main()
rob_bes
User
Beiträge: 8
Registriert: Sonntag 23. Januar 2022, 19:31

Sirius3 hat geschrieben: Montag 24. Januar 2022, 14:06 Man benutzt keine *-Importe und kürzt auch keine Module ab, wenn es nicht einen weitverbreiteten Namen dafür gibt, wie bei `numpy`. `math` wird importiert, aber gar nicht benutzt.

Die Funktion `newton` benutzt die Argumente func und ableitung gar nicht, können also weg.
Eine Funktion sollte nicht auf Nutzereingaben warten (wenn sie nicht ausdrücklich dafür geschrieben worden ist). Das `input` gehört ins Hauptprogramm.
Man benutzt arbeitet nicht mit der Stringrepräsentation von Formeln und `eval` (ganz böse), sondern benutzt lambdify, wie ich ja schon im ersten Post geschrieben hatte.

`i` wird gar nicht gebraucht, weil das eh gleich wieder in `x` umbenannt wird. Du hast nur n-1 Iterationen.

Code: Alles auswählen

import sympy

def newton(func, x, n):
    func = sympy.sympify(func)
    ableitung = sympy.diff(func)
    
    f = sympy.lambdify('x', func)
    df = sympy.lambdify('x', ableitung)
    
    for _ in range(n):
        x = x - f(x) / df(x)
    return x, n

def main():    
    func = input("Funktion: ")
    x, n = newton(func, -1000, 1000)
    print(f"Die Nullstelle wurde bei {x} nach {n} Iterationen gefunden")
    
if __name__ == "__main__":
    main()
Klasse, vielen vielen Dank!
Bin immer dankbar über solche Tipps und Hinweise :) bin wie gesagt neu!
Eine Frage, welchen Zweck hat die letzte Zeile? Das Programm auszuführen?
Antworten