Discussion:
Umkehrfunktion zu einer Funktion 4. Grades
(zu alt für eine Antwort)
Michael Koch
2020-08-05 16:25:03 UTC
Permalink
Hallo,

gegeben sei die Funktion
y = a * x + b * x^2 + c * x^3 + d * x^4

gesucht ist die Umkehrfunktion x = f(y)
Es darf auch gerne eine Näherungslösung sein.

Mir ist klar dass es im allgemeinen Fall schwierig ist die Umkehrfunktion zu bestimmen. Es gibt aber noch einige zusätzliche Randbedingungen:

y(0) = 0 (das ist trivial)
y(1) = 1
Es interessiert nur das Intervall [0..1].
In diesem Intervall ist die Funktion y = f(x) monoton steigend, d.h. die Umkehrfunktion kann nicht mehrdeutig sein, es gibt zu jedem y-Wert genau einen x-Wert. Das ist durch die Wahl der Parameter a,b,c,d sichergestellt. a ist ungefähr 1, und b,c,d sind klein gegenüber a.

Meine Frage: Helfen diese zusätzlichen Bedingungen irgendwie dabei, eine Lösung zu finden? Die Anwendung betrifft die Verzeichnung von Objektiven.

Gruß
Michael
Alfred Flaßhaar
2020-08-05 16:57:24 UTC
Permalink
Post by Michael Koch
Hallo,
gegeben sei die Funktion
y = a * x + b * x^2 + c * x^3 + d * x^4
´(...)

Sind die Koeffizienten alle nichtnegativ?

Gruß, Alfredd Flaßhaar
Michael Koch
2020-08-05 17:12:18 UTC
Permalink
Post by Alfred Flaßhaar
Post by Michael Koch
Hallo,
gegeben sei die Funktion
y = a * x + b * x^2 + c * x^3 + d * x^4
´(...)
Sind die Koeffizienten alle nichtnegativ?
a ist immer positiv, b,c,d können positiv oder negativ sein, aber sie sind immer klein gegenüber a.

Gruß
Michael
Post by Alfred Flaßhaar
Gruß, Alfredd Flaßhaar
Michael Koch
2020-08-05 17:52:02 UTC
Permalink
Post by Michael Koch
Post by Alfred Flaßhaar
Post by Michael Koch
Hallo,
gegeben sei die Funktion
y = a * x + b * x^2 + c * x^3 + d * x^4
´(...)
Sind die Koeffizienten alle nichtnegativ?
a ist immer positiv, b,c,d können positiv oder negativ sein, aber sie sind immer klein gegenüber a.
Es geht um Funktionen wie man sie z.B. hier sehen kann:
http://paulbourke.net/dome/fisheyecorrect/
(da ist zwar die Bedingung f(1) = 1 nicht erfüllt, aber man kann die x-Achse umnormieren um das zu erreichen)

Gruß
Michael
Alfred Flaßhaar
2020-08-05 18:08:49 UTC
Permalink
Post by Alfred Flaßhaar
Post by Michael Koch
Hallo,
_gegeben_ sei die Funktion
y = a * x + b * x^2 + c * x^3 + d * x^4 (*)
´(...)
Mir ist noch unklar, warum bei gegebener Funktion (*) nicht einfach eine
Wertetabelle in ausreichend kleinen Schrittweiten berechnet wird. Die
Umkehrfunktion ist dann doch tabellarisch gegeben. Oder suchst Du "mit
Gewalt" eine Funktionsgleichung x=x(y) mit angemessener Näherung?

Gruß, Alfred
Jens Kallup
2020-08-05 18:17:03 UTC
Permalink
Am 05.08.2020 um 20:08 schrieb Alfred Flaßhaar:
Oder suchst Du "mit
Post by Alfred Flaßhaar
Gewalt" eine Funktionsgleichung x=x(y) mit angemessener Näherung?
Michael Koch, war ein Häcker.
Von daher, las Dich nicht provozieren.
Post by Alfred Flaßhaar
Gruß, Alfred
Jens
Michael Koch
2020-08-05 19:36:41 UTC
Permalink
Post by Alfred Flaßhaar
Post by Alfred Flaßhaar
Post by Michael Koch
Hallo,
_gegeben_ sei die Funktion
y = a * x + b * x^2 + c * x^3 + d * x^4 (*)
´(...)
Mir ist noch unklar, warum bei gegebener Funktion (*) nicht einfach eine
Wertetabelle in ausreichend kleinen Schrittweiten berechnet wird. Die
Umkehrfunktion ist dann doch tabellarisch gegeben. Oder suchst Du "mit
Gewalt" eine Funktionsgleichung x=x(y) mit angemessener Näherung?
Ich brauche ja die Umkehrfunktion, also y ist gegeben und x ist gesucht. Klar könnte ich die Werte durch Interpolation berechnen, aber dann müsste ich dafür ein Programm schreiben. Schöner wäre es, wenn ich die Umkehrfunktion irgendwie analytisch darstellen könnte, weil das den Workflow vereinfachen würde. Wobei es wie gesagt keine exakte Lösung sein muss. Eine hinreichend genaue Näherung tut's auch.

Gruß
Michael
Alfred Flaßhaar
2020-08-06 04:23:58 UTC
Permalink
Post by Michael Koch
Post by Alfred Flaßhaar
Post by Alfred Flaßhaar
Post by Michael Koch
Hallo,
_gegeben_ sei die Funktion
y = a * x + b * x^2 + c * x^3 + d * x^4 (*)
´(...)
Mir ist noch unklar, warum bei gegebener Funktion (*) nicht einfach eine
Wertetabelle in ausreichend kleinen Schrittweiten berechnet wird. Die
Umkehrfunktion ist dann doch tabellarisch gegeben. Oder suchst Du "mit
Gewalt" eine Funktionsgleichung x=x(y) mit angemessener Näherung?
Ich brauche ja die Umkehrfunktion, also y ist gegeben und x ist gesucht. Klar könnte ich die Werte durch Interpolation berechnen, aber dann müsste ich dafür ein Programm schreiben. Schöner wäre es, wenn ich die Umkehrfunktion irgendwie analytisch darstellen könnte, weil das den Workflow vereinfachen würde. Wobei es wie gesagt keine exakte Lösung sein muss. Eine hinreichend genaue Näherung tut's auch.
Gruß
Michael
Läßt sich b+c*x+d*x² betraglich abschätzen?

Gruß, Alfred
Alfred Flaßhaar
2020-08-06 13:53:36 UTC
Permalink
Post by Alfred Flaßhaar
Post by Michael Koch
Hallo,
_gegeben_ sei die Funktion
y = a * x + b * x^2 + c * x^3 + d * x^4 (*)
´(...)
Unter der Voraussetzung, daß b+c*x+d*x² keine Nullstellen in Deinem
Intervall hat und b, c, d << a sind, liegt abseits jeglicher Theorie
folgender heuristische Näherungsansatz als Versuch nahe:

In (*) wird von den letzten drei Summanden x² ausgeklammert, y auf die
x-Seite gebracht und das ganze als quadratische Gleichung in x gelöst.
Darin entstehen Brüche als Koeffizienten von x und x² wie z. B. c/a,
c/a², d/a und d/a². Die können unter Deinen Voraussetzungen als von
kleiner Ordnung "auf Null gerundet werden". Wenn ich mich nicht
verrechnet habe, dann erhält man

x = -a/(2*b)+-a/(2*b)*sqrt(1+4*(b/a²)*y)

Welches Vorzeichen für die Wurzel gilt, hängt von der Plausibilität
Deines technischen Problems ab. Durch Abschätzung von c*x³und d*x^4
durch Konstanten lassen sich noch Korrekturen durch c und d
berücksichtigen. Aber Du wolltest ja nur eine _geschlossene_
Funktionsgleichung als Näherung haben.

Gruß, Alfred Flaßhaar

Jens Kallup
2020-08-05 17:17:01 UTC
Permalink
Post by Michael Koch
Hallo,
gegeben sei die Funktion
y = a * x + b * x^2 + c * x^3 + d * x^4
Meine Frage: Helfen diese zusätzlichen Bedingungen irgendwie dabei, eine Lösung zu finden? Die Anwendung betrifft die Verzeichnung von Objektiven.
Nein.
Wenn aber geg. ist, dass x, a,b,c,d := 1 sind, weil

x = x^8

x + x^2 + x^3 + x^4
y = ---------------------
a + b + c + d

x^9
= -----
4

1^9
= -----
4

1
= -----
4

y = 0,25
Jens Kallup
2020-08-05 17:20:22 UTC
Permalink
Post by Jens Kallup
Post by Michael Koch
Hallo,
gegeben sei die Funktion
y = a * x + b * x^2 + c * x^3 + d * x^4
Meine Frage: Helfen diese zusätzlichen Bedingungen irgendwie dabei,
eine Lösung zu finden? Die Anwendung betrifft die Verzeichnung von
Objektiven.
Nein.
Wenn aber geg. ist, dass x, a,b,c,d := 1 sind, weil
x = x^10
     x + x^2 + x^3 + x^4
y = ---------------------
     a +  b  +  c  +  d
     x^10
  = -----
      4
     1^10
  = -----
      4
     10
  = -----
      4
y = 2,5
Christian Gollwitzer
2020-08-05 19:19:51 UTC
Permalink
Am 05.08.20 um 18:25 schrieb Michael Koch: > gegeben sei die Funktion
Post by Michael Koch
y = a * x + b * x^2 + c * x^3 + d * x^4
gesucht ist die Umkehrfunktion x = f(y)
Es darf auch gerne eine Näherungslösung sein.
y(0) = 0 (das ist trivial)
y(1) = 1
Es interessiert nur das Intervall [0..1].
In diesem Intervall ist die Funktion y = f(x) monoton steigend, d.h. die Umkehrfunktion kann nicht mehrdeutig sein, es gibt zu jedem y-Wert genau einen x-Wert. Das ist durch die Wahl der Parameter a,b,c,d sichergestellt. a ist ungefähr 1, und b,c,d sind klein gegenüber a.
Rein theoretisch gibt es für Polynome 4. Grades noch eine
Auflösungsformel, die ist aber so kompliziert, dass Du das wohl eher
nicht willst.

Wenn Du sagst, eine Näherung reicht, dann nehme ich an, dass die
Funktion in Form eines Algorithmus' gegeben sein darf? Dann bietet sich
schlicht das Newton-Raphson-Verfahren an. Die Ableitung für das Polynom
ist ja trivial berechenbar, und als Startwert kannst Du einfach die
lineare Gleichung für die Koeffizienten zwischen 0 und 1 lösen, oder
eben b,c,d vernachlässigen. Dann dürften wenige Iterationen reichen, um
das Ergebnis in gewünschter Genauigkeit zu bekommen.

Also

f(x) = a * x + b * x^2 + c * x^3 + d * x^4
f'(x) = a + 2*b*x + 3*c*x^2 + 4*d*x^3

x_0 = y / a # z.B.

x_i+1 = x_i - ((f(x_i) - y) / f'(x_i)) # ein paarmal iterieren

Modulo Rechenfehler sollte das in wenigen Schritten konvergieren.

Christian
Michael Koch
2020-08-05 19:47:14 UTC
Permalink
Post by Christian Gollwitzer
Rein theoretisch gibt es für Polynome 4. Grades noch eine
Auflösungsformel, die ist aber so kompliziert, dass Du das wohl eher
nicht willst.
stimmt, die ist mir zu kompliziert.
Post by Christian Gollwitzer
Wenn Du sagst, eine Näherung reicht, dann nehme ich an, dass die
Funktion in Form eines Algorithmus' gegeben sein darf? Dann bietet sich
schlicht das Newton-Raphson-Verfahren an. Die Ableitung für das Polynom
ist ja trivial berechenbar, und als Startwert kannst Du einfach die
lineare Gleichung für die Koeffizienten zwischen 0 und 1 lösen, oder
eben b,c,d vernachlässigen. Dann dürften wenige Iterationen reichen, um
das Ergebnis in gewünschter Genauigkeit zu bekommen.
Also
f(x) = a * x + b * x^2 + c * x^3 + d * x^4
f'(x) = a + 2*b*x + 3*c*x^2 + 4*d*x^3
x_0 = y / a # z.B.
x_i+1 = x_i - ((f(x_i) - y) / f'(x_i)) # ein paarmal iterieren
Modulo Rechenfehler sollte das in wenigen Schritten konvergieren.
Ja diese Idee ist schon gut. Aber noch nicht ganz das was ich mir vorstelle. Ich muss die Formel nämlich in ein FFmpeg Script integrieren. Da kann ich zwar fast beliebige Formeln einbauen, aber Iterieren geht leider nicht.

Gruß
Michael
Christian Gollwitzer
2020-08-05 20:35:52 UTC
Permalink
Post by Michael Koch
Post by Christian Gollwitzer
Rein theoretisch gibt es für Polynome 4. Grades noch eine
Auflösungsformel, die ist aber so kompliziert, dass Du das wohl eher
nicht willst.
stimmt, die ist mir zu kompliziert.
Post by Christian Gollwitzer
Wenn Du sagst, eine Näherung reicht, dann nehme ich an, dass die
Funktion in Form eines Algorithmus' gegeben sein darf? Dann bietet sich
schlicht das Newton-Raphson-Verfahren an. Die Ableitung für das Polynom
ist ja trivial berechenbar, und als Startwert kannst Du einfach die
lineare Gleichung für die Koeffizienten zwischen 0 und 1 lösen, oder
eben b,c,d vernachlässigen. Dann dürften wenige Iterationen reichen, um
das Ergebnis in gewünschter Genauigkeit zu bekommen.
Also
f(x) = a * x + b * x^2 + c * x^3 + d * x^4
f'(x) = a + 2*b*x + 3*c*x^2 + 4*d*x^3
x_0 = y / a # z.B.
x_i+1 = x_i - ((f(x_i) - y) / f'(x_i)) # ein paarmal iterieren
Modulo Rechenfehler sollte das in wenigen Schritten konvergieren.
Ja diese Idee ist schon gut. Aber noch nicht ganz das was ich mir vorstelle. Ich muss die Formel nämlich in ein FFmpeg Script integrieren. Da kann ich zwar fast beliebige Formeln einbauen, aber Iterieren geht leider nicht.
Verstehe. Du möchtest eine möglichst explizite Formel, die die Inverse
annähert. Wenn ich es richtig verstanden habe, ist die Funktion ja nur
eine kleine Abweichung von einer Geraden. Dann kannst Du auch die
Inverse mit einem Polynom 4. Grades annähern. Am Einfachsten fittest Du
f(x) an die inversen Daten an. Das geht z.B. mit Gnuplot so:

Apfelkiste:BessyHDFViewer chris$ gnuplot

G N U P L O T
Version 5.2 patchlevel 6 last modified 2019-01-01

Copyright (C) 1986-1993, 1998, 2004, 2007-2018
Thomas Williams, Colin Kelley and many others

gnuplot home: http://www.gnuplot.info
faq, bugs, etc: type "help FAQ"
immediate help: type "help" (plot window: hit 'h')

Terminal type is now 'qt'
gnuplot> f(x) = a*x + b*x**2 + c*x**3 + d*x**4
gnuplot> a=1.01; b=0.01; c=0.02; d=0.03
gnuplot> plot [0:1] f(x)

Warning: slow font initialization
gnuplot> set table "kurve.dat"
gnuplot> plot [0:1] f(x)
gnuplot> unset table
gnuplot> g(x) = e*x + f*x**2 + g*x**3 + h*x**4
gnuplot> e=a; f=-b; c=-g; h=-d
undefined variable: g

gnuplot> e=a; f=-b; g=-c; h=-d
gnuplot> fit g(x) "kurve.dat" u 2:1 via e, f, g, h
iter chisq delta/lim lambda e f g
h
0 7.3250613021e-03 0.00e+00 3.06e-01 1.010000e+00
-1.000000e-02 -2.000000e-02 -3.000000e-02
1 6.3509280794e-04 -1.05e+06 3.06e-02 9.961229e-01
-9.969149e-03 -1.980949e-02 -2.948109e-02
2 2.3983112403e-05 -2.55e+06 3.06e-03 9.895363e-01
-9.619212e-03 -1.731022e-02 -2.192845e-02
3 1.6415548273e-06 -1.36e+06 3.06e-04 9.907193e-01
-1.210563e-02 -2.338832e-02 -1.378538e-02
4 1.6068402389e-07 -9.22e+05 3.06e-05 9.895649e-01
-2.686351e-03 -4.189100e-02 -3.501167e-03
5 9.0498141164e-08 -7.76e+04 3.06e-06 9.887711e-01
1.564029e-03 -4.861398e-02 -2.358848e-04
6 9.0496972269e-08 -1.29e+00 3.06e-07 9.887679e-01
1.581460e-03 -4.864150e-02 -2.225368e-04
* 9.0496972269e-08 4.71e-08 3.06e-06 9.887679e-01
1.581461e-03 -4.864150e-02 -2.225363e-04
* 9.0496972269e-08 3.26e-08 3.06e-05 9.887679e-01
1.581461e-03 -4.864150e-02 -2.225363e-04
* 9.0496972269e-08 1.96e-08 3.06e-04 9.887679e-01
1.581461e-03 -4.864150e-02 -2.225363e-04
* 9.0496972269e-08 3.51e-09 3.06e-03 9.887679e-01
1.581461e-03 -4.864150e-02 -2.225365e-04
7 9.0496972269e-08 -2.18e-08 3.06e-04 9.887679e-01
1.581460e-03 -4.864150e-02 -2.225368e-04
iter chisq delta/lim lambda e f g
h

After 7 iterations the fit converged.
final sum of squares of residuals : 9.0497e-08
rel. change during last iteration : -2.17761e-13

degrees of freedom (FIT_NDF) : 96
rms of residuals (FIT_STDFIT) = sqrt(WSSR/ndf) : 3.0703e-05
variance of residuals (reduced chisquare) = WSSR/ndf : 9.42677e-10

Final set of parameters Asymptotic Standard Error
======================= ==========================
e = 0.988768 +/- 9.772e-05 (0.009883%)
f = 0.00158146 +/- 0.0004964 (31.39%)
g = -0.0486415 +/- 0.0007851 (1.614%)
h = -0.000222537 +/- 0.0003883 (174.5%)

correlation matrix of the fit parameters:
e f g h
e 1.000
f -0.968 1.000
g 0.916 -0.986 1.000
h -0.865 0.958 -0.992 1.000
gnuplot> plot "kurve.dat" u 2:1, g(x)

# plotte das Residuum
gnuplot> plot "kurve.dat" u 2:($1-g($2))

Das Residuum für dieses Beispiel ist kleiner als 8*10^-5.
Ein kleines bisschen besser würde man es noch hinkriegen, Stichwort
Minimax-Polynom bzw. Remez-Algorithmus, viel besser wird das dadurch
aber dann auch nicht.

Ein anderer Ansatz, der Funktionen nich besser approximiert, ist der
gebrochen-rationale Ansatz, d.h. Du fittest den Quotient zweier
Polynome. Allerdings ist es da wieder schwieriger, den Fit hinreichend
gut konvergieren zu lassen.

gnuplot> rat(x)=(e*x + f*x**2 + g*x**3) / ( 1 + h*x + i*x**2)
gnuplot> fit rat(x) "kurve.dat" u 2:1 via e, f, g, h,i

Final set of parameters Asymptotic Standard Error
======================= ==========================
e = 0.98986 +/- 1.552e-05 (0.001568%)
f = -0.580349 +/- 0.005676 (0.978%)
g = 0.198514 +/- 0.002346 (1.182%)
h = -0.579126 +/- 0.005638 (0.9735%)
i = 0.224959 +/- 0.002127 (0.9454%)


Damit liegt der Fehler unterhalb von 1*10^-5

Christian
Torn Rumero DeBrak
2020-08-06 09:57:10 UTC
Permalink
Post by Michael Koch
Hallo,
gegeben sei die Funktion
y = a * x + b * x^2 + c * x^3 + d * x^4
gesucht ist die Umkehrfunktion x = f(y)
Es darf auch gerne eine Näherungslösung sein.
y(0) = 0 (das ist trivial)
y(1) = 1
Es interessiert nur das Intervall [0..1].
In diesem Intervall ist die Funktion y = f(x) monoton steigend, d.h. die Umkehrfunktion kann nicht mehrdeutig sein, es gibt zu jedem y-Wert genau einen x-Wert. Das ist durch die Wahl der Parameter a,b,c,d sichergestellt. a ist ungefähr 1, und b,c,d sind klein gegenüber a.
Meine Frage: Helfen diese zusätzlichen Bedingungen irgendwie dabei, eine Lösung zu finden? Die Anwendung betrifft die Verzeichnung von Objektiven.
Gruß
Michael
Vielleicht hilft
https://de.wikiversity.org/wiki/Taylorreihe/R/Umkehrfunktion/Bestimmung/Bemerkung
Loading...