Seite 1 von 1

Differenzieren in Python

Verfasst: Montag 25. November 2019, 10:44
von Dispatcher
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.

Re: Differenzieren in Python

Verfasst: Montag 25. November 2019, 18:43
von __deets__
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.

Re: Differenzieren in Python

Verfasst: Dienstag 26. November 2019, 14:14
von Dispatcher
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?

Re: Differenzieren in Python

Verfasst: Dienstag 26. November 2019, 16:26
von __deets__
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()

Re: Differenzieren in Python

Verfasst: Dienstag 26. November 2019, 16:46
von einfachTobi
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]

Re: Differenzieren in Python

Verfasst: Mittwoch 27. November 2019, 12:51
von Dispatcher
Vielen Dank für eure Hilfe. Ihr habt mir echt sehr geholfen :)