Matroids Matheplanet Forum Index
Moderiert von mire2
Mathematische Software & Apps » Matlab » Fit eines Kreisbogens an Messwerte
Autor
Kein bestimmter Bereich Fit eines Kreisbogens an Messwerte
Dirk_Broemme
Wenig Aktiv Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 04.06.2003
Mitteilungen: 500
Wohnort: Lübeck
  Themenstart: 2023-06-02

Hallo zusammen, ich habe Messdaten h und s und möchte einen Kreisbogen fitten an diese Daten fitten. Freiheitsgrade des Fits sind Radius p(1) und die beiden Mittelpunktskoordinaten p(2) und p(3). Die Daten h und s sind Längen. h liegt im nm-Bereich. s liegt im mm-Bereich. Meine Modelfunktion lautet: fun_eval=@(p,x) (sqrt((p(1)).^2-(x-p(2)).^2)+p(3)); Die Minimierung der Fehlerquadratsumme fit_fun habe ich mit fminsearch gemacht: fit_fun=@(p) sum((h-(sqrt((p(1)).^2-(s-p(2)).^2)+p(3))).^2); %Startwerte p0 = [280, -3e-3, -280]; %Nonlinear fit [param,result,exitflag,output] = fminsearch(fit_fun, p0,optimset('TolFun',1e-24,'TolX',1e-24,'MaxIter',1000000,'MaxFunEvals',1000000)); result exitflag output param Mein Problem ist, dass das Ergebnis des Fits offenbar konvergiert, aber relativ ungenau ist. Das der Fit ungenau ist, zeigt der Plot. Was muss ich tun, um die Genauigkeit des Fits zu erhöhen? Eine Verringerung von TolFun und TolX liefert kein besseres Fitergebnis. Ich habe auch schon lsqnonlin als Optimierungsfunktion versucht, erziele damit aber kein besseres Ergebnis. Ich vermute, dass vielleicht ein numerisches Problem vorliegen könnte, weil ich ja quasi einen riesengroßen Kreis an einen sehr kleinen Kreisbogen fitten möchte. Weiß jemand Rat, wie ich die Genauigkeit des Fits erhöhen kann? Viele Grüße Dirk Mein Code: clear all close all clc h=[5.2907 4.6066 5.2909 5.7002 6.1200 6.6740 7.5870 7.2940 7.9695 7.8882 9.0009 9.2533 8.3925 7.7168 7.8969 7.4410 7.0597 6.5565 6.1491 5.6891 5.3934 5.0254 5.2959 5.0708]*1e-9; s=[-5.4610 -5.3340 -5.2070 -5.0800 -4.9530 -4.8260 -4.6990 -4.5720 -4.4450 -4.3180 -4.1910 -4.0640 -3.9370 -3.8100 -3.6830 -3.5560 -3.4290 -3.3020 -3.1750 -3.0480 -2.9210 -2.7940 -2.6670 -2.5400]*1e-3; fit_fun=@(p) sum((h-(sqrt((p(1)).^2-(s-p(2)).^2)+p(3))).^2); fun_eval=@(p,x) (sqrt((p(1)).^2-(x-p(2)).^2)+p(3)); %Inital guesses p0 = [280, -3e-3, -280]; %Nonlinear fit [param,result,exitflag,output] = fminsearch(fit_fun, p0,optimset('TolFun',1e-24,'TolX',1e-24,'MaxIter',1000000,'MaxFunEvals',1000000)); result exitflag output param %Plot figure(1) plot(s,h,'b',s,fun_eval(param,s),'r') xlabel('s / m') ylabel('h / m') grid on legend('Measurement data', 'Fit: Kreisbogen') legend boxoff; https://www.matheplanet.com/matheplanet/nuke/html/uploads/c/2461_Plot1.JPG


   Profil
StefanVogel
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 26.11.2005
Mitteilungen: 4288
Wohnort: Raun
  Beitrag No.1, eingetragen 2023-06-10

\quoteon(2023-06-02 17:44 - Dirk_Broemme im Themenstart) Ich vermute, dass vielleicht ein numerisches Problem vorliegen könnte, weil ich ja quasi einen riesengroßen Kreis an einen sehr kleinen Kreisbogen fitten möchte. Weiß jemand Rat, wie ich die Genauigkeit des Fits erhöhen kann? \quoteoff Hallo Dirk, h und s unterscheiden sich um einen Faktor etwa 1e-6. Wenn man h und s maßstabsgerecht in das Diagramm einzeichnet, ergibt sich kein kleiner Kreisbogen sondern eine ganz schmale Nadelspitze. Die mit einem Kreisbogen gut annähern ist ja unmöglich. Da müsstest du eher eine Näherungsfunktion wie Parabel oder Ellipse verwenden, weil die bei Stauchung in einer Richtung immer noch eine Parabel oder Ellipse bleibt und deshalb vom Näherungsverfahren gefunden werden kann. Viele Grüße, Stefan EDIT (nach den vielen nachfolgenden gefundenen Lösungen): h ist ja um einen Faktor etwa 1e6 kleiner als s, das ergibt maßstabsgerecht gezeichnet einen sehr flachen Kurvenverlauf.


   Profil
zippy
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 24.10.2018
Mitteilungen: 4998
  Beitrag No.2, eingetragen 2023-06-10

\quoteon(2023-06-10 06:49 - StefanVogel in Beitrag No. 1) Die mit einem Kreisbogen gut annähern ist ja unmöglich. \quoteoff Ein Fit mit einem Kreisbogen sieht für mich gar nicht so schlecht aus: Das Verhalten an der Spitze kann man mit einem Fit "von Hand" noch etwas netter aussehen lassen: Im Augenblick habe ich keinen Zugang zu Matlab, daher habe ich R verwendet: \showon \sourceon R library(ggplot2) h <- c(5.2907, 4.6066, 5.2909, 5.7002, 6.1200, 6.6740, 7.5870, 7.2940, 7.9695, 7.8882, 9.0009, 9.2533, 8.3925, 7.7168, 7.8969, 7.4410, 7.0597, 6.5565, 6.1491, 5.6891, 5.3934, 5.0254, 5.2959, 5.0708) * 1e-6; s <- c(-5.4610, -5.3340, -5.2070, -5.0800, -4.9530, -4.8260, -4.6990, -4.5720, -4.4450, -4.3180, -4.1910, -4.0640, -3.9370, -3.8100, -3.6830, -3.5560, -3.4290, -3.3020, -3.1750, -3.0480, -2.9210, -2.7940, -2.6670, -2.5400) * 1e-3; model <- function(p, x) { x0 <- p[1]; y0 <- p[2]; r2 <- p[3] y0 + sqrt(r2 - (x - x0)^2) } par.init <- function(y0) c(mean(s), y0, (mean(h) - y0)^2) opt <- optim(par = par.init(-.5), fn = \(p) sum((model(p, s) - h)^2), control = list(reltol = 1e-12, maxit = 1e5)) print(ggplot(data.frame(s, h, m = model(opt$par, s))) + geom_point(aes(s, h), color = 'blue') + geom_line(aes(s, m), color = 'red')) \sourceoff \showoff Da sich die Zielfunktion nur wenig mit den Fit-Parametern ändert, ist es wichtig, die Toleranz für den Abbruch der Optimierung nicht zu hoch zu wählen. Anderenfalls hängt das Ergebnis der Optimierung von den Anfangswerten der Fit-Parameter ab. --zippy


   Profil
AlphaSigma
Senior Letzter Besuch: im letzten Monat
Dabei seit: 23.11.2012
Mitteilungen: 453
  Beitrag No.3, eingetragen 2023-06-10

Hallo, hier ein Ergebnis mit der Fit-Funktion von gnuplot. \sourceon gnuplot The `fit` command fits a user-supplied real-valued expression to a set of data points, using the nonlinear least-squares Marquardt-Levenberg algorithm. User-Defined Functions: h(s) = sqrt(p1**2 - (s-p2)**2) + p3 p1 = 214.420070493139 p2 = -0.004 p3 = -214.420070484655 degrees of freedom (FIT_NDF) : 21 rms of residuals (FIT_STDFIT) = sqrt(WSSR/ndf) : 7.32472e-10 variance of residuals (reduced chisquare) = WSSR/ndf : 5.36515e-19 Final set of parameters Asymptotic Standard Error ======================= ========================== p1 = 214.42 +/- 19.97 (9.314%) p2 = -0.004 +/- 3.647e-05 (0.9118%) p3 = -214.42 +/- 19.97 (9.314%) correlation matrix of the fit parameters: p1 p2 p3 p1 1.000 p2 -0.000 1.000 p3 -1.000 0.000 1.000 \sourceoff https://www.matheplanet.de/matheplanet/nuke/html/uploads/c/35344_fit_circle.png Wie zippy schon geschrieben hat, hängt das Ergebnis stark von den Anfangswerten ab.


   Profil
zippy
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 24.10.2018
Mitteilungen: 4998
  Beitrag No.4, eingetragen 2023-06-10

Inzwischen habe ich mal Matlab online aufgerufen. Das Problem im Startbeitrag sind nur die völlig danebenliegenden Startwerte für die Fit-Parameter (ein Startwert von 250 Metern für den Radius bei Daten, die sich im Millimeterbereich bewegen, ist nicht plausibel). Wenn man das korrigiert, sieht das Bild wie in Beitrag Nr. 1 aus:


   Profil
Dirk_Broemme
Wenig Aktiv Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 04.06.2003
Mitteilungen: 500
Wohnort: Lübeck
  Beitrag No.5, vom Themenstarter, eingetragen 2023-06-13

Hallo zusammen, besten Dank für die Antworten. Mir ist noch nicht ganz klar was das Fazit ist... Problematisch scheint der Größenordnungsunterschied zwischen den Abszissen- und den Ordinatenwerten zu sein, richtig? Ist das die Ursache, für die große Abhängigkeit vom Startwert? Falls ja, wie kann man diese große Startwertabhängigkeit verringern? Wäre es eine Lösung, nicht die abs. Residuenquadratsumme zu minimieren, sondern die rel. Residuenquadratsumme? Oder ist es ratsam, die Werte in den gleichen Größenordnungsbereich zu skalieren und dann eine Parabel an diese skalierten Daten zu fitten und danach wieder zurückzutransformieren? Eine Parabel ist in dem Beispiel sicher eine gute Näherung für den Kreisbogen. Viele Grüße Dirk


   Profil
zippy
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 24.10.2018
Mitteilungen: 4998
  Beitrag No.6, eingetragen 2023-06-13

\quoteon(2023-06-13 18:04 - Dirk_Broemme in Beitrag No. 5) Ist das die Ursache, für die große Abhängigkeit vom Startwert? \quoteoff Die große Abhängigkeit vom Startwert gibt es nur, wenn die Toleranz für den Abbruch der Optimierung zu hoch gewählt ist: \quoteon(2023-06-10 12:56 - zippy in Beitrag No. 2) Da sich die Zielfunktion nur wenig mit den Fit-Parametern ändert, ist es wichtig, die Toleranz für den Abbruch der Optimierung nicht zu hoch zu wählen. Anderenfalls hängt das Ergebnis der Optimierung von den Anfangswerten der Fit-Parameter ab. \quoteoff In diesem Fall sieht man, dass das Ergebnis der Optimierung ungefähr mit den Startwerten zusammenfällt. Wenn man die Toleranz hinreichend klein wählt (das ist sowohl bei dir im Startbeitrag als auch in meinem Beitrag Nr. 2 der Fall), dann konvergiert das Ergebnis gegen das globale Optimum, solange die Startwerte nicht zu weit davon entfernt liegen. Das ist das Problem bei dir im Startbeitrag: \quoteon(2023-06-10 17:32 - zippy in Beitrag No. 4) Das Problem im Startbeitrag sind nur die völlig danebenliegenden Startwerte für die Fit-Parameter (ein Startwert von 250 Metern für den Radius bei Daten, die sich im Millimeterbereich bewegen, ist nicht plausibel). Wenn man das korrigiert, sieht das Bild wie in Beitrag Nr. 1 aus \quoteoff Das ist also das einzige, was du ändern musst. Startwerte, die funktionieren, sind z.B. $x_0 =$ Mittelwert von $s$ und $-y_0=r=0.5$.


   Profil
MontyPythagoras
Senior Letzter Besuch: im letzten Quartal
Dabei seit: 13.05.2014
Mitteilungen: 3414
Wohnort: Werne
  Beitrag No.7, eingetragen 2023-06-13

Hallo Dirk, unabhängig von den hier gemachten Vorschlägen: beide Messwerte sind der Dimension nach "Längen". Gibt es denn vor dem realen Hintergrund einen zwingenden Grund zu der Annahme, dass die Messwerte einen Kreisbogen ergeben müssen? Ciao, Thomas


   Profil
hyperG
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 03.02.2017
Mitteilungen: 2111
  Beitrag No.8, eingetragen 2023-06-13

\quoteon(2023-06-02 17:44 - Dirk_Broemme im Themenstart) ... Weiß jemand Rat, wie ich die Genauigkeit ... erhöhen kann? Viele Grüße Dirk ... \quoteoff Hallo zusammen, auch für mich sehen die Messwerte nicht nach einem Halbkreis aus. Unabhängig von der verwendeten Software und der dahinterstehenden Physik möchte ich für Interessierte eine rein mathematische Lösung zeigen, die die Stützstellen exakt trifft (beliebig hohe Genauigkeit) und dabei nicht die Nachteile der https://de.wikipedia.org/wiki/Polynominterpolation (starkes Überschwingen bei mehr als 8 Stützstellen) mit sich bringt: Trigonometrische Interpolation Da die x-Werte schön linear ansteigen, reicht eine Interpolation für die 24 y-Werte. (andernfalls müsste man das Array der x-Werte auch interpolieren) Heraus kommt eine explizite Funktion f[x] aus sin- & cos- Termen, die nur noch richtig normiert werden muss: https://matheplanet.com/matheplanet/nuke/html/uploads/c/47407_TrigonometrischeInterpol_256b.png - alle Stützstellen exakt getroffen - kein Überschwingen - "weiche Verbindungen der Punkte": weder Kanten, Knicke noch Halbkreise - explizite Funktion, die mit einfachen Funktionen auskommt (keine Sondersoftware nötig) Grüße


   Profil
Folgende Antworten hat der Fragensteller vermutlich noch nicht gesehen.
Er/sie war noch nicht wieder auf dem Matheplaneten
MontyPythagoras
Senior Letzter Besuch: im letzten Quartal
Dabei seit: 13.05.2014
Mitteilungen: 3414
Wohnort: Werne
  Beitrag No.9, eingetragen 2023-06-14

Hallo hyperG, ohne von Dirk bislang eine Antwort bekommen zu haben, glaube ich nicht, dass es darum geht, Zwischenwerte als eine Funktion $h(s)$ zu interpolieren. Es könnte (!) darum gehen, dass es reale Messwerte an irgendeinem kreisförmigen Objekt sind, und man kann den Radius und Mittelpunkt nicht direkt "sehen" oder messen, sondern man kann nur von außen ein paar Messpunkte aufnehmen und damit versuchen, den Kreis möglichst genau zu rekonstruieren. Solche Anwendungen habe ich in der Praxis schon gehabt. Zum Beispiel, weil man ein kleines Stück Stahl in der Hand hält, welches ein Kreissegment darstellt und nicht größer ist als 3cm Bogenlänge, aber der Radius ist 300cm. Mit einem entsprechend genauen 3D-Koordinatenmessgerät nimmt man dann eben ein paar Koordinaten auf und versucht, möglichst genaue und sinnvolle Rückschlüsse auf den Radius des Kreises zu ziehen. Ciao, Thomas


   Profil
MontyPythagoras
Senior Letzter Besuch: im letzten Quartal
Dabei seit: 13.05.2014
Mitteilungen: 3414
Wohnort: Werne
  Beitrag No.10, eingetragen 2023-06-18

Hallo Dirk, falls es noch von Interesse für Dich ist: man kann noch einen anderen Weg gehen, indem man sich zunutze macht, dass dieses Kreissegment nur einen sehr kleinen Ausschnitt des Kreises darstellt. Dazu nähert man den Kreis zunächst an durch eine Parabel. Ziel ist dann, die Summe $$S(a,b,c)=\sum_{k=1}^n \left(as_k^2+bs_k+c-h_k\right)^2\tag1$$zu minimieren. $a,b,c$ sind die drei Parameter der Parabel. Das geht recht leicht, weil sich hier beim Nullsetzen der partiellen Ableitungen ein lineares Gleichungssystem ergibt. Für den besten Fit einer Parabel muss gelten: $$\frac{\partial}{\partial a}S(a,b,c)=0=2\sum_{k=1}^n s_k^2\left(as_k^2+bs_k+c-h_k\right)\tag2$$Die 2 vor der Summe kann man streichen, das Innere ausmultiplizieren, $a,b,c$ vor die Summen ziehen und erhält dann, wenn man das auch noch mit den partiellen Ableitungen für $b$ und $c$ macht, folgendes LGS: $$a\sum_{k=1}^n s_k^4+b\sum_{k=1}^n s_k^3+c\sum_{k=1}^n s_k^2=\sum_{k=1}^n s_k^2h_k\tag{3a}$$$$a\sum_{k=1}^n s_k^3+b\sum_{k=1}^n s_k^2+c\sum_{k=1}^n s_k=\sum_{k=1}^n s_kh_k\tag{3b}$$$$a\sum_{k=1}^n s_k^2+b\sum_{k=1}^n s_k+cn=\sum_{k=1}^n h_k\tag{3c}$$Das sieht auf den ersten Blick kompliziert aus, aber die Summen sind ja jeweils nur Aufsummierungen über die gegebenen Messwerte. Das kann man problemlos mit Excel bewerkstelligen und muss sich keine Gedanken über optimale Startwerte machen. Die Gleichung des Kreises lautet $$h(s)=h_m+\sqrt{r^2-(s-s_m)^2}=h_m+r\sqrt{1-\frac{(s-s_m)^2}{r^2}}\tag4$$Per Taylorreihe kann man das annähern durch die Parabel $$h(s)\approx h_m+r\left(1-\frac{(s-s_m)^2}{2r^2}\right)\tag5$$Ausmultipliziert: $$h(s)\approx -\frac1{2r}s^2+\frac{s_m}{r}s-\frac{s_m^2}{2r}+r+h_m\tag6$$Hast Du also die Parabelwerte ermittelt, folgt für die Kreisparameter durch Vergleich: $$r=-\frac{1}{2a}\qquad s_m=-\frac{b}{2a}\qquad h_m=c+\frac{1}{2a}-\frac{b^2}{4a}\tag7$$ Ciao, Thomas


   Profil
MontyPythagoras
Senior Letzter Besuch: im letzten Quartal
Dabei seit: 13.05.2014
Mitteilungen: 3414
Wohnort: Werne
  Beitrag No.11, eingetragen 2023-06-18

... und um das Ganze noch zahlenmäßig zu untermauern: Manueller Fit per Excel: https://matheplanet.de/matheplanet/nuke/html/uploads/c/39826_Fitcircle.png und die Tabelle dazu: https://matheplanet.de/matheplanet/nuke/html/uploads/c/39826_Fitcircle2.png Die rot hervorgehobenen Zahlen sind die mit dieser einfachen Methode berechneten, gesuchten Parameter. \quoteon(2023-06-02 17:44 - Dirk_Broemme im Themenstart) %Startwerte p0 = [280, -3e-3, -280]; \quoteoff Die Startwerte von Dirk waren also recht gut. Ich nehme an, dass aus welchen Gründen auch immer der Radius von 280 durchaus vorher vermutet wurde. \quoteon(2023-06-10 17:32 - zippy in Beitrag No. 4) (ein Startwert von 250 Metern für den Radius bei Daten, die sich im Millimeterbereich bewegen, ist nicht plausibel). \quoteoff Offenkundig doch. Warum sollte es auch nicht? In einem kleinen Ausschnitt eines großen Kreises sind die Zahlenwerte eben klein. Warum der Fit dann trotz der recht guten Startwerte nicht funktioniert hat, wird wohl mit dem von Matlab verwendeten Algorithmus zusammenhängen oder mit den Limits der 64bit-Präzision. Ciao, Thomas


   Profil
AlphaSigma
Senior Letzter Besuch: im letzten Monat
Dabei seit: 23.11.2012
Mitteilungen: 453
  Beitrag No.12, eingetragen 2023-06-18

\quoteon(2023-06-10 17:32 - zippy in Beitrag No. 4) Inzwischen habe ich mal Matlab online aufgerufen. Das Problem im Startbeitrag sind nur die völlig danebenliegenden Startwerte für die Fit-Parameter (ein Startwert von 250 Metern für den Radius bei Daten, die sich im Millimeterbereich bewegen, ist nicht plausibel). ... \quoteoff \quoteon(2023-06-18 22:23 - MontyPythagoras in Beitrag No. 11) ... und um das Ganze noch zahlenmäßig zu untermauern: \quoteon(2023-06-10 17:32 - zippy in Beitrag No. 4) (ein Startwert von 250 Metern für den Radius bei Daten, die sich im Millimeterbereich bewegen, ist nicht plausibel). \quoteoff Offenkundig doch. Warum sollte es auch nicht? In einem kleinen Ausschnitt eines großen Kreises sind die Zahlenwerte eben klein. ... Ciao, Thomas \quoteoff Hallo, wie groß die Zahlen sind hängt doch nur von der relativen Lage des Mittelpunkts zum Ursprung bzw. den Achsen ab und sagt nichts über die Größenordung des Radius aus.


   Profil
zippy
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 24.10.2018
Mitteilungen: 4998
  Beitrag No.13, eingetragen 2023-06-19

\quoteon(2023-06-18 22:23 - MontyPythagoras in Beitrag No. 11) \quoteon(2023-06-10 17:32 - zippy in Beitrag No. 4) (ein Startwert von 250 Metern für den Radius bei Daten, die sich im Millimeterbereich bewegen, ist nicht plausibel). \quoteoff Offenkundig doch. Warum sollte es auch nicht? \quoteoff Zu dieser Aussage kam ich, da ich – wie die Grafiken in Beitrag Nr. 2 zeigen – fälschlicherweise aber konsequent mit $10^{-6}\,\rm m$ statt mit $10^{-9}\,\rm m$ gerechnet habe. Während für meine falschen Einheiten ein Radius in der Größenordnung von $10^0\,\rm m$ plausibel ist, ist es für die richtigen Einheiten ein Radius in der Größenordnung von $10^3\,\rm m$. Tatsächlich erhalte ich für die richtigen Einheiten mit einem Startwert $r=500\,\rm m$ das Optimum bei $r=286\mathord,2475\;\rm m$. \showon \sourceon R library(ggplot2) h <- c(5.2907, 4.6066, 5.2909, 5.7002, 6.1200, 6.6740, 7.5870, 7.2940, 7.9695, 7.8882, 9.0009, 9.2533, 8.3925, 7.7168, 7.8969, 7.4410, 7.0597, 6.5565, 6.1491, 5.6891, 5.3934, 5.0254, 5.2959, 5.0708) * 1e-9; s <- c(-5.4610, -5.3340, -5.2070, -5.0800, -4.9530, -4.8260, -4.6990, -4.5720, -4.4450, -4.3180, -4.1910, -4.0640, -3.9370, -3.8100, -3.6830, -3.5560, -3.4290, -3.3020, -3.1750, -3.0480, -2.9210, -2.7940, -2.6670, -2.5400) * 1e-3; model <- function(p, x) { x0 <- p[1]; y0 <- p[2]; d <- p[3] y0 - (x - x0)^2 / d } par.init <- function(r) c(mean(s), 0, 2*r) opt <- optim(par = par.init(500), fn = \(p) sum( (model(p, s) - h)^2 ), control = list(reltol = 1e-12, maxit = 1e5)) print(ggplot(data.frame(s, h, m = model(opt$par, s))) + geom_point(aes(s, h), color = 'blue') + geom_line(aes(s, m), color = 'red')) print(opt$par[3]/2) \sourceoff \showoff Die Aussage von Beitrag Nr. 4, dass das Problem des Plots im Startbeitrag die Startwerte für die Fit-Parameter sind, bleibt aber weiterhin bestehen, denn etwas anderes habe ich dort gegenüber dem Startbeitrag nicht geändert. Ein Test mit Matlab online zeigt, dass der kritische Startwert tatsächlich nicht der Radius, sondern die $x$-Komponente des Kreismittelpunkts ist. Wenn man dafür den Mittelwert von $s$ ($\approx-4\,\rm mm$) statt der $-3\,\rm mm$ aus dem Startbeitrag nimmt (und ansonsten alles so lässt wie im Startbeitrag), funktioniert der Plot problemlos wie in Beitrag Nr. 4.


   Profil
MontyPythagoras
Senior Letzter Besuch: im letzten Quartal
Dabei seit: 13.05.2014
Mitteilungen: 3414
Wohnort: Werne
  Beitrag No.14, eingetragen 2023-06-19

Hallo zusammen, \quoteon(2023-06-18 23:29 - AlphaSigma in Beitrag No. 12) wie groß die Zahlen sind hängt doch nur von der relativen Lage des Mittelpunkts zum Ursprung bzw. den Achsen ab und sagt nichts über die Größenordung des Radius aus. \quoteoff Eben. Das wollte ich ja damit sagen. \quoteon(2023-06-19 01:07 - zippy in Beitrag No. 13) Ein Test mit Matlab online zeigt, dass der kritische Startwert tatsächlich nicht der Radius, sondern die $x$-Komponente des Kreismittelpunkts ist. Wenn man dafür den Mittelwert von $s$ ($\approx-4\,\rm mm$) statt der $-3\,\rm mm$ aus dem Startbeitrag nimmt (und ansonsten alles so lässt wie im Startbeitrag), funktioniert der Plot problemlos wie in Beitrag Nr. 4. \quoteoff In dem Threadstart von Dirk hat ja Matlab den Mittelwert von $s$ beim Startwert von -0,003m belassen. Klares Zeichen dafür, dass die Genauigkeit nicht ausreichte. Die Höhenwerte im Nanometerbereich im Verhältnis zum Radius im Hundertmeterbereich passen gerade noch als signifikanter Unterschied in eine 64bit Double-Precision-Zahl, aber schon beim Quadrieren geht das Quadrat des Höhenwertes verloren. Rechnet Matlab intern mit 64bit? Man muss sich mal klar machen, dass wir hier von einem Kreis mit über einem halben Kilometer Durchmesser reden, und dessen Radius und Mittelpunkt Dirk berechnen will anhand eines kleinen Kreissegments von 3mm Sehnenlänge und "Höhen"werten im Nanometerbereich bei einer Genauigkeit im Zehntel-Picometer-Bereich, was nur Bruchteile eines Atomradius sind. Da würde mich jetzt echt mal der praktische Hintergrund interessieren... 😃 Ciao, Thomas


   Profil
MontyPythagoras
Senior Letzter Besuch: im letzten Quartal
Dabei seit: 13.05.2014
Mitteilungen: 3414
Wohnort: Werne
  Beitrag No.15, eingetragen 2023-06-21

Hallo zusammen, offenbar hat Dirk sein Problem gelöst, da er nicht mehr vorbei schaut, aber ich habe mir den Spaß erlaubt, mit Python und der Hochgenauigkeitsbibliothek mpmath das "echte" Optimum zu finden, wenn man die im Threadstart gegebenen Werte für bare Münze nimmt und daran einen Kreis fittet. Demnach ist beim optimalen Kreis der Radius $r=286.26551525124507$ und der Mittelpunkt bei $s_m=-0.004035703761733$. Dann habe ich in Excel die beiden Zahlenreihen in ein xy-Diagramm eingefügt, eine automatische Trendlinie hinzugefügt, diese auf "polynomisch Grad 2" gesetzt, "Formel im Diagramm anzeigen" angeklickt, Zahlenformat auf "wissenschaftlich, 15 Nachkommastellen" gesetzt, et voilà: https://matheplanet.de/matheplanet/nuke/html/uploads/c/39826_Excel_Circle_Fit.png Wenig überraschend kommt Excel auf die gleichen Werte wir ich in Beitrag #11, aber mit insgesamt nur etwa 5 Minuten Tipp- und Klickaufwand. Keine Gedanken an Startwerte, Toleranzen, Konvergenz. Und das Ergebnis ist näher an dem tatsächlichen Optimum als das Ergebnis aus #13. @zippy: wenn Du die Toleranz "reltol" von 1e-12 noch weiter runter setzt, kommt R dann noch näher ran oder ist da Ende der Fahnenstange? \quoteon(2023-06-13 18:04 - Dirk_Broemme in Beitrag No. 5) (...) und dann eine Parabel an diese skalierten Daten zu fitten und danach wieder zurückzutransformieren? Eine Parabel ist in dem Beispiel sicher eine gute Näherung für den Kreisbogen. \quoteoff Goldrichtige Idee. Natürlich ist mir klar, dass dies eine besondere Datenlage ist und die Näherung durch die Parabel nur hier sehr gut funktioniert. Aber Excel ist unterschätzt... 🙃 Ciao, Thomas


   Profil
zippy
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 24.10.2018
Mitteilungen: 4998
  Beitrag No.16, eingetragen 2023-06-21

\quoteon(2023-06-21 10:30 - MontyPythagoras in Beitrag No. 15) @zippy: wenn Du die Toleranz "reltol" von 1e-12 noch weiter runter setzt, kommt R dann noch näher ran oder ist da Ende der Fahnenstange? \quoteoff Wenn ich $\mathrm{reltol}=10^{-15}$ setze, komme ich ebenfalls auf $r=286\mathord,2652\,\rm m$. (Eine derart kleine Toleranz ergibt hier aber keinen Sinn, denn wir sollten für dieses Ergebnis nur eine Nachkommastelle ernst nehmen. Mehr signifikante Stellen geben die Eingangsdaten nicht her.)


   Profil
MontyPythagoras
Senior Letzter Besuch: im letzten Quartal
Dabei seit: 13.05.2014
Mitteilungen: 3414
Wohnort: Werne
  Beitrag No.17, eingetragen 2023-06-21

hallo zippy, \quoteon(2023-06-21 11:11 - zippy in Beitrag No. 16) (Eine derart kleine Toleranz ergibt hier aber keinen Sinn, denn wir sollten für dieses Ergebnis nur eine Nachkommastelle ernst nehmen. Mehr signifikante Stellen geben die Eingangsdaten nicht her.) \quoteoff Das ist schon richtig. Es ging mir nur um die generelle Genauigkeit des Algorithmus. Angesichts der kräftigen Daten-Ausreißer sowohl am Rand als auch in der Mitte muss man vielleicht schon die letzte Ziffer >>vor<< dem Komma in Zweifel ziehen... Ciao, Thomas


   Profil
MontyPythagoras
Senior Letzter Besuch: im letzten Quartal
Dabei seit: 13.05.2014
Mitteilungen: 3414
Wohnort: Werne
  Beitrag No.18, eingetragen 2023-06-21

... oder auch schon die zweite. Ich habe in Excel einfach mal die Ausreißer gelöscht: https://matheplanet.de/matheplanet/nuke/html/uploads/c/39826_Excel_Circle_Fit_2.png und der Radius springt von 286m auf 236m. Ob es aber legitim ist, diese Werte zu ignorieren oder nicht, müsste Dirk entscheiden. Die Unsicherheit des Fits ist jedenfalls ziemlich groß. Ciao, Thomas


   Profil
Dirk_Broemme wird per Mail über neue Antworten informiert.

Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2023 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]