\[ \def\_#1{\mathbf{#1}} \def\x{\times} \def\R{\mathbb{R}} \def\mat#1{\begin{bmatrix}#1\end{bmatrix}} \def\matr#1{\begin{bmatrix*}[r]#1\end{bmatrix*}} \]
Je dáno $m$ bodů v rovině, $\_a_1,\ldots,\_a_m\in\R^2$. Hledáme kružnici se středem $\_c\in\R^2$ a poloměrem $r\ge 0$ takovou, že součet čtverců vzdáleností bodů od kružnice je nejmenší.
Označme jako $\_x=(\_c,r)\in\R^3$ vektor parametrů kružnice. Nechť ${\rm dist}(\_x, \_a)$ je orientovaná vzdálenost bodu $\_a$ od kružnice s parametry $\_x$. Tedy $\lvert{\rm dist}(\_x, \_a)\rvert$ je vzdálenost bodu $\_a$ od kružnice, přičemž pro $\_a$ vně kružnice je ${\rm dist}(\_x,\_a)>0$ a pro $\_a$ uvnitř kružnice je ${\rm dist}(\_x,\_a)<0$. Chceme minimalizovat funkci \begin{equation} f(\_x) = \sum_{i=1}^m {\rm dist}(\_x, \_a_i)^2 \label{eq:obj} \end{equation}
d = dist(x,A)
, kde x
je vektor $3\times 1$, A
je matice $2\times m$ obsahující body $\_a_1, \_a_2, ..., \_a_m$ a d
je vektor $m\times 1$ takový, že d(i)
je orientovaná vzdálenost bodu $\_a_i$ od kružnice s parametry $\_x$.
x_new = make_GN_iter(x,A)
, která provede jednu iteraci čisté (tedy s jednotkovou délkou kroku) Gauss-Newtonovy metody.
[x_new,success] = make_LM_iter(x,A,mu)
, která provede jednu iteraci Levenberg-Marquardtovy metody (bližší popis funkcí je v jejich šablonách.)
Poznámky:
main.m
a funkci fit_circle.m
.
.mat
(bude se hodit funkce ginput
). Takto si připravte několik vhodných množin bodů, na kterých můžete zkoušet svůj kód.
print -depsc obr.eps
nebo print -dsvg obr.svg
) obrázek, ve kterém budou body $\_a_1,\ldots,\_a_m$ a dvě kružnice s parametry $\_x^1$ a $\_x^2$,
report.pdf
.m
a soubor report.pdf
do ZIP souboru a nahrajte je do Brute. Udělejte ZIP soubor tak, aby se vaše soubory rozbalily rovnou do aktuálního adresáře, ne do nějakého podadresáře (jinak to nebude fungovat.)