Differenzieren in Python

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.
Antworten
Dispatcher
User
Beiträge: 4
Registriert: Montag 25. November 2019, 10:29

Hallo leute,

zur Zeit arbeite ich an einem Projekt indem ich Aufnahmen als Punkte in einem Koordinatensystem darstelle.
Äquivalent dazu gibt es eine Funktionskurve.
Die Punkte sollen also in ihrer Gesamtheit die Kurve best möglichst nachbilden.
Für meine Fehlerbestimmung will ich als nächstes den Abstand von einem Punkt zu dieser Funktionskurve berechnen.
Der Abstand lässt sich aus dem Minimum der Abstandsformel von Punkt und Funktion berechnen.
Mein Problem ist jetzt aber, dass das Differenzieren der Abstandsformel relativ kompliziert ist und da wollte ich fragen ob jemand weiß wie das in Python möglich ist?
Oder hat jemand vielleicht einen anderen Ansatz wie man vorgehen kann?

Vielen Dank schonmal für Antworten.
__deets__
User
Beiträge: 14544
Registriert: Mittwoch 14. Oktober 2015, 14:29

Hast du sowas ausprobiert? https://docs.scipy.org/doc/scipy/refere ... e_fit.html - das macht das AFAIK numerisch. Ansonsten gibt es natuerlich noch sympy zum symbolischen manipulieren von Funktionen, ggf. kannst du damit einfach die Ableitung bilden.
Dispatcher
User
Beiträge: 4
Registriert: Montag 25. November 2019, 10:29

Ich hab mich jetzt mit Sympy auseinander gesetzt und bin auf diese Funktion gestoßen:
https://docs.scipy.org/doc/scipy/refere ... in.htmlrob

damit lässt sich doch jetzt einfach das minimum einer Funktion bestimmen oder liege ich da falsch?

Problem ist, dass ich beim benutzen komische Werte für das Minimum rauskriege.
Bsp:
Ich habe den Punkt(1.114/3.174) und die Funktion -(x-5)**2+6

Die Abstandsformel ist also: sqrt((3.174-(-(x-5)**2+6))**2+(1.114-x)**2)
Berechnung des Minimums:

Code: Alles auswählen

import numpy as np
from scipy.optimize import fmin
import math
def f(x):
    return math.sqrt((3.174-(-(x[0]-5)**2+6))**2+(1.114-x[0])**2)

print(fmin(f,np.array([0,0])))
Ouput:
Optimization terminated successfully.
Current function value: 2.121145
Iterations: 47
Function evaluations: 80
[ 3.16082124 -1.58211183]

Ich verstehe nicht in wie weit die beiden berechneten Zahlen dem Minimum entsprechen sollen.
Kann mir da wer helfen?
__deets__
User
Beiträge: 14544
Registriert: Mittwoch 14. Oktober 2015, 14:29

Statt sympy hast du dir ja scipy angeschaut. Das ist ein Unterschied.

Und was ich nicht verstehe ist, warum du als initial guess ein Array eingibst, wenn die Funktion offensichtlich nur von einem x abhaengt. Wenn ich das wie unten gezeigt korrigiere, dann kommt auch das eine Minimum ~3.16 raus.

Und was ein Punkt(a/b) sein soll ist mir auch nicht klar. Ist das ein Punkt an Position (a, b)? Oder ein Punkt bei dem Ergebnis aus a/b?

Code: Alles auswählen

import numpy as np
from scipy.optimize import fmin
import math
import matplotlib.pyplot as plt


def f(x):
    return math.sqrt((3.174-(-(x-5)**2+6))**2+(1.114-x)**2)


print(fmin(f, 0))

x = np.linspace(-10, 10, num=1000)
y = np.vectorize(f)(x)

fig, ax = plt.subplots()
ax.plot(x, y)
plt.show()
einfachTobi
User
Beiträge: 491
Registriert: Mittwoch 13. November 2019, 08:38

Zunächst verstehe ich nicht, warum du nicht gleich optimize.curve_fit nutzt, aber das soll ja nun egal sein.
Du übergibst ein Array als Startwert. So funktioniert die fmin-Funktion nicht.
Hier mal ein richtiger Funktionsaufruf zu deiner Funktion als Beispiel. Die Funktion f(x) ist dabei deine eigentliche Funktion und f_abstand(u, p) die Abstandsfunktion.

Code: Alles auswählen

import numpy as np
import scipy.optimize as so

def f(x):
    return -(x-5)**2+6

def f_abstand(u, p):
    return np.sqrt((u-p[0])**2 + (f(u) - p[1])**2)

punkt = (1.114, 3.174)
print(so.fmin(f_abstand, args=(punkt,), x0=3))
Output:

Code: Alles auswählen

Optimization terminated successfully.
         Current function value: 2.121145
         Iterations: 12
         Function evaluations: 24
[3.16083984]
Dispatcher
User
Beiträge: 4
Registriert: Montag 25. November 2019, 10:29

Vielen Dank für eure Hilfe. Ihr habt mir echt sehr geholfen :)
Antworten