|
Autor |
Fit eines Kreisbogens an Messwerte |
|
Dirk_Broemme
Wenig Aktiv  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  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  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  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  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  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  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  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  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  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  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  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  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  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  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  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  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  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  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. |
|
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]
|