Seite 1 von 1

Ableiten von Exponentialfunktionen

Verfasst: Sonntag 23. Januar 2022, 20:39
von rob_bes
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!

Re: Ableiten von Exponentialfunktionen

Verfasst: Montag 24. Januar 2022, 07:37
von Sirius3
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.

Re: Ableiten von Exponentialfunktionen

Verfasst: Montag 24. Januar 2022, 13:43
von rob_bes
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)

Re: Ableiten von Exponentialfunktionen

Verfasst: Montag 24. Januar 2022, 14:06
von Sirius3
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()

Re: Ableiten von Exponentialfunktionen

Verfasst: Montag 24. Januar 2022, 15:59
von rob_bes
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?