import%20marimo%0A%0A__generated_with%20%3D%20%220.24.0%22%0Aapp%20%3D%20marimo.App()%0A%0Awith%20app.setup%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20import%20matplotlib.pyplot%20as%20plt%0A%20%20%20%20import%20numpy%20as%20np%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%20%E6%9B%B2%E7%B7%9A%E3%83%95%E3%82%A3%E3%83%83%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%A8%20RANSAC%0A%0A%20%20%20%20%E8%A6%B3%E6%B8%AC%E7%82%B9%E3%81%B8%E6%9B%B2%E7%B7%9A%E3%82%92%E5%BD%93%E3%81%A6%E3%81%AF%E3%82%81%E3%82%8B%E5%95%8F%E9%A1%8C%E3%82%92%E3%80%81%E6%AC%A1%E3%81%AE%202%20%E8%BB%B8%E3%81%A7%E6%95%B4%E7%90%86%E3%81%97%E3%81%A6%E6%89%B1%E3%81%86%E3%80%82%0A%0A%20%20%20%20%7C%20%7C%20%E9%99%BD%E9%96%A2%E6%95%B0%20%24y%3Df(x)%24%20%7C%20%E9%99%B0%E9%96%A2%E6%95%B0%20%24f(x%2Cy)%3D0%24%20%7C%0A%20%20%20%20%7C%20---%20%7C%20---%20%7C%20---%20%7C%0A%20%20%20%20%7C%20%E5%A4%96%E3%82%8C%E5%80%A4%E3%81%AA%E3%81%97%20%7C%20%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%97%E6%B3%95%EF%BC%88%60numpy.polyfit%60%20%2F%20%60scipy.optimize%60%EF%BC%89%20%7C%20%E7%9B%B4%E4%BA%A4%E8%B7%9D%E9%9B%A2%E5%9B%9E%E5%B8%B0%EF%BC%88%60scipy.odr%60%EF%BC%89%20%7C%0A%20%20%20%20%7C%20%E5%A4%96%E3%82%8C%E5%80%A4%E3%81%82%E3%82%8A%20%7C%20RANSAC%20%EF%BC%8B%20%E5%A4%9A%E9%A0%85%E5%BC%8F%E3%83%95%E3%82%A3%E3%83%83%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%20%7C%20RANSAC%20%EF%BC%8B%20%E4%BB%A3%E6%95%B0%E7%9A%84%E5%BD%93%E3%81%A6%E3%81%AF%E3%82%81%20%7C%0A%0A%20%20%20%20%E9%99%BD%E9%96%A2%E6%95%B0%E3%81%AF%20%24y%24%20%E6%96%B9%E5%90%91%E3%81%AE%E6%AE%8B%E5%B7%AE%E3%81%A0%E3%81%91%E3%82%92%E6%B8%AC%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%E7%B8%A6%E3%81%AB%E4%BC%B8%E3%81%B3%E3%81%9F%E5%BD%A2%E3%82%84%E3%80%811%20%E3%81%A4%E3%81%AE%20%24x%24%20%E3%81%AB%E8%A4%87%E6%95%B0%E3%81%AE%20%24y%24%20%E3%81%8C%0A%20%20%20%20%E5%AF%BE%E5%BF%9C%E3%81%99%E3%82%8B%E6%9B%B2%E7%B7%9A%EF%BC%88%E5%86%86%E3%83%BB%E6%A5%95%E5%86%86%EF%BC%89%E3%82%92%E6%89%B1%E3%81%88%E3%81%AA%E3%81%84%E3%80%82%E9%99%B0%E9%96%A2%E6%95%B0%E3%81%AB%E3%81%AF%E3%81%9D%E3%81%AE%E5%88%B6%E7%B4%84%E3%81%8C%E7%84%A1%E3%81%84%E4%BB%A3%E3%82%8F%E3%82%8A%E3%81%AB%E3%80%81%E4%BF%82%E6%95%B0%E3%82%92%0A%20%20%20%20%E5%AE%9A%E6%95%B0%E5%80%8D%E3%81%97%E3%81%A6%E3%82%82%E5%90%8C%E3%81%98%E6%9B%B2%E7%B7%9A%E3%82%92%E8%A1%A8%E3%81%99%E3%81%A8%E3%81%84%E3%81%86%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%AB%E3%81%AE%E4%B8%8D%E5%AE%9A%E6%80%A7%E3%81%8C%E3%81%82%E3%82%8A%E3%80%81%24%5C%7Ca%5C%7C%3D1%24%20%E3%81%AE%E3%82%88%E3%81%86%E3%81%AA%0A%20%20%20%20%E6%AD%A3%E8%A6%8F%E5%8C%96%E3%81%8C%E5%BF%85%E8%A6%81%E3%81%AB%E3%81%AA%E3%82%8B%E3%80%82%E3%81%93%E3%81%AE%E9%81%95%E3%81%84%E3%81%8C%E3%80%81%E5%BE%8C%E5%8D%8A%E3%81%AE%E8%AA%A4%E5%B7%AE%E5%85%B1%E5%88%86%E6%95%A3%E8%A1%8C%E5%88%97%E3%81%A8%20%60scipy.odr%60%20%E3%81%AE%E8%87%AA%E6%98%8E%E8%A7%A3%E3%81%AE%0A%20%20%20%20%E8%A9%B1%E3%81%AB%E7%9B%B4%E7%B5%90%E3%81%99%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E5%90%84%E7%AF%80%E3%81%A7%E3%81%AF%E3%80%81%E6%8E%A8%E5%AE%9A%E3%81%97%E3%81%9F%E5%80%A4%E3%82%92%E7%94%9F%E6%88%90%E3%81%AB%E4%BD%BF%E3%81%A3%E3%81%9F%E7%9C%9F%E5%80%A4%E3%81%A8%E7%AA%81%E3%81%8D%E5%90%88%E3%82%8F%E3%81%9B%E3%81%A6%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20%E3%81%93%E3%81%AE%20notebook%20%E3%81%AE%E5%85%B1%E9%80%9A%E9%83%A8%E5%93%81%0A%0A%20%20%20%20%E5%86%92%E9%A0%AD%E3%81%AE%20%60with%20app.setup%60%20%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%EF%BC%88marimo%20%E4%B8%8A%E3%81%A7%E3%81%AF%E6%8A%98%E3%82%8A%E3%81%9F%E3%81%9F%E3%81%BE%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%EF%BC%89%E3%81%A7%0A%20%20%20%20%60marimo%60%20%60matplotlib.pyplot%60%20%60numpy%60%20%E3%82%92%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%93%E3%81%A7%E3%81%84%E3%82%8B%E3%80%82%60scipy%60%20%E3%81%AF%E4%BD%BF%E3%81%86%E7%AF%80%E3%81%A7%E3%81%AE%E3%81%BF%0A%20%20%20%20%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%80%E3%80%82%0A%0A%20%20%20%20%E6%AC%A1%E3%81%AE%E3%82%BB%E3%83%AB%E3%81%AF%E3%80%81%E4%BB%A5%E9%99%8D%E3%81%AE%E7%AF%80%E3%81%8C%E5%85%B1%E6%9C%89%E3%81%99%E3%82%8B%E3%83%98%E3%83%AB%E3%83%91%E3%83%BC%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%99%E3%82%8B%E3%80%82%0A%0A%20%20%20%20-%20%60show_matrix(matrix%2C%20title)%60%3A%20%E8%A1%8C%E5%88%97%E3%82%92%E3%82%AB%E3%83%A9%E3%83%BC%E3%83%90%E3%83%BC%E4%BB%98%E3%81%8D%E3%81%AE%E3%83%92%E3%83%BC%E3%83%88%E3%83%9E%E3%83%83%E3%83%97%E3%81%A7%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%20%20%E5%85%B1%E5%88%86%E6%95%A3%E8%A1%8C%E5%88%97%E3%82%84%E6%A7%8B%E9%80%A0%E8%A1%8C%E5%88%97%E3%81%AE%E7%A2%BA%E8%AA%8D%E3%81%AB%E4%BD%BF%E3%81%86%E3%80%82%0A%20%20%20%20-%20%60rotation_matrix(degrees)%60%3A%20%E5%8F%8D%E6%99%82%E8%A8%88%E5%9B%9E%E3%82%8A%E3%81%AE%202%20%E6%AC%A1%E5%85%83%E5%9B%9E%E8%BB%A2%E8%A1%8C%E5%88%97%E3%82%92%E8%BF%94%E3%81%99%E3%80%82%0A%20%20%20%20-%20%60describe_conic(params)%60%3A%20%E5%9F%BA%E5%BA%95%20%24%5Bx%5E2%2C%202xy%2C%20y%5E2%2C%202x%2C%202y%2C%201%5D%24%20%E3%81%AB%E5%AF%BE%E3%81%99%E3%82%8B%E4%BF%82%E6%95%B0%E3%81%8B%E3%82%89%E3%80%81%0A%20%20%20%20%20%20%E6%A5%95%E5%86%86%E3%81%AE%E4%B8%AD%E5%BF%83%E3%83%BB%E5%8D%8A%E8%BB%B8%E9%95%B7%E3%83%BB%E5%8D%8A%E8%BB%B8%E3%81%AE%E5%90%91%E3%81%8D%EF%BC%88%E5%BA%A6%EF%BC%89%E3%82%92%E5%BE%A9%E5%85%83%E3%81%99%E3%82%8B%E3%80%82%E6%8E%A8%E5%AE%9A%E7%B5%90%E6%9E%9C%E3%82%92%E7%9C%9F%E5%80%A4%E3%81%A8%E6%AF%94%E3%81%B9%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AB%E4%BD%BF%E3%81%86%E3%80%82%0A%20%20%20%20%20%20%E6%A5%95%E5%86%86%E3%81%AB%E3%81%AA%E3%82%89%E3%81%AA%E3%81%84%E4%BF%82%E6%95%B0%E3%81%AE%E3%81%A8%E3%81%8D%E3%81%AF%20%60None%60%20%E3%82%92%E8%BF%94%E3%81%99%E3%80%82%0A%20%20%20%20-%20%60implicit_grid(basis_func%2C%20points%2C%20params%2C%20step)%60%3A%20%E9%99%B0%E9%96%A2%E6%95%B0%20%24f(x%2Cy)%24%20%E3%81%AE%E5%80%A4%E3%82%92%E6%A0%BC%E5%AD%90%E4%B8%8A%E3%81%A7%0A%20%20%20%20%20%20%E8%A9%95%E4%BE%A1%E3%81%97%E3%80%81%60plt.contour%60%20%E3%81%B8%E6%B8%A1%E3%81%9B%E3%82%8B%203%20%E3%81%A4%E3%81%AE%E6%A0%BC%E5%AD%90%E3%82%92%E8%BF%94%E3%81%99%E3%80%82%0A%20%20%20%20-%20%60iteration_budget(inlier_ratio%2C%20sample_size%2C%20target_prob)%60%3A%20RANSAC%20%E3%81%AE%E8%A9%A6%E8%A1%8C%E5%9B%9E%E6%95%B0%E3%81%AE%0A%20%20%20%20%20%20%E7%9B%AE%E5%AE%89%E3%82%92%E8%BF%94%E3%81%99%E3%80%82%E5%BC%8F%E3%81%AE%E6%84%8F%E5%91%B3%E3%81%AF%20RANSAC%20%E3%81%AE%E7%AF%80%E3%81%A7%E8%AA%AC%E6%98%8E%E3%81%99%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E4%B9%B1%E6%95%B0%E3%81%AF%E3%80%81%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B%E3%82%BB%E3%83%AB%E3%81%94%E3%81%A8%E3%81%AB%20%60np.random.default_rng(seed)%60%20%E3%81%A7%E7%94%9F%E6%88%90%E5%99%A8%E3%82%92%E4%BD%9C%E3%82%8B%E3%80%82%0A%20%20%20%20marimo%20%E3%81%AF%E3%82%BB%E3%83%AB%E3%82%92%E4%BE%9D%E5%AD%98%E3%82%B0%E3%83%A9%E3%83%95%E3%81%AE%E9%A0%86%E3%81%AB%E3%80%81%E5%BF%85%E8%A6%81%E3%81%AA%E3%82%82%E3%81%AE%E3%81%A0%E3%81%91%E5%86%8D%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%60np.random.seed%60%0A%20%20%20%20%E3%81%AB%E3%82%88%E3%82%8B%E5%A4%A7%E5%9F%9F%E7%9A%84%E3%81%AA%E7%A8%AE%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%81%A7%E3%81%AF%E5%AE%9F%E8%A1%8C%E3%81%AE%E3%81%9F%E3%81%B3%E3%81%AB%E7%B5%90%E6%9E%9C%E3%81%8C%E5%A4%89%E3%82%8F%E3%82%8A%E3%81%86%E3%82%8B%E3%81%8B%E3%82%89%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20def%20show_matrix(matrix%2C%20title)%3A%0A%20%20%20%20%20%20%20%20%22%22%22%E8%A1%8C%E5%88%97%E3%82%92%E3%83%92%E3%83%BC%E3%83%88%E3%83%9E%E3%83%83%E3%83%97%E3%81%A7%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%20%20%20%20%3Aparam%20matrix%3A%20%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%202%20%E6%AC%A1%E5%85%83%E9%85%8D%E5%88%97%0A%20%20%20%20%20%20%20%20%3Aparam%20title%3A%20%E5%9B%B3%E3%81%AE%E3%82%BF%E3%82%A4%E3%83%88%E3%83%AB%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20figure%2C%20axes%20%3D%20plt.subplots(figsize%3D(4.2%2C%203.4))%0A%20%20%20%20%20%20%20%20image%20%3D%20axes.imshow(matrix)%0A%20%20%20%20%20%20%20%20axes.set_title(title)%0A%20%20%20%20%20%20%20%20figure.colorbar(image%2C%20ax%3Daxes)%0A%20%20%20%20%20%20%20%20figure.tight_layout()%0A%20%20%20%20%20%20%20%20plt.show()%0A%0A%20%20%20%20def%20rotation_matrix(degrees)%3A%0A%20%20%20%20%20%20%20%20%22%22%22%E5%8F%8D%E6%99%82%E8%A8%88%E5%9B%9E%E3%82%8A%E3%81%AE%E5%9B%9E%E8%BB%A2%E8%A1%8C%E5%88%97%E3%82%92%E8%BF%94%E3%81%99%E3%80%82%0A%0A%20%20%20%20%20%20%20%20%3Aparam%20degrees%3A%20%E5%9B%9E%E8%BB%A2%E8%A7%92%EF%BC%88%E5%BA%A6%EF%BC%89%0A%20%20%20%20%20%20%20%20%3Areturn%3A%20%E5%BD%A2%E7%8A%B6%20(2%2C%202)%20%E3%81%AE%E5%9B%9E%E8%BB%A2%E8%A1%8C%E5%88%97%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20radians%20%3D%20np.deg2rad(degrees)%0A%20%20%20%20%20%20%20%20return%20np.array(%0A%20%20%20%20%20%20%20%20%20%20%20%20%5B%5Bnp.cos(radians)%2C%20-np.sin(radians)%5D%2C%20%5Bnp.sin(radians)%2C%20np.cos(radians)%5D%5D%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20def%20describe_conic(params)%3A%0A%20%20%20%20%20%20%20%20%22%22%22%E5%86%86%E9%8C%90%E6%9B%B2%E7%B7%9A%E3%81%AE%E4%BF%82%E6%95%B0%E3%81%8B%E3%82%89%E4%B8%AD%E5%BF%83%E3%83%BB%E5%8D%8A%E8%BB%B8%E9%95%B7%E3%83%BB%E5%8D%8A%E8%BB%B8%E3%81%AE%E5%90%91%E3%81%8D%E3%82%92%E5%BE%A9%E5%85%83%E3%81%99%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%20%20%20%20%3Aparam%20params%3A%20%E5%9F%BA%E5%BA%95%20%5Bx%5E2%2C%202xy%2C%20y%5E2%2C%202x%2C%202y%2C%201%5D%20%E3%81%AB%E5%AF%BE%E3%81%99%E3%82%8B%E4%BF%82%E6%95%B0%20(6%2C)%0A%20%20%20%20%20%20%20%20%3Areturn%3A%20(%E4%B8%AD%E5%BF%83%20(2%2C)%2C%20%E5%8D%8A%E8%BB%B8%E9%95%B7%20(2%2C)%2C%20%E5%8D%8A%E8%BB%B8%E3%81%AE%E5%90%91%E3%81%8D%20%5B%E5%BA%A6%5D%20(2%2C))%E3%80%82%E6%A5%95%E5%86%86%E3%81%A7%E3%81%AA%E3%81%91%E3%82%8C%E3%81%B0%20None%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20coeff_a%2C%20coeff_b%2C%20coeff_c%2C%20coeff_d%2C%20coeff_e%2C%20coeff_f%20%3D%20params%0A%20%20%20%20%20%20%20%20quadratic%20%3D%20np.array(%5B%5Bcoeff_a%2C%20coeff_b%5D%2C%20%5Bcoeff_b%2C%20coeff_c%5D%5D)%0A%20%20%20%20%20%20%20%20if%20np.isclose(np.linalg.det(quadratic)%2C%200.0)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20None%0A%20%20%20%20%20%20%20%20center%20%3D%20np.linalg.solve(quadratic%2C%20-np.array(%5Bcoeff_d%2C%20coeff_e%5D))%0A%20%20%20%20%20%20%20%20constant%20%3D%20coeff_f%20%2B%20coeff_d%20*%20center%5B0%5D%20%2B%20coeff_e%20*%20center%5B1%5D%0A%20%20%20%20%20%20%20%20values%2C%20vectors%20%3D%20np.linalg.eigh(quadratic)%0A%20%20%20%20%20%20%20%20if%20np.any(-constant%20%2F%20values%20%3C%3D%200.0)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20None%0A%20%20%20%20%20%20%20%20semi_axes%20%3D%20np.sqrt(-constant%20%2F%20values)%0A%20%20%20%20%20%20%20%20angles%20%3D%20np.degrees(np.arctan2(vectors%5B1%5D%2C%20vectors%5B0%5D))%0A%20%20%20%20%20%20%20%20%23%20%E5%8D%8A%E8%BB%B8%E3%81%AE%E5%90%91%E3%81%8D%E3%81%AF%20180%20%E5%BA%A6%E3%81%AE%E5%91%A8%E6%9C%9F%E3%82%92%E6%8C%81%E3%81%A4%E3%81%AE%E3%81%A7%20(-90%2C%2090%5D%20%E3%81%B8%E7%95%B3%E3%82%80%E3%80%82%0A%20%20%20%20%20%20%20%20return%20center%2C%20semi_axes%2C%20(angles%20%2B%2090.0)%20%25%20180.0%20-%2090.0%0A%0A%20%20%20%20def%20implicit_grid(basis_func%2C%20points%2C%20params%2C%20step%3D0.01)%3A%0A%20%20%20%20%20%20%20%20%22%22%22%E9%99%B0%E9%96%A2%E6%95%B0%E3%81%AE%E5%80%A4%E3%82%92%E7%82%B9%E7%BE%A4%E3%81%AE%E5%A4%96%E6%8E%A5%E7%9F%A9%E5%BD%A2%E4%B8%8A%E3%81%AE%E6%A0%BC%E5%AD%90%E3%81%A7%E8%A9%95%E4%BE%A1%E3%81%99%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%20%20%20%20%3Aparam%20basis_func%3A%20%E5%9F%BA%E5%BA%95%E9%96%A2%E6%95%B0%0A%20%20%20%20%20%20%20%20%3Aparam%20points%3A%20%E5%BD%A2%E7%8A%B6%20(N%2C%202)%20%E3%81%AE%E7%82%B9%E7%BE%A4%E3%80%82%E6%A0%BC%E5%AD%90%E3%81%AE%E7%AF%84%E5%9B%B2%E3%82%92%E6%B1%BA%E3%82%81%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AB%E4%BD%BF%E3%81%86%0A%20%20%20%20%20%20%20%20%3Aparam%20params%3A%20%E5%9F%BA%E5%BA%95%E3%81%AB%E5%AF%BE%E3%81%99%E3%82%8B%E4%BF%82%E6%95%B0%0A%20%20%20%20%20%20%20%20%3Aparam%20step%3A%20%E6%A0%BC%E5%AD%90%E3%81%AE%E5%88%BB%E3%81%BF%E5%B9%85%0A%20%20%20%20%20%20%20%20%3Areturn%3A%20(x%20%E6%A0%BC%E5%AD%90%2C%20y%20%E6%A0%BC%E5%AD%90%2C%20%E9%99%B0%E9%96%A2%E6%95%B0%E3%81%AE%E5%80%A4%E3%81%AE%E6%A0%BC%E5%AD%90)%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20x_range%20%3D%20np.arange(points%5B%3A%2C%200%5D.min()%2C%20points%5B%3A%2C%200%5D.max()%2C%20step)%0A%20%20%20%20%20%20%20%20y_range%20%3D%20np.arange(points%5B%3A%2C%201%5D.min()%2C%20points%5B%3A%2C%201%5D.max()%2C%20step)%0A%20%20%20%20%20%20%20%20x_mesh%2C%20y_mesh%20%3D%20np.meshgrid(x_range%2C%20y_range)%0A%20%20%20%20%20%20%20%20bases%20%3D%20np.array(%0A%20%20%20%20%20%20%20%20%20%20%20%20%5Bbasis%20*%20np.ones_like(x_mesh)%20for%20basis%20in%20basis_func((x_mesh%2C%20y_mesh))%5D%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20return%20x_mesh%2C%20y_mesh%2C%20np.einsum(%22i%2Cijk-%3Ejk%22%2C%20params%2C%20bases)%0A%0A%20%20%20%20def%20iteration_budget(inlier_ratio%2C%20sample_size%2C%20target_prob%3D0.9999%2C%20cap%3D100000)%3A%0A%20%20%20%20%20%20%20%20%22%22%22RANSAC%20%E3%81%AE%E8%A9%A6%E8%A1%8C%E5%9B%9E%E6%95%B0%E3%81%AE%E7%9B%AE%E5%AE%89%20N%20%3D%20ln(1-p)%20%2F%20ln(1-e%5En)%20%E3%82%92%E8%BF%94%E3%81%99%E3%80%82%0A%0A%20%20%20%20%20%20%20%20%3Aparam%20inlier_ratio%3A%201%20%E7%82%B9%E3%82%92%E5%BC%95%E3%81%84%E3%81%9F%E3%81%A8%E3%81%8D%E3%81%AB%20inlier%20%E3%81%A7%E3%81%82%E3%82%8B%E7%A2%BA%E7%8E%87%20e%0A%20%20%20%20%20%20%20%20%3Aparam%20sample_size%3A%201%20%E5%9B%9E%E3%81%AE%E8%A9%A6%E8%A1%8C%E3%81%A7%E5%BC%95%E3%81%8F%E7%82%B9%E6%95%B0%20n%0A%20%20%20%20%20%20%20%20%3Aparam%20target_prob%3A%20RANSAC%20%E3%82%92%E6%88%90%E5%8A%9F%E3%81%95%E3%81%9B%E3%81%9F%E3%81%84%E7%A2%BA%E7%8E%87%20p%0A%20%20%20%20%20%20%20%20%3Aparam%20cap%3A%20%E8%A9%A6%E8%A1%8C%E5%9B%9E%E6%95%B0%E3%81%AE%E4%B8%8A%E9%99%90%0A%20%20%20%20%20%20%20%20%3Areturn%3A%20%E8%A9%A6%E8%A1%8C%E5%9B%9E%E6%95%B0%EF%BC%881%20%E4%BB%A5%E4%B8%8A%20cap%20%E4%BB%A5%E4%B8%8B%E3%81%AE%E6%95%B4%E6%95%B0%EF%BC%89%E3%80%82cap%20%E3%81%AB%E9%81%94%E3%81%97%E3%81%AA%E3%81%84%E9%99%90%E3%82%8A%E3%80%81%E7%9B%AE%E6%A8%99%E7%A2%BA%E7%8E%87%E3%82%92%0A%20%20%20%20%20%20%20%20%20%20%20%20%E4%B8%8B%E5%9B%9E%E3%82%89%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%E5%88%87%E3%82%8A%E4%B8%8A%E3%81%92%E3%82%8B%E3%80%82cap%20%E3%81%A7%E6%89%93%E3%81%A1%E5%88%87%E3%81%A3%E3%81%9F%E5%A0%B4%E5%90%88%E3%81%AF%E7%9B%AE%E6%A8%99%E7%A2%BA%E7%8E%87%E3%82%92%E4%BF%9D%E8%A8%BC%E3%81%97%E3%81%AA%E3%81%84%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20failure_prob%20%3D%201.0%20-%20inlier_ratio**sample_size%0A%20%20%20%20%20%20%20%20if%20failure_prob%20%3C%3D%200.0%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E5%85%A8%E7%82%B9%E3%81%8C%20inlier%20%E3%81%AA%E3%82%89%201%20%E5%9B%9E%E5%BC%95%E3%81%91%E3%81%B0%E5%8D%81%E5%88%86%E3%80%82%0A%20%20%20%20%20%20%20%20%20%20%20%20return%201%0A%20%20%20%20%20%20%20%20if%20np.isclose(failure_prob%2C%201.0)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20inlier%20%E7%8E%87%E3%81%8C%E4%BD%8E%E3%81%99%E3%81%8E%E3%81%A6%E5%BC%8F%E3%81%8C%E7%99%BA%E6%95%A3%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AF%E4%B8%8A%E9%99%90%E3%81%A7%E6%89%93%E3%81%A1%E5%88%87%E3%82%8B%E3%80%82%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20cap%0A%20%20%20%20%20%20%20%20exact%20%3D%20np.log(1.0%20-%20target_prob)%20%2F%20np.log(failure_prob)%0A%20%20%20%20%20%20%20%20return%20int(np.clip(np.ceil(exact)%2C%201%2C%20cap))%0A%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20describe_conic%2C%0A%20%20%20%20%20%20%20%20implicit_grid%2C%0A%20%20%20%20%20%20%20%20iteration_budget%2C%0A%20%20%20%20%20%20%20%20rotation_matrix%2C%0A%20%20%20%20%20%20%20%20show_matrix%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20%E5%A4%96%E3%82%8C%E5%80%A4%E3%81%AA%E3%81%97%E3%81%AE%E3%83%95%E3%82%A3%E3%83%83%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%0A%0A%20%20%20%20%23%23%23%20%E9%99%BD%E9%96%A2%E6%95%B0%E3%81%AE%E5%A0%B4%E5%90%88%0A%0A%20%20%20%20%E8%A6%B3%E6%B8%AC%E3%82%92%20%24y_i%20%3D%20f(x_i%3B%20a)%20%2B%20%5Cvarepsilon_i%24%20%E3%81%A8%E7%BD%AE%E3%81%8D%E3%80%81%E4%BF%82%E6%95%B0%20%24a%24%20%E3%82%92%E6%AE%8B%E5%B7%AE%E4%BA%8C%E4%B9%97%E5%92%8C%E3%81%AE%E6%9C%80%E5%B0%8F%E5%8C%96%E3%81%A7%0A%20%20%20%20%E6%B1%BA%E3%82%81%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%24%24%0A%20%20%20%20%5Chat%7Ba%7D%20%3D%20%5Carg%5Cmin_%7Ba%7D%20%5Csum_%7Bi%3D1%7D%5E%7BN%7D%20%5Cbigl(%20y_i%20-%20f(x_i%3B%20a)%20%5Cbigr)%5E2%0A%20%20%20%20%24%24%0A%0A%20%20%20%20%24f%24%20%E3%81%8C%E4%BF%82%E6%95%B0%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E7%B7%9A%E5%BD%A2%E3%81%AA%E5%A4%9A%E9%A0%85%E5%BC%8F%E3%81%AA%E3%82%89%E3%80%81%E8%A8%88%E7%94%BB%E8%A1%8C%E5%88%97%20%24X_%7Bij%7D%20%3D%20x_i%5E%7B%5C%2Cm-j%7D%24%20%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%0A%20%20%20%20%E6%AD%A3%E8%A6%8F%E6%96%B9%E7%A8%8B%E5%BC%8F%20%24X%5E%5Ctop%20X%20a%20%3D%20X%5E%5Ctop%20y%24%20%E3%82%92%E8%A7%A3%E3%81%8F%E3%81%A0%E3%81%91%E3%81%A7%E9%96%89%E3%81%98%E3%81%9F%E5%BD%A2%E3%81%A7%E6%B1%82%E3%81%BE%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E6%A4%9C%E8%A8%BC%E7%94%A8%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AF%202%20%E6%AC%A1%E9%96%A2%E6%95%B0%E3%81%AB%E6%AD%A3%E8%A6%8F%E5%88%86%E5%B8%83%E3%81%AE%E8%AA%A4%E5%B7%AE%E3%82%92%E8%B6%B3%E3%81%97%E3%81%A6%E4%BD%9C%E3%82%8B%E3%80%82%E7%9C%9F%E3%81%AE%E4%BF%82%E6%95%B0%E3%81%AF%0A%20%20%20%20%24(a%2C%20b%2C%20c)%20%3D%20(1%2C%200%2C%200)%24%E3%80%81%E8%AA%A4%E5%B7%AE%E3%81%AE%E6%A8%99%E6%BA%96%E5%81%8F%E5%B7%AE%E3%81%AF%20%240.2%24%20%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20quad_sample_size%20%3D%201000%0A%20%20%20%20quad_true_coeffs%20%3D%20np.array(%5B1.0%2C%200.0%2C%200.0%5D)%0A%20%20%20%20quad_noise_sd%20%3D%200.2%0A%20%20%20%20_rng%20%3D%20np.random.default_rng(0)%0A%20%20%20%20quad_x%20%3D%20np.linspace(0%2C%2010%2C%20quad_sample_size)%0A%20%20%20%20quad_y%20%3D%20np.polyval(quad_true_coeffs%2C%20quad_x)%20%2B%20_rng.normal(%0A%20%20%20%20%20%20%20%200.0%2C%20quad_noise_sd%2C%20quad_sample_size%0A%20%20%20%20)%0A%20%20%20%20quad_points%20%3D%20np.vstack(%5Bquad_x%2C%20quad_y%5D).T%0A%20%20%20%20plt.scatter(quad_x%2C%20quad_y%2C%20s%3D0.5)%0A%20%20%20%20plt.xlim(0%2C%203.5)%0A%20%20%20%20plt.ylim(-1%2C%2011)%0A%20%20%20%20plt.xlabel(%22x%22)%0A%20%20%20%20plt.ylabel(%22y%22)%0A%20%20%20%20plt.title(f%22y%20%3D%20x%5E2%20%2B%20N(0%2C%20%7Bquad_noise_sd%7D%5E2)%2C%20%7Bquad_sample_size%7D%20points%22)%0A%20%20%20%20plt.show()%0A%20%20%20%20return%20quad_points%2C%20quad_sample_size%2C%20quad_true_coeffs%2C%20quad_x%2C%20quad_y%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E4%BB%A3%E8%A1%A8%E7%9A%84%E3%81%AA%20API%20%E3%81%AF%E6%AC%A1%E3%81%AE%203%20%E3%81%A4%E3%81%A7%E3%80%81%E3%81%84%E3%81%9A%E3%82%8C%E3%82%82%E5%90%8C%E3%81%98%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%97%E8%A7%A3%E3%81%B8%E5%88%B0%E9%81%94%E3%81%99%E3%82%8B%E3%81%8C%E3%80%81%E6%89%B1%E3%81%88%E3%82%8B%0A%20%20%20%20%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E7%AF%84%E5%9B%B2%E3%81%A8%E5%85%B1%E5%88%86%E6%95%A3%E8%A1%8C%E5%88%97%E3%81%AE%E6%AD%A3%E8%A6%8F%E5%8C%96%E3%81%AE%E8%A6%8F%E7%B4%84%E3%81%8C%E7%95%B0%E3%81%AA%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%7C%20%E9%96%A2%E6%95%B0%20%7C%20%E5%BD%93%E3%81%A6%E3%81%AF%E3%82%81%E3%82%89%E3%82%8C%E3%82%8B%E3%83%A2%E3%83%87%E3%83%AB%20%7C%20%E5%85%B1%E5%88%86%E6%95%A3%E8%A1%8C%E5%88%97%20%7C%0A%20%20%20%20%7C%20---%20%7C%20---%20%7C%20---%20%7C%0A%20%20%20%20%7C%20%5B%60numpy.polyfit%60%5D(https%3A%2F%2Fnumpy.org%2Fdoc%2Fstable%2Freference%2Fgenerated%2Fnumpy.polyfit.html)%20%7C%20%E5%A4%9A%E9%A0%85%E5%BC%8F%E3%81%AE%E3%81%BF%20%7C%20%60cov%3DTrue%60%20%E3%81%A7%20%24%5Cchi%5E2%2F(N-m)%24%20%E5%80%8D%E6%B8%88%E3%81%BF%E3%81%AE%E5%80%A4%E3%82%92%E8%BF%94%E3%81%99%20%7C%0A%20%20%20%20%7C%20%5B%60scipy.optimize.curve_fit%60%5D(https%3A%2F%2Fdocs.scipy.org%2Fdoc%2Fscipy%2Freference%2Fgenerated%2Fscipy.optimize.curve_fit.html)%20%7C%20%24y%3Df(x%2C%20a)%24%20%E3%81%AE%E5%BD%A2%E3%81%AA%E3%82%89%E4%BB%BB%E6%84%8F%20%7C%20%E6%97%A2%E5%AE%9A%EF%BC%88%60absolute_sigma%3DFalse%60%EF%BC%89%E3%81%A7%E5%90%8C%E3%81%98%E6%AD%A3%E8%A6%8F%E5%8C%96%20%7C%0A%20%20%20%20%7C%20%5B%60scipy.optimize.leastsq%60%5D(https%3A%2F%2Fdocs.scipy.org%2Fdoc%2Fscipy%2Freference%2Fgenerated%2Fscipy.optimize.leastsq.html)%20%7C%20%E6%AE%8B%E5%B7%AE%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%82%92%E8%87%AA%E5%88%86%E3%81%A7%E6%9B%B8%E3%81%8F%20%7C%20%60cov_x%60%20%E3%81%AF%E6%AD%A3%E8%A6%8F%E5%8C%96%E5%89%8D%E3%81%AE%20%24(X%5E%5Ctop%20X)%5E%7B-1%7D%24%20%7C%0A%0A%20%20%20%20%E3%81%93%E3%81%93%E3%81%A7%20%24m%24%20%E3%81%AF%E4%BF%82%E6%95%B0%E3%81%AE%E6%95%B0%E3%80%81%24%5Cchi%5E2%24%20%E3%81%AF%E6%AE%8B%E5%B7%AE%E4%BA%8C%E4%B9%97%E5%92%8C%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%60leastsq%60%20%E3%81%AE%20%60cov_x%60%20%E3%81%A0%E3%81%91%E3%81%AF%0A%20%20%20%20%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%AB%E3%81%8C%E9%81%95%E3%81%86%E3%81%AE%E3%81%A7%E3%80%81%E4%BB%96%E3%81%A8%E6%AF%94%E3%81%B9%E3%82%8B%E3%81%AB%E3%81%AF%20%24%5Cchi%5E2%2F(N-m)%24%20%E3%82%92%E6%8E%9B%E3%81%91%E3%82%8B%E5%BF%85%E8%A6%81%E3%81%8C%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%E3%81%93%E3%81%AE%203%20%E7%82%B9%E3%81%AF%E5%BE%8C%E3%81%AE%E3%82%BB%E3%83%AB%E3%81%A7%E5%AE%9F%E9%9A%9B%E3%81%AB%E7%AA%81%E3%81%8D%E5%90%88%E3%82%8F%E3%81%9B%E3%81%A6%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%23%20numpy.polyfit%20%E3%82%92%E4%BD%BF%E3%81%86%E6%96%B9%E6%B3%95%0A%0A%20%20%20%20%E5%A4%9A%E9%A0%85%E5%BC%8F%E3%81%AB%E9%99%90%E3%82%8C%E3%81%B0%E6%9C%80%E3%82%82%E7%B0%A1%E4%BE%BF%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%60deg%60%20%E3%81%AB%E6%AC%A1%E6%95%B0%E3%80%81%60cov%3DTrue%60%20%E3%81%AB%E6%8C%87%E5%AE%9A%E3%81%99%E3%82%8B%E3%81%A8%E4%BF%82%E6%95%B0%E3%81%A8%0A%20%20%20%20%E5%85%B1%E5%88%86%E6%95%A3%E8%A1%8C%E5%88%97%E3%82%92%E8%BF%94%E3%81%99%E3%80%82%E5%85%B1%E5%88%86%E6%95%A3%E8%A1%8C%E5%88%97%E3%81%AE%E5%AF%BE%E8%A7%92%E6%88%90%E5%88%86%E3%81%8C%E5%90%84%E4%BF%82%E6%95%B0%E3%81%AE%E5%88%86%E6%95%A3%E3%81%A7%E3%80%81%24x%5E2%24%20%E3%81%AE%E4%BF%82%E6%95%B0%E3%81%BB%E3%81%A9%0A%20%20%20%20%E5%B0%8F%E3%81%95%E3%81%8F%E3%80%81%E5%AE%9A%E6%95%B0%E9%A0%85%E3%81%BB%E3%81%A9%E5%A4%A7%E3%81%8D%E3%81%84%E3%80%82%24x%5E2%24%20%E3%81%AE%E9%A0%85%E3%81%AF%20%24x%24%20%E3%81%8C%E5%A4%A7%E3%81%8D%E3%81%84%E9%A0%98%E5%9F%9F%E3%81%A7%E5%80%A4%E3%81%8C%E5%A4%A7%E3%81%8D%E3%81%8F%E5%8A%B9%E3%81%8F%E3%81%9F%E3%82%81%E3%80%81%0A%20%20%20%20%E5%90%8C%E3%81%98%E8%A6%B3%E6%B8%AC%E8%AA%A4%E5%B7%AE%E3%81%A7%E3%82%82%E4%BF%82%E6%95%B0%E3%81%8C%E5%8B%95%E3%81%8F%E4%BD%99%E5%9C%B0%E3%81%8C%E5%B0%8F%E3%81%95%E3%81%84%E3%81%8B%E3%82%89%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(quad_true_coeffs%2C%20quad_x%2C%20quad_y%2C%20show_matrix)%3A%0A%20%20%20%20polyfit_coeffs%2C%20polyfit_cov%20%3D%20np.polyfit(quad_x%2C%20quad_y%2C%20deg%3D2%2C%20cov%3DTrue)%0A%20%20%20%20print(f%22%E6%8E%A8%E5%AE%9A%E4%BF%82%E6%95%B0%20(a%2C%20b%2C%20c)%20%3D%20%7Bnp.round(polyfit_coeffs%2C%206)%7D%22)%0A%20%20%20%20print(f%22%E7%9C%9F%E3%81%AE%E4%BF%82%E6%95%B0%20(a%2C%20b%2C%20c)%20%3D%20%7Bquad_true_coeffs%7D%22)%0A%20%20%20%20print(f%22%E4%BF%82%E6%95%B0%E3%81%AE%E6%A8%99%E6%BA%96%E5%81%8F%E5%B7%AE%20%20%20%20%20%3D%20%7Bnp.round(np.sqrt(np.diag(polyfit_cov))%2C%206)%7D%22)%0A%20%20%20%20show_matrix(polyfit_cov%2C%20%22numpy.polyfit%20covariance%22)%0A%20%20%20%20return%20polyfit_coeffs%2C%20polyfit_cov%0A%0A%0A%40app.cell%0Adef%20_(polyfit_coeffs%2C%20quad_x%2C%20quad_y)%3A%0A%20%20%20%20plt.scatter(quad_x%2C%20quad_y%2C%20s%3D0.5%2C%20label%3D%22observation%22)%0A%20%20%20%20plt.plot(quad_x%2C%20np.polyval(polyfit_coeffs%2C%20quad_x)%2C%20color%3D%22orange%22%2C%20label%3D%22polyfit%22)%0A%20%20%20%20plt.xlim(0%2C%203.5)%0A%20%20%20%20plt.ylim(-1%2C%2011)%0A%20%20%20%20plt.xlabel(%22x%22)%0A%20%20%20%20plt.ylabel(%22y%22)%0A%20%20%20%20plt.legend()%0A%20%20%20%20plt.show()%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%23%20scipy.optimize.curve_fit%20%E3%82%92%E4%BD%BF%E3%81%86%E6%96%B9%E6%B3%95%0A%0A%20%20%20%20%60numpy.polyfit%60%20%E3%81%A8%E9%81%95%E3%81%84%E3%80%81%E3%83%A2%E3%83%87%E3%83%AB%E9%96%A2%E6%95%B0%20%24f(x%2C%20a)%24%20%E3%82%92%E8%87%AA%E5%88%86%E3%81%A7%E6%9B%B8%E3%81%91%E3%82%8B%E3%81%AE%E3%81%A7%E5%A4%9A%E9%A0%85%E5%BC%8F%E4%BB%A5%E5%A4%96%E3%82%82%0A%20%20%20%20%E5%BD%93%E3%81%A6%E3%81%AF%E3%82%81%E3%82%89%E3%82%8C%E3%82%8B%E3%80%82%E3%81%93%E3%81%93%E3%81%A7%E3%81%AF%E6%AF%94%E8%BC%83%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AB%E5%90%8C%E3%81%98%202%20%E6%AC%A1%E9%96%A2%E6%95%B0%E3%82%92%E6%B8%A1%E3%81%99%E3%80%82%E5%86%85%E9%83%A8%E3%81%AF%E9%9D%9E%E7%B7%9A%E5%BD%A2%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%97%0A%20%20%20%20%EF%BC%88Levenberg-Marquardt%20%E7%B3%BB%EF%BC%89%E3%81%A0%E3%81%8C%E3%80%81%E3%83%A2%E3%83%87%E3%83%AB%E3%81%8C%E4%BF%82%E6%95%B0%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E7%B7%9A%E5%BD%A2%E3%81%AA%E3%81%AE%E3%81%A7%20%60polyfit%60%20%E3%81%A8%0A%20%20%20%20%E5%90%8C%E3%81%98%E8%A7%A3%E3%81%B8%E5%8F%8E%E6%9D%9F%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(polyfit_coeffs%2C%20polyfit_cov%2C%20quad_x%2C%20quad_y%2C%20show_matrix)%3A%0A%20%20%20%20import%20scipy.optimize%20as%20spo%0A%0A%20%20%20%20def%20quad_model(x%2C%20coeff_a%2C%20coeff_b%2C%20coeff_c)%3A%0A%20%20%20%20%20%20%20%20%22%22%222%20%E6%AC%A1%E9%96%A2%E6%95%B0%20y%20%3D%20a%20x%5E2%20%2B%20b%20x%20%2B%20c%E3%80%82curve_fit%20%E3%81%B8%E6%B8%A1%E3%81%99%E3%83%A2%E3%83%87%E3%83%AB%E9%96%A2%E6%95%B0%E3%80%82%22%22%22%0A%20%20%20%20%20%20%20%20return%20coeff_a%20*%20x**2%20%2B%20coeff_b%20*%20x%20%2B%20coeff_c%0A%0A%20%20%20%20curve_fit_coeffs%2C%20curve_fit_cov%20%3D%20spo.curve_fit(quad_model%2C%20quad_x%2C%20quad_y)%0A%20%20%20%20print(f%22%E6%8E%A8%E5%AE%9A%E4%BF%82%E6%95%B0%20%3D%20%7Bnp.round(curve_fit_coeffs%2C%206)%7D%22)%0A%20%20%20%20print(f%22polyfit%20%E3%81%A8%E3%81%AE%E4%BF%82%E6%95%B0%E3%81%AE%E6%9C%80%E5%A4%A7%E5%B7%AE%20%20%20%3D%20%7Bnp.max(np.abs(curve_fit_coeffs%20-%20polyfit_coeffs))%3A.3e%7D%22)%0A%20%20%20%20print(f%22polyfit%20%E3%81%A8%E3%81%AE%E5%85%B1%E5%88%86%E6%95%A3%E3%81%AE%E6%9C%80%E5%A4%A7%E5%B7%AE%20%3D%20%7Bnp.max(np.abs(curve_fit_cov%20-%20polyfit_cov))%3A.3e%7D%22)%0A%20%20%20%20show_matrix(curve_fit_cov%2C%20%22scipy.optimize.curve_fit%20covariance%22)%0A%20%20%20%20return%20curve_fit_coeffs%2C%20quad_model%2C%20spo%0A%0A%0A%40app.cell%0Adef%20_(curve_fit_coeffs%2C%20quad_model%2C%20quad_x%2C%20quad_y)%3A%0A%20%20%20%20plt.scatter(quad_x%2C%20quad_y%2C%20s%3D0.5%2C%20label%3D%22observation%22)%0A%20%20%20%20plt.plot(quad_x%2C%20quad_model(quad_x%2C%20*curve_fit_coeffs)%2C%20color%3D%22orange%22%2C%20label%3D%22curve_fit%22)%0A%20%20%20%20plt.xlim(0%2C%203.5)%0A%20%20%20%20plt.ylim(-1%2C%2011)%0A%20%20%20%20plt.xlabel(%22x%22)%0A%20%20%20%20plt.ylabel(%22y%22)%0A%20%20%20%20plt.legend()%0A%20%20%20%20plt.show()%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%23%20scipy.optimize.leastsq%20%E3%82%92%E4%BD%BF%E3%81%86%E6%96%B9%E6%B3%95%0A%0A%20%20%20%20%E6%AE%8B%E5%B7%AE%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%81%9D%E3%81%AE%E3%82%82%E3%81%AE%E3%82%92%E6%B8%A1%E3%81%99%E5%BD%A2%E3%81%AA%E3%81%AE%E3%81%A7%E3%80%81%E4%BA%8C%E4%B9%97%E5%92%8C%E4%BB%A5%E5%A4%96%E3%81%AE%E9%87%8D%E3%81%BF%E4%BB%98%E3%81%91%E3%82%84%E3%80%81%24x%24%20%E3%81%A8%20%24y%24%20%E3%82%92%0A%20%20%20%20%E5%AF%BE%E7%AD%89%E3%81%AB%E6%89%B1%E3%81%86%E6%AE%8B%E5%B7%AE%E3%82%82%E6%9B%B8%E3%81%91%E3%82%8B%E3%80%82%E8%BF%94%E3%82%8A%E5%80%A4%E3%81%AF%20%60full_output%3DTrue%60%20%E3%81%AE%E3%81%A8%E3%81%8D%0A%20%20%20%20%60(%E4%BF%82%E6%95%B0%2C%20cov_x%2C%20infodict%2C%20mesg%2C%20ier)%60%20%E3%81%AE%205%20%E8%A6%81%E7%B4%A0%E3%81%AE%E3%82%BF%E3%83%97%E3%83%AB%E3%81%A7%E3%80%81%60cov_x%60%20%E3%81%AF%E6%AD%A3%E8%A6%8F%E5%8C%96%E5%89%8D%E3%81%AE%0A%20%20%20%20%E5%85%B1%E5%88%86%E6%95%A3%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E6%AC%A1%E3%81%AE%E3%82%BB%E3%83%AB%E3%81%A7%E3%81%AF%20%60cov_x%60%20%E3%81%AB%20%24%5Cchi%5E2%2F(N-m)%24%20%E3%82%92%E6%8E%9B%E3%81%91%E3%80%81%60polyfit%60%20%E3%81%AE%E5%85%B1%E5%88%86%E6%95%A3%E3%81%A8%E4%B8%80%E8%87%B4%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%0A%20%20%20%20%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20polyfit_cov%2C%0A%20%20%20%20quad_model%2C%0A%20%20%20%20quad_points%2C%0A%20%20%20%20quad_sample_size%2C%0A%20%20%20%20show_matrix%2C%0A%20%20%20%20spo%2C%0A)%3A%0A%20%20%20%20def%20quad_residuals(coeffs%2C%20points)%3A%0A%20%20%20%20%20%20%20%20%22%22%222%20%E6%AC%A1%E9%96%A2%E6%95%B0%E3%81%AE%20y%20%E6%96%B9%E5%90%91%E6%AE%8B%E5%B7%AE%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%82%92%E8%BF%94%E3%81%99%E3%80%82%0A%0A%20%20%20%20%20%20%20%20%3Aparam%20coeffs%3A%20%E4%BF%82%E6%95%B0%20(a%2C%20b%2C%20c)%0A%20%20%20%20%20%20%20%20%3Aparam%20points%3A%20%E5%BD%A2%E7%8A%B6%20(N%2C%202)%20%E3%81%AE%E8%A6%B3%E6%B8%AC%E7%82%B9%0A%20%20%20%20%20%20%20%20%3Areturn%3A%20%E5%BD%A2%E7%8A%B6%20(N%2C)%20%E3%81%AE%E6%AE%8B%E5%B7%AE%20f(x)%20-%20y%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20return%20quad_model(points%5B%3A%2C%200%5D%2C%20*coeffs)%20-%20points%5B%3A%2C%201%5D%0A%0A%20%20%20%20_output%20%3D%20spo.leastsq(quad_residuals%2C%20(0.0%2C%200.0%2C%200.0)%2C%20args%3Dquad_points%2C%20full_output%3DTrue)%0A%20%20%20%20leastsq_coeffs%2C%20leastsq_cov_x%20%3D%20_output%5B0%5D%2C%20_output%5B1%5D%0A%20%20%20%20leastsq_chi2%20%3D%20float(np.sum(quad_residuals(leastsq_coeffs%2C%20quad_points)%20**%202))%0A%20%20%20%20leastsq_cov%20%3D%20leastsq_cov_x%20*%20leastsq_chi2%20%2F%20(quad_sample_size%20-%203)%0A%20%20%20%20print(f%22%E6%8E%A8%E5%AE%9A%E4%BF%82%E6%95%B0%20%3D%20%7Bnp.round(leastsq_coeffs%2C%206)%7D%22)%0A%20%20%20%20print(f%22chi%5E2%20%2F%20(N%20-%20m)%20%3D%20%7Bleastsq_chi2%20%2F%20(quad_sample_size%20-%203)%3A.6f%7D%22)%0A%20%20%20%20print(f%22%E6%AD%A3%E8%A6%8F%E5%8C%96%E5%89%8D%E3%81%AE%20cov_x%20%E3%81%AE%E5%AF%BE%E8%A7%92%20%3D%20%7Bnp.round(np.diag(leastsq_cov_x)%2C%208)%7D%22)%0A%20%20%20%20print(f%22polyfit%20%E3%81%A8%E3%81%AE%E5%85%B1%E5%88%86%E6%95%A3%E3%81%AE%E6%9C%80%E5%A4%A7%E5%B7%AE%EF%BC%88%E6%AD%A3%E8%A6%8F%E5%8C%96%E5%BE%8C%EF%BC%89%20%3D%20%7Bnp.max(np.abs(leastsq_cov%20-%20polyfit_cov))%3A.3e%7D%22)%0A%20%20%20%20show_matrix(leastsq_cov%2C%20%22scipy.optimize.leastsq%20covariance%20(scaled)%22)%0A%20%20%20%20return%20(leastsq_coeffs%2C)%0A%0A%0A%40app.cell%0Adef%20_(leastsq_coeffs%2C%20quad_model%2C%20quad_x%2C%20quad_y)%3A%0A%20%20%20%20plt.scatter(quad_x%2C%20quad_y%2C%20s%3D0.5%2C%20label%3D%22observation%22)%0A%20%20%20%20plt.plot(quad_x%2C%20quad_model(quad_x%2C%20*leastsq_coeffs)%2C%20color%3D%22orange%22%2C%20label%3D%22leastsq%22)%0A%20%20%20%20plt.xlim(0%2C%203.5)%0A%20%20%20%20plt.ylim(-1%2C%2011)%0A%20%20%20%20plt.xlabel(%22x%22)%0A%20%20%20%20plt.ylabel(%22y%22)%0A%20%20%20%20plt.legend()%0A%20%20%20%20plt.show()%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20%E9%99%B0%E9%96%A2%E6%95%B0%E3%81%AE%E5%A0%B4%E5%90%88%0A%0A%20%20%20%20%E5%86%86%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%201%20%E3%81%A4%E3%81%AE%20%24x%24%20%E3%81%AB%202%20%E3%81%A4%E3%81%AE%20%24y%24%20%E3%81%8C%E5%AF%BE%E5%BF%9C%E3%81%99%E3%82%8B%E6%9B%B2%E7%B7%9A%E3%81%AF%E3%80%81%24y%3Df(x)%24%20%E3%81%AE%E5%BD%A2%E3%81%A7%E3%81%AF%E8%A1%A8%E3%81%9B%E3%81%AA%E3%81%84%E3%80%82%0A%20%20%20%20%24f(x%2Cy)%3D0%24%20%E3%81%AE%E5%BD%A2%E3%81%AB%E3%81%97%E3%81%9F%E3%81%86%E3%81%88%E3%81%A7%E3%80%81%E7%82%B9%E3%81%8B%E3%82%89%E6%9B%B2%E7%B7%9A%E3%81%BE%E3%81%A7%E3%81%AE%E8%B7%9D%E9%9B%A2%E3%82%92%E6%AE%8B%E5%B7%AE%E3%81%A8%E3%81%99%E3%82%8B%E3%80%82%E3%81%93%E3%81%AE%E5%AE%9A%E5%BC%8F%E5%8C%96%E3%81%AF%0A%20%20%20%20%E7%9B%B4%E4%BA%A4%E8%B7%9D%E9%9B%A2%E5%9B%9E%E5%B8%B0%EF%BC%88ODR%2C%20Orthogonal%20Distance%20Regression%EF%BC%89%E3%81%A8%E5%91%BC%E3%81%B0%E3%82%8C%E3%80%81%0A%20%20%20%20%5B%60scipy.odr%60%5D(https%3A%2F%2Fdocs.scipy.org%2Fdoc%2Fscipy%2Freference%2Fodr.html)%20%E3%81%A7%E6%89%B1%E3%81%88%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E6%A4%9C%E8%A8%BC%E7%94%A8%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AF%E3%80%81%E4%B8%AD%E5%BF%83%20%24(1%2C%202)%24%E3%83%BB%E5%8D%8A%E5%BE%84%20%241.3%24%20%E3%81%AE%E5%86%86%E3%81%AB%E3%80%81%E6%A8%99%E6%BA%96%E5%81%8F%E5%B7%AE%20%240.02%24%20%E3%81%AE%E6%AD%A3%E8%A6%8F%E5%88%86%E5%B8%83%0A%20%20%20%20%E8%AA%A4%E5%B7%AE%E3%82%92%20%24x%24%20%E3%81%A8%20%24y%24%20%E3%81%AE%E4%B8%A1%E6%96%B9%E3%81%B8%E8%B6%B3%E3%81%97%E3%81%A6%E4%BD%9C%E3%82%8B%E3%80%82%E5%86%86%E3%81%AF%0A%20%20%20%20%24%24%0A%20%20%20%20f(x%2C%20y)%20%3D%20(x%20-%20c_x)%5E2%20%2B%20(y%20-%20c_y)%5E2%20-%20r%5E2%20%3D%200%0A%20%20%20%20%24%24%0A%20%20%20%20%E3%81%A8%E6%9B%B8%E3%81%91%E3%80%81%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%20%24%5Cbeta%3D(c_x%2C%20c_y%2C%20r)%24%20%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E5%90%8C%E6%AC%A1%E3%81%A7%E3%81%AA%E3%81%84%E3%80%82%E3%81%93%E3%81%AE%E7%82%B9%E3%81%8C%E5%BE%8C%E5%8D%8A%E3%81%AE%0A%20%20%20%20%E5%86%86%E9%8C%90%E6%9B%B2%E7%B7%9A%E3%81%A8%E3%81%AE%E9%81%95%E3%81%84%E3%81%AB%E3%81%AA%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20circle_sample_size%20%3D%20500%0A%20%20%20%20circle_true_center%20%3D%20np.array(%5B1.0%2C%202.0%5D)%0A%20%20%20%20circle_true_radius%20%3D%201.3%0A%20%20%20%20circle_noise_sd%20%3D%200.02%0A%20%20%20%20_rng%20%3D%20np.random.default_rng(1)%0A%20%20%20%20_theta%20%3D%20np.linspace(0%2C%202%20*%20np.pi%2C%20circle_sample_size)%0A%20%20%20%20_errors%20%3D%20circle_noise_sd%20*%20_rng.normal(0.0%2C%201.0%2C%20(circle_sample_size%2C%202))%0A%20%20%20%20circle_points%20%3D%20(%0A%20%20%20%20%20%20%20%20np.vstack(%0A%20%20%20%20%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20circle_true_radius%20*%20np.cos(_theta)%20%2B%20circle_true_center%5B0%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20circle_true_radius%20*%20np.sin(_theta)%20%2B%20circle_true_center%5B1%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%20%20).T%0A%20%20%20%20%20%20%20%20%2B%20_errors%0A%20%20%20%20)%0A%20%20%20%20plt.scatter(circle_points%5B%3A%2C%200%5D%2C%20circle_points%5B%3A%2C%201%5D%2C%20s%3D0.5)%0A%20%20%20%20plt.axis(%22equal%22)%0A%20%20%20%20plt.xlabel(%22x%22)%0A%20%20%20%20plt.ylabel(%22y%22)%0A%20%20%20%20plt.title(f%22circle%3A%20center%3D%7Btuple(circle_true_center)%7D%2C%20r%3D%7Bcircle_true_radius%7D%22)%0A%20%20%20%20plt.show()%0A%20%20%20%20return%20circle_points%2C%20circle_true_center%2C%20circle_true_radius%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%60odr.Model%60%20%E3%81%AB%20%60implicit%3DTrue%60%20%E3%82%92%E6%B8%A1%E3%81%99%E3%81%A8%E3%80%81%E3%83%A2%E3%83%87%E3%83%AB%E9%96%A2%E6%95%B0%E3%81%AE%E5%80%A4%E3%81%9D%E3%81%AE%E3%82%82%E3%81%AE%E3%82%92%200%20%E3%81%B8%E8%BF%91%E3%81%A5%E3%81%91%E3%82%8B%0A%20%20%20%20%E5%95%8F%E9%A1%8C%E3%81%A8%E3%81%97%E3%81%A6%E8%A7%A3%E3%81%8F%E3%80%82%60odr.Data(points.T%2C%20y%3D1)%60%20%E3%81%AE%20%60y%3D1%60%20%E3%81%AF%E3%80%8C%E9%99%B0%E9%96%A2%E6%95%B0%E3%81%AA%E3%81%AE%E3%81%A7%E7%9B%AE%E6%A8%99%E5%80%A4%E3%81%AE%E9%85%8D%E5%88%97%E3%81%AF%0A%20%20%20%20%E7%84%A1%E3%81%84%E3%80%8D%E3%81%93%E3%81%A8%E3%82%92%E7%A4%BA%E3%81%99%E7%B4%84%E6%9D%9F%E4%BA%8B%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%60beta0%60%20%E3%81%AF%E5%88%9D%E6%9C%9F%E5%80%A4%E3%81%A7%E3%80%81%E3%81%93%E3%81%93%E3%81%A7%E3%81%AF%E5%8E%9F%E7%82%B9%E4%B8%AD%E5%BF%83%E3%83%BB%E5%8D%8A%E5%BE%84%201%20%E3%81%8B%E3%82%89%0A%20%20%20%20%E5%A7%8B%E3%82%81%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(circle_points%2C%20circle_true_center%2C%20circle_true_radius%2C%20show_matrix)%3A%0A%20%20%20%20from%20scipy%20import%20odr%0A%0A%20%20%20%20def%20circle_residual(beta%2C%20point)%3A%0A%20%20%20%20%20%20%20%20%22%22%22%E5%86%86%E3%81%AE%E9%99%B0%E9%96%A2%E6%95%B0%20(x-cx)%5E2%20%2B%20(y-cy)%5E2%20-%20r%5E2%E3%80%82%0A%0A%20%20%20%20%20%20%20%20%3Aparam%20beta%3A%20(%E4%B8%AD%E5%BF%83%20x%2C%20%E4%B8%AD%E5%BF%83%20y%2C%20%E5%8D%8A%E5%BE%84)%0A%20%20%20%20%20%20%20%20%3Aparam%20point%3A%20%E5%BD%A2%E7%8A%B6%20(2%2C%20N)%20%E3%81%AE%E7%82%B9%E7%BE%A4%0A%20%20%20%20%20%20%20%20%3Areturn%3A%20%E5%BD%A2%E7%8A%B6%20(N%2C)%20%E3%81%AE%E9%99%B0%E9%96%A2%E6%95%B0%E3%81%AE%E5%80%A4%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20return%20(point%5B0%5D%20-%20beta%5B0%5D)%20**%202%20%2B%20(point%5B1%5D%20-%20beta%5B1%5D)%20**%202%20-%20beta%5B2%5D%20**%202%0A%0A%20%20%20%20_model%20%3D%20odr.Model(circle_residual%2C%20implicit%3DTrue)%0A%20%20%20%20_data%20%3D%20odr.Data(circle_points.T%2C%20y%3D1)%0A%20%20%20%20circle_odr_result%20%3D%20odr.ODR(_data%2C%20_model%2C%20beta0%3D%5B0.0%2C%200.0%2C%201.0%5D).run()%0A%20%20%20%20circle_beta%20%3D%20circle_odr_result.beta%0A%20%20%20%20print(f%22%E6%8E%A8%E5%AE%9A%20%E4%B8%AD%E5%BF%83%20%3D%20%7Bnp.round(circle_beta%5B%3A2%5D%2C%205)%7D%20%2F%20%E7%9C%9F%E5%80%A4%20%3D%20%7Bcircle_true_center%7D%22)%0A%20%20%20%20print(f%22%E6%8E%A8%E5%AE%9A%20%E5%8D%8A%E5%BE%84%20%3D%20%7Babs(circle_beta%5B2%5D)%3A.5f%7D%20%2F%20%E7%9C%9F%E5%80%A4%20%3D%20%7Bcircle_true_radius%7D%22)%0A%20%20%20%20print(f%22%E4%B8%AD%E5%BF%83%E3%81%AE%E8%AA%A4%E5%B7%AE%20%3D%20%7Bnp.linalg.norm(circle_beta%5B%3A2%5D%20-%20circle_true_center)%3A.5f%7D%22)%0A%20%20%20%20print(f%22%E5%81%9C%E6%AD%A2%E7%90%86%E7%94%B1%20%3D%20%7Bcircle_odr_result.stopreason%7D%22)%0A%20%20%20%20show_matrix(circle_odr_result.cov_beta%2C%20%22scipy.odr%20cov_beta%20(unscaled)%22)%0A%20%20%20%20return%20circle_beta%2C%20circle_residual%2C%20odr%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E6%8E%A8%E5%AE%9A%E3%81%97%E3%81%9F%E9%99%B0%E9%96%A2%E6%95%B0%E3%82%92%E6%A0%BC%E5%AD%90%E4%B8%8A%E3%81%A7%E8%A9%95%E4%BE%A1%E3%81%97%E3%81%A6%E3%83%92%E3%83%BC%E3%83%88%E3%83%9E%E3%83%83%E3%83%97%E3%81%AB%E3%81%99%E3%82%8B%E3%81%A8%E3%80%81%E5%80%A4%E3%81%8C%200%20%E3%81%AB%E3%81%AA%E3%82%8B%E9%83%A8%E5%88%86%E7%A9%BA%E9%96%93%E3%81%8C%0A%20%20%20%20%E6%8E%A8%E5%AE%9A%E3%81%95%E3%82%8C%E3%81%9F%E6%9B%B2%E7%B7%9A%E3%81%AB%E3%81%AA%E3%82%8B%E3%80%82%60imshow%60%20%E3%81%AF%E8%A1%8C%E5%88%97%E3%81%AE%E8%A1%8C%E6%96%B9%E5%90%91%E3%82%92%E4%B8%8A%E3%81%8B%E3%82%89%E4%B8%8B%E3%81%B8%E6%8F%8F%E3%81%8F%E3%81%AE%E3%81%A7%E3%80%81%E6%95%A3%E5%B8%83%E5%9B%B3%E3%81%A8%0A%20%20%20%20%E5%90%91%E3%81%8D%E3%82%92%E6%8F%83%E3%81%88%E3%82%8B%E3%81%AB%E3%81%AF%20%60origin%3D%22lower%22%60%20%E3%81%A8%20%60extent%60%20%E3%81%AE%E6%8C%87%E5%AE%9A%E3%81%8C%E8%A6%81%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(circle_beta%2C%20circle_points%2C%20circle_residual)%3A%0A%20%20%20%20_step%20%3D%200.01%0A%20%20%20%20_x_range%20%3D%20np.arange(circle_points%5B%3A%2C%200%5D.min()%2C%20circle_points%5B%3A%2C%200%5D.max()%2C%20_step)%0A%20%20%20%20_y_range%20%3D%20np.arange(circle_points%5B%3A%2C%201%5D.min()%2C%20circle_points%5B%3A%2C%201%5D.max()%2C%20_step)%0A%20%20%20%20circle_x_mesh%2C%20circle_y_mesh%20%3D%20np.meshgrid(_x_range%2C%20_y_range)%0A%20%20%20%20circle_z_mesh%20%3D%20circle_residual(circle_beta%2C%20(circle_x_mesh%2C%20circle_y_mesh))%0A%20%20%20%20_extent%20%3D%20(_x_range%5B0%5D%2C%20_x_range%5B-1%5D%2C%20_y_range%5B0%5D%2C%20_y_range%5B-1%5D)%0A%20%20%20%20plt.imshow(circle_z_mesh%2C%20origin%3D%22lower%22%2C%20extent%3D_extent)%0A%20%20%20%20plt.colorbar(label%3D%22f(x%2C%20y)%22)%0A%20%20%20%20plt.xlabel(%22x%22)%0A%20%20%20%20plt.ylabel(%22y%22)%0A%20%20%20%20plt.title(%22implicit%20function%20value%22)%0A%20%20%20%20plt.show()%0A%20%20%20%20return%20circle_x_mesh%2C%20circle_y_mesh%2C%20circle_z_mesh%0A%0A%0A%40app.cell%0Adef%20_(circle_points%2C%20circle_x_mesh%2C%20circle_y_mesh%2C%20circle_z_mesh)%3A%0A%20%20%20%20plt.scatter(circle_points%5B%3A%2C%200%5D%2C%20circle_points%5B%3A%2C%201%5D%2C%20s%3D0.5%2C%20color%3D%22blue%22%2C%20label%3D%22observation%22)%0A%20%20%20%20plt.contour(circle_x_mesh%2C%20circle_y_mesh%2C%20circle_z_mesh%2C%20%5B0%5D%2C%20colors%3D%22orange%22)%0A%20%20%20%20plt.axis(%22equal%22)%0A%20%20%20%20plt.xlabel(%22x%22)%0A%20%20%20%20plt.ylabel(%22y%22)%0A%20%20%20%20plt.legend()%0A%20%20%20%20plt.show()%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20RANSAC%0A%0A%20%20%20%20%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%97%E6%B3%95%E3%81%AF%E3%80%81%E5%85%A8%E8%A6%B3%E6%B8%AC%E3%81%8C%E5%90%8C%E3%81%98%E8%AA%A4%E5%B7%AE%E5%88%86%E5%B8%83%E3%81%AB%E5%BE%93%E3%81%86%E3%81%93%E3%81%A8%E3%82%92%E5%89%8D%E6%8F%90%E3%81%AB%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%80%82%E5%A4%96%E3%82%8C%E5%80%A4%E3%81%8C%0A%20%20%20%20%E6%B7%B7%E3%81%96%E3%82%8B%E3%81%A8%E3%80%81%E4%BA%8C%E4%B9%97%E5%92%8C%E3%81%AE%E6%9C%80%E5%B0%8F%E5%8C%96%E3%81%AF%E3%81%9D%E3%81%AE%201%20%E7%82%B9%E3%82%92%E6%B8%9B%E3%82%89%E3%81%99%E3%81%9F%E3%82%81%E3%81%AB%E8%A7%A3%E3%82%92%E5%A4%A7%E3%81%8D%E3%81%8F%E5%BC%95%E3%81%8D%E3%81%9A%E3%82%89%E3%82%8C%E3%82%8B%E3%80%82%0A%0A%20%20%20%20RANSAC%20(RANdom%20SAmple%20Consensus)%20%E3%81%AF%E6%AC%A1%E3%82%92%E7%B9%B0%E3%82%8A%E8%BF%94%E3%81%99%E3%80%82%0A%0A%20%20%20%201.%20%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E4%B8%80%E6%84%8F%E3%81%AB%E6%B1%BA%E3%82%81%E3%82%8B%E3%81%AE%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%AA%E6%9C%80%E5%B0%8F%E5%80%8B%E6%95%B0%E3%81%AE%E7%82%B9%E3%82%92%E7%84%A1%E4%BD%9C%E7%82%BA%E3%81%AB%E9%81%B8%E3%81%B6%0A%20%20%20%202.%20%E3%81%9D%E3%81%AE%E7%82%B9%E3%81%A0%E3%81%91%E3%81%A7%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E5%BD%93%E3%81%A6%E3%81%AF%E3%82%81%E3%82%8B%0A%20%20%20%203.%20%E5%85%A8%E7%82%B9%E3%81%A8%E3%81%AE%E8%B7%9D%E9%9B%A2%E3%82%92%E6%B8%AC%E3%82%8A%E3%80%81%E9%96%BE%E5%80%A4%E4%BB%A5%E5%86%85%E3%81%AE%E7%82%B9%EF%BC%88inlier%EF%BC%89%E3%82%92%E6%95%B0%E3%81%88%E3%82%8B%0A%20%20%20%204.%20inlier%20%E3%81%8C%E6%9C%80%E5%A4%9A%E3%81%A0%E3%81%A3%E3%81%9F%E5%80%99%E8%A3%9C%E3%82%92%E6%8E%A1%E7%94%A8%E3%81%97%E3%80%81%E6%9C%80%E5%BE%8C%E3%81%AB%E3%81%9D%E3%81%AE%20inlier%20%E3%81%A0%E3%81%91%E3%81%A7%E5%86%8D%E3%83%95%E3%82%A3%E3%83%83%E3%83%88%E3%81%99%E3%82%8B%0A%0A%20%20%20%20%23%23%23%20%E8%A9%A6%E8%A1%8C%E5%9B%9E%E6%95%B0%E3%81%AE%E8%A6%8B%E7%A9%8D%E3%82%82%E3%82%8A%0A%0A%20%20%20%201%20%E7%82%B9%E3%82%92%E5%BC%95%E3%81%84%E3%81%9F%E3%81%A8%E3%81%8D%E3%81%9D%E3%82%8C%E3%81%8C%20inlier%20%E3%81%A7%E3%81%82%E3%82%8B%E7%A2%BA%E7%8E%87%E3%82%92%20%24e%24%E3%80%811%20%E5%9B%9E%E3%81%AE%E8%A9%A6%E8%A1%8C%E3%81%A7%E5%BC%95%E3%81%8F%E7%82%B9%E6%95%B0%E3%82%92%20%24n%24%20%E3%81%A8%0A%20%20%20%20%E3%81%99%E3%82%8B%E3%81%A8%E3%80%811%20%E5%9B%9E%E3%81%AE%E8%A9%A6%E8%A1%8C%E3%81%A7%E5%85%A8%E7%82%B9%E3%81%8C%20inlier%20%E3%81%A7%E3%81%82%E3%82%8B%E7%A2%BA%E7%8E%87%E3%81%AF%20%24e%5En%24%20%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%E3%82%88%E3%81%A3%E3%81%A6%20%24N%24%20%E5%9B%9E%E3%81%AE%0A%20%20%20%20%E8%A9%A6%E8%A1%8C%E3%81%A7%E3%81%9D%E3%82%8C%E3%81%8C%E4%B8%80%E5%BA%A6%E3%82%82%E8%B5%B7%E3%81%93%E3%82%89%E3%81%AA%E3%81%84%E7%A2%BA%E7%8E%87%E3%80%81%E3%81%99%E3%81%AA%E3%82%8F%E3%81%A1%20RANSAC%20%E3%81%8C%E5%A4%B1%E6%95%97%E3%81%99%E3%82%8B%E7%A2%BA%E7%8E%87%E3%81%AF%0A%20%20%20%20%24(1-e%5En)%5EN%24%20%E3%81%AB%E3%81%AA%E3%82%8B%E3%80%82%E6%88%90%E5%8A%9F%E7%A2%BA%E7%8E%87%E3%82%92%20%24p%24%20%E3%81%AB%E3%81%97%E3%81%9F%E3%81%91%E3%82%8C%E3%81%B0%0A%20%20%20%20%24%24%0A%20%20%20%201%20-%20p%20%3D%20(1%20-%20e%5En)%5EN%0A%20%20%20%20%5Cquad%5CLongleftrightarrow%5Cquad%0A%20%20%20%20N%20%3D%20%5Cfrac%7B%5Cln(1-p)%7D%7B%5Cln(1-e%5En)%7D%0A%20%20%20%20%24%24%0A%20%20%20%20%E3%81%A0%E3%81%91%E7%B9%B0%E3%82%8A%E8%BF%94%E3%81%9B%E3%81%B0%E3%82%88%E3%81%84%E3%80%82%24e%24%20%E3%81%AF%E4%BA%8B%E5%89%8D%E3%81%AB%E3%81%AF%E5%88%86%E3%81%8B%E3%82%89%E3%81%AA%E3%81%84%E3%81%AE%E3%81%A7%E3%80%81%E6%95%A3%E5%B8%83%E5%9B%B3%E3%82%92%E8%A6%8B%E3%81%9F%E5%A4%A7%E3%81%BE%E3%81%8B%E3%81%AA%E5%80%A4%E3%81%8B%E3%82%89%0A%20%20%20%20%E5%A7%8B%E3%82%81%E3%80%81inlier%20%E6%95%B0%E3%81%AE%E6%9C%80%E5%A4%A7%E5%80%A4%E3%82%92%E6%9B%B4%E6%96%B0%E3%81%99%E3%82%8B%E3%81%9F%E3%81%B3%E3%81%AB%20%24e%20%5Csimeq%24%20(inlier%20%E6%95%B0)%2F(%E5%85%A8%E7%82%B9%E6%95%B0)%20%E3%81%A8%E3%81%97%E3%81%A6%0A%20%20%20%20%24N%24%20%E3%82%92%E8%A8%88%E7%AE%97%E3%81%97%E7%9B%B4%E3%81%99%E3%81%A8%E6%97%A9%E6%9C%9F%E3%81%AB%E6%89%93%E3%81%A1%E5%88%87%E3%82%8C%E3%82%8B%E3%80%82%E5%85%B1%E9%80%9A%E9%83%A8%E5%93%81%E3%81%AE%20%60iteration_budget%60%20%E3%81%8C%E3%81%93%E3%81%AE%E5%BC%8F%E3%81%AB%0A%20%20%20%20%E3%81%82%E3%81%9F%E3%82%8B%E3%80%82%24N%24%20%E3%81%AF%E8%A9%A6%E8%A1%8C%E5%9B%9E%E6%95%B0%E3%81%AA%E3%81%AE%E3%81%A7%E3%80%81%E5%8F%B3%E8%BE%BA%E3%82%92%E5%88%87%E3%82%8A%E4%B8%8A%E3%81%92%E3%81%A6%E6%95%B4%E6%95%B0%E3%81%AB%E3%81%99%E3%82%8B%E3%80%82%E5%88%87%E3%82%8A%E6%8D%A8%E3%81%A6%E3%82%8B%E3%81%A8%0A%20%20%20%20%E6%88%90%E5%8A%9F%E7%A2%BA%E7%8E%87%E3%81%8C%E7%9B%AE%E6%A8%99%E3%82%92%E4%B8%8B%E5%9B%9E%E3%82%8B%E3%80%82%E3%81%AA%E3%81%8A%20%24e%24%20%E3%81%8C%E5%B0%8F%E3%81%95%E3%81%84%E3%81%A8%20%24N%24%20%E3%81%AF%E6%80%A5%E6%BF%80%E3%81%AB%E5%A2%97%E3%81%88%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%0A%20%20%20%20%60iteration_budget%60%20%E3%81%AF%E4%B8%8A%E9%99%90%EF%BC%88%E6%97%A2%E5%AE%9A%2010%20%E4%B8%87%E5%9B%9E%EF%BC%89%E3%81%A7%E6%89%93%E3%81%A1%E5%88%87%E3%82%8B%E3%80%82%E4%B8%8A%E9%99%90%E3%81%AB%E9%81%94%E3%81%97%E3%81%9F%E5%A0%B4%E5%90%88%E3%81%AF%0A%20%20%20%20%E7%9B%AE%E6%A8%99%E3%81%AE%E6%88%90%E5%8A%9F%E7%A2%BA%E7%8E%87%E3%82%92%E4%BF%9D%E8%A8%BC%E3%81%97%E3%81%AA%E3%81%84%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20RANSAC%EF%BC%88%E9%99%BD%E9%96%A2%E6%95%B0%EF%BC%89%0A%0A%20%20%20%20%23%23%23%23%20%E7%9B%B4%E7%B7%9A%E3%83%95%E3%82%A3%E3%83%83%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%0A%0A%20%20%20%20%E5%A4%96%E3%82%8C%E5%80%A4%E3%82%92%E5%90%AB%E3%82%80%E7%8A%B6%E6%B3%81%E3%82%92%E4%BD%9C%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%E8%AA%A4%E5%B7%AE%E5%88%86%E5%B8%83%E3%81%A8%E3%81%97%E3%81%A6%E8%A3%BE%E3%81%AE%E9%87%8D%E3%81%84%E3%82%B3%E3%83%BC%E3%82%B7%E3%83%BC%E5%88%86%E5%B8%83%E3%82%92%E4%BD%BF%E3%81%86%E3%80%82%0A%20%20%20%20%E7%A2%BA%E7%8E%87%E5%AF%86%E5%BA%A6%E3%81%AF%0A%20%20%20%20%24%24%0A%20%20%20%20p(x)%20%3D%20%5Cfrac%7B1%7D%7B%5Cpi%20(1%20%2B%20x%5E2)%7D%0A%20%20%20%20%24%24%0A%20%20%20%20%E3%81%A7%E3%80%81%E5%B9%B3%E5%9D%87%E3%82%82%E5%88%86%E6%95%A3%E3%82%82%E5%AE%9A%E7%BE%A9%E3%81%95%E3%82%8C%E3%81%AA%E3%81%84%E3%80%82%24%7Cx%7C%24%20%E3%81%8C%E5%A4%A7%E3%81%8D%E3%81%84%E5%81%B4%E3%81%AE%E5%AF%86%E5%BA%A6%E3%81%8C%E6%AD%A3%E8%A6%8F%E5%88%86%E5%B8%83%E3%82%88%E3%82%8A%E6%A1%81%E9%81%95%E3%81%84%E3%81%AB%0A%20%20%20%20%E5%A4%A7%E3%81%8D%E3%81%84%E3%81%9F%E3%82%81%E3%80%81%E6%A8%99%E6%9C%AC%E3%81%AB%E3%81%AF%E6%98%8E%E7%A2%BA%E3%81%AA%E5%A4%96%E3%82%8C%E5%80%A4%E3%81%8C%E6%B7%B7%E3%81%96%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20def%20cauchy_pdf(x)%3A%0A%20%20%20%20%20%20%20%20%22%22%22%E6%A8%99%E6%BA%96%E3%82%B3%E3%83%BC%E3%82%B7%E3%83%BC%E5%88%86%E5%B8%83%E3%81%AE%E7%A2%BA%E7%8E%87%E5%AF%86%E5%BA%A6%E3%80%82%22%22%22%0A%20%20%20%20%20%20%20%20return%201.0%20%2F%20np.pi%20%2F%20(1.0%20%2B%20x%20*%20x)%0A%0A%20%20%20%20_x%20%3D%20np.linspace(-5%2C%205%2C%20100)%0A%20%20%20%20plt.plot(_x%2C%20cauchy_pdf(_x)%2C%20label%3D%22Cauchy%22)%0A%20%20%20%20plt.plot(_x%2C%20np.exp(-(_x**2)%20%2F%202)%20%2F%20np.sqrt(2%20*%20np.pi)%2C%20label%3D%22Normal%22%2C%20linestyle%3D%22--%22)%0A%20%20%20%20plt.xlabel(%22x%22)%0A%20%20%20%20plt.ylabel(%22density%22)%0A%20%20%20%20plt.legend()%0A%20%20%20%20plt.show()%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E7%9C%9F%E3%81%AE%E7%9B%B4%E7%B7%9A%20%24y%20%3D%20x%24%20%E3%81%AB%E3%80%81%E3%82%B3%E3%83%BC%E3%82%B7%E3%83%BC%E5%88%86%E5%B8%83%E3%81%AB%E5%BE%93%E3%81%86%E8%AA%A4%E5%B7%AE%E3%82%92%20%241%2F10%24%20%E3%81%AB%E7%B8%AE%E3%82%81%E3%81%A6%E8%B6%B3%E3%81%97%E3%81%9F%E3%82%82%E3%81%AE%E3%82%92%0A%20%20%20%20%E8%A6%B3%E6%B8%AC%E3%81%A8%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20line_sample_size%20%3D%201000%0A%20%20%20%20line_true_coeffs%20%3D%20np.array(%5B1.0%2C%200.0%5D)%0A%20%20%20%20_rng%20%3D%20np.random.default_rng(2)%0A%20%20%20%20line_x%20%3D%20np.linspace(0%2C%2010%2C%20line_sample_size)%0A%20%20%20%20line_y%20%3D%20np.polyval(line_true_coeffs%2C%20line_x)%20%2B%20_rng.standard_cauchy(line_sample_size)%20%2F%2010%0A%20%20%20%20line_points%20%3D%20np.vstack(%5Bline_x%2C%20line_y%5D).T%0A%20%20%20%20plt.scatter(line_x%2C%20line_y%2C%20s%3D0.5)%0A%20%20%20%20plt.ylim(-1%2C%2011)%0A%20%20%20%20plt.xlabel(%22x%22)%0A%20%20%20%20plt.ylabel(%22y%22)%0A%20%20%20%20plt.title(%22y%20%3D%20x%20%2B%20Cauchy%2F10%22)%0A%20%20%20%20plt.show()%0A%20%20%20%20return%20line_points%2C%20line_sample_size%2C%20line_true_coeffs%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20inlier%20%E3%81%A7%E3%81%82%E3%82%8B%E7%A2%BA%E7%8E%87%20%24e%24%20%E3%81%AF%E6%9C%AC%E6%9D%A5%E3%81%AF%E4%BA%8B%E5%89%8D%E3%81%AB%E5%88%86%E3%81%8B%E3%82%89%E3%81%AA%E3%81%84%E3%80%82%E3%81%93%E3%81%93%E3%81%A7%E3%81%AF%E6%95%A3%E5%B8%83%E5%9B%B3%E3%81%AE%E8%A6%8B%E3%81%9F%E7%9B%AE%E3%81%8B%E3%82%89%0A%20%20%20%20%24e%3D0.9%24%20%E3%81%A8%E4%BB%AE%E3%81%AB%E7%BD%AE%E3%81%8F%E3%80%82%E7%9B%B4%E7%B7%9A%E3%81%AE%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%81%AF%202%20%E5%80%8B%E3%81%AA%E3%81%AE%E3%81%A7%E3%80%811%20%E5%9B%9E%E3%81%AE%E8%A9%A6%E8%A1%8C%E3%81%A7%E5%BC%95%E3%81%8F%E7%82%B9%E6%95%B0%E3%81%AF%0A%20%20%20%202%20%E7%82%B9%E3%81%A7%E3%82%88%E3%81%84%E3%80%82%E6%88%90%E5%8A%9F%E7%A2%BA%E7%8E%87%E3%81%AF%2099.99%25%20%E3%82%92%E7%8B%99%E3%81%86%E3%80%82%E3%81%93%E3%81%AE%E8%A6%8B%E7%A9%8D%E3%82%82%E3%82%8A%E3%81%8C%E5%A6%A5%E5%BD%93%E3%81%A0%E3%81%A3%E3%81%9F%E3%81%8B%E3%81%AF%E3%80%81%0A%20%20%20%20%E5%BE%8C%E3%81%A7%E5%AE%9F%E9%9A%9B%E3%81%AE%20inlier%20%E7%8E%87%E3%81%A8%E7%AA%81%E3%81%8D%E5%90%88%E3%82%8F%E3%81%9B%E3%81%A6%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(iteration_budget)%3A%0A%20%20%20%20line_inlier_ratio%20%3D%200.9%0A%20%20%20%20line_sample_points%20%3D%202%0A%20%20%20%20line_budget%20%3D%20iteration_budget(line_inlier_ratio%2C%20line_sample_points)%0A%20%20%20%20print(f%22e%3D%7Bline_inlier_ratio%7D%2C%20n%3D%7Bline_sample_points%7D%20%E3%81%AE%E3%81%A8%E3%81%8D%E3%81%AE%E8%A9%A6%E8%A1%8C%E5%9B%9E%E6%95%B0%20N%20%3D%20%7Bline_budget%7D%22)%0A%20%20%20%20return%20line_budget%2C%20line_inlier_ratio%2C%20line_sample_points%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E8%A9%A6%E8%A1%8C%E3%81%94%E3%81%A8%E3%81%AB%202%20%E7%82%B9%E3%82%92%E9%87%8D%E8%A4%87%E3%81%AA%E3%81%8F%E9%81%B8%E3%81%B3%E3%80%81%E5%BD%A2%E7%8A%B6%20(%E8%A9%A6%E8%A1%8C%E6%95%B0%2C%20%E7%82%B9%E6%95%B0%2C%20%E5%BA%A7%E6%A8%99)%20%E3%81%AE%E3%83%86%E3%83%B3%E3%82%BD%E3%83%AB%E3%81%AB%E3%81%BE%E3%81%A8%E3%82%81%E3%82%8B%E3%80%82%0A%20%20%20%20%E3%81%93%E3%81%86%E3%81%99%E3%82%8B%E3%81%A8%E4%BB%A5%E9%99%8D%E3%81%AE%E5%87%A6%E7%90%86%E3%82%92%E8%A9%A6%E8%A1%8C%E6%96%B9%E5%90%91%E3%81%B8%E3%81%BE%E3%81%A8%E3%82%81%E3%81%A6%E6%9B%B8%E3%81%91%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(line_budget%2C%20line_points%2C%20line_sample_points%2C%20line_sample_size)%3A%0A%20%20%20%20_rng%20%3D%20np.random.default_rng(3)%0A%20%20%20%20line_index_mat%20%3D%20np.array(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20_rng.choice(line_sample_size%2C%20size%3Dline_sample_points%2C%20replace%3DFalse)%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20_%20in%20range(line_budget)%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%20%20%20%20line_samples%20%3D%20line_points%5Bline_index_mat%5D%0A%20%20%20%20print(f%22%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E8%A1%8C%E5%88%97%E3%81%AE%E5%BD%A2%E7%8A%B6%20%3D%20%7Bline_index_mat.shape%7D%22)%0A%20%20%20%20print(f%22%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%81%AE%E5%BD%A2%E7%8A%B6%20(%E8%A9%A6%E8%A1%8C%E6%95%B0%2C%20%E7%82%B9%E6%95%B0%2C%20%E5%BA%A7%E6%A8%99)%20%3D%20%7Bline_samples.shape%7D%22)%0A%20%20%20%20return%20(line_samples%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E5%90%84%E8%A9%A6%E8%A1%8C%E3%81%AE%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%81%B8%20%60numpy.polyfit%60%20%E3%81%A7%201%20%E6%AC%A1%E5%BC%8F%E3%82%92%E5%BD%93%E3%81%A6%E3%81%AF%E3%82%81%E3%80%81%E5%80%99%E8%A3%9C%E3%81%AE%E4%BF%82%E6%95%B0%E3%82%92%E4%BD%9C%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(line_samples)%3A%0A%20%20%20%20line_candidates%20%3D%20np.array(%0A%20%20%20%20%20%20%20%20%5Bnp.polyfit(sample%5B%3A%2C%200%5D%2C%20sample%5B%3A%2C%201%5D%2C%201)%20for%20sample%20in%20line_samples%5D%0A%20%20%20%20)%0A%20%20%20%20print(f%22%E5%80%99%E8%A3%9C%E3%81%AE%E4%BF%82%E6%95%B0%E3%81%AE%E5%BD%A2%E7%8A%B6%20(%E8%A9%A6%E8%A1%8C%E6%95%B0%2C%20%E4%BF%82%E6%95%B0)%20%3D%20%7Bline_candidates.shape%7D%22)%0A%20%20%20%20print(f%22%E5%80%99%E8%A3%9C%E3%81%AE%E4%BF%82%E6%95%B0%20(%E5%82%BE%E3%81%8D%2C%20%E5%88%87%E7%89%87)%20%3D%5Cn%7Bnp.round(line_candidates%2C%204)%7D%22)%0A%20%20%20%20return%20(line_candidates%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E5%80%99%E8%A3%9C%E3%81%94%E3%81%A8%E3%81%AB%E5%85%A8%E7%82%B9%E3%81%AE%20%24y%24%20%E6%96%B9%E5%90%91%E6%AE%8B%E5%B7%AE%E3%82%92%E6%B8%AC%E3%82%8A%E3%80%81%E9%96%BE%E5%80%A4%20%240.3%24%20%E4%BB%A5%E5%86%85%E3%81%AE%E7%82%B9%E3%82%92%20inlier%20%E3%81%A8%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20inlier%20%E3%81%8C%E6%9C%80%E3%82%82%E5%A4%9A%E3%81%84%E5%80%99%E8%A3%9C%E3%82%92%E6%8E%A1%E7%94%A8%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20iteration_budget%2C%0A%20%20%20%20line_budget%2C%0A%20%20%20%20line_candidates%2C%0A%20%20%20%20line_inlier_ratio%2C%0A%20%20%20%20line_points%2C%0A%20%20%20%20line_sample_points%2C%0A)%3A%0A%20%20%20%20line_distance_th%20%3D%200.3%0A%20%20%20%20_predicted%20%3D%20np.array(%5Bnp.polyval(coeffs%2C%20line_points%5B%3A%2C%200%5D)%20for%20coeffs%20in%20line_candidates%5D)%0A%20%20%20%20_residuals%20%3D%20np.abs(line_points%5B%3A%2C%201%5D%5BNone%2C%20%3A%5D%20-%20_predicted)%0A%20%20%20%20line_inlier_masks%20%3D%20_residuals%20%3C%20line_distance_th%0A%20%20%20%20line_inlier_counts%20%3D%20line_inlier_masks.sum(axis%3D1)%0A%20%20%20%20line_best_index%20%3D%20int(np.argmax(line_inlier_counts))%0A%20%20%20%20print(f%22%E5%90%84%E5%80%99%E8%A3%9C%E3%81%AE%20inlier%20%E6%95%B0%20%3D%20%7Bline_inlier_counts%7D%22)%0A%20%20%20%20print(f%22%E6%9C%80%E8%89%AF%E3%81%AE%E5%80%99%E8%A3%9C%20%3D%20%7Bline_best_index%7D%20%E7%95%AA%E7%9B%AE%EF%BC%88inlier%20%7Bline_inlier_counts%5Bline_best_index%5D%7D%20%E7%82%B9%EF%BC%89%22)%0A%20%20%20%20_actual_ratio%20%3D%20line_inlier_counts%5Bline_best_index%5D%20%2F%20len(line_points)%0A%20%20%20%20print(f%22%E6%83%B3%E5%AE%9A%E3%81%97%E3%81%9F%20inlier%20%E7%8E%87%20e%20%3D%20%7Bline_inlier_ratio%7D%20%2F%20%E5%AE%9F%E9%9A%9B%E3%81%AE%20inlier%20%E7%8E%87%20%3D%20%7B_actual_ratio%3A.3f%7D%22)%0A%20%20%20%20print(f%22%E5%AE%9F%E9%9A%9B%E3%81%AE%20inlier%20%E7%8E%87%E3%81%AA%E3%82%89%E5%BF%85%E8%A6%81%E3%81%AA%E8%A9%A6%E8%A1%8C%E5%9B%9E%E6%95%B0%20N%20%3D%20%22%0A%20%20%20%20%20%20%20%20%20%20f%22%7Biteration_budget(_actual_ratio%2C%20line_sample_points)%7D%EF%BC%88%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%9F%E3%81%AE%E3%81%AF%20%7Bline_budget%7D%20%E5%9B%9E%EF%BC%89%22)%0A%20%20%20%20return%20line_best_index%2C%20line_inlier_masks%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E5%AE%9F%E9%9A%9B%E3%81%AE%20inlier%20%E7%8E%87%E3%81%AF%E8%A6%8B%E7%A9%8D%E3%82%82%E3%81%A3%E3%81%9F%20%24e%3D0.9%24%20%E3%82%88%E3%82%8A%E4%BD%8E%E3%81%84%E3%80%82%24e%24%20%E3%82%92%E5%A4%A7%E3%81%8D%E3%81%8F%E8%A6%8B%E7%A9%8D%E3%82%82%E3%82%8B%E3%81%A8%20%24N%24%20%E3%81%AF%0A%20%20%20%20%E5%B0%8F%E3%81%95%E3%81%8F%E5%87%BA%E3%82%8B%E3%81%AE%E3%81%A7%E3%80%81%E3%81%9D%E3%81%AE%E3%81%B6%E3%82%93%E6%88%90%E5%8A%9F%E7%A2%BA%E7%8E%87%E3%81%AF%E7%9B%AE%E6%A8%99%E3%81%AE%2099.99%25%20%E3%82%92%E4%B8%8B%E5%9B%9E%E3%82%8B%E3%80%82%E5%AE%9F%E5%8B%99%E3%81%A7%E3%81%AF%E3%80%81%0A%20%20%20%20inlier%20%E6%95%B0%E3%81%AE%E6%9C%80%E5%A4%A7%E5%80%A4%E3%82%92%E6%9B%B4%E6%96%B0%E3%81%99%E3%82%8B%E3%81%9F%E3%81%B3%E3%81%AB%20%24e%24%20%E3%82%92%E6%B8%AC%E3%82%8A%E7%9B%B4%E3%81%97%E3%81%A6%20%24N%24%20%E3%82%92%E8%A8%88%E7%AE%97%E3%81%97%E7%9B%B4%E3%81%99%E3%80%82%0A%20%20%20%20%E5%BE%8C%E5%8D%8A%E3%81%AE%20%60ImplicitRansac.execute%60%20%E3%81%AF%E3%81%9D%E3%81%AE%E5%BD%A2%E3%81%A7%E5%AE%9F%E8%A3%85%E3%81%97%E3%81%A6%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(line_best_index%2C%20line_candidates%2C%20line_inlier_masks%2C%20line_points)%3A%0A%20%20%20%20line_best_coeffs%20%3D%20line_candidates%5Bline_best_index%5D%0A%20%20%20%20line_best_mask%20%3D%20line_inlier_masks%5Bline_best_index%5D%0A%20%20%20%20plt.scatter(%0A%20%20%20%20%20%20%20%20line_points%5B~line_best_mask%2C%200%5D%2C%20line_points%5B~line_best_mask%2C%201%5D%2C%20s%3D0.5%2C%20color%3D%22blue%22%2C%20label%3D%22outlier%22%0A%20%20%20%20)%0A%20%20%20%20plt.scatter(%0A%20%20%20%20%20%20%20%20line_points%5Bline_best_mask%2C%200%5D%2C%20line_points%5Bline_best_mask%2C%201%5D%2C%20s%3D0.5%2C%20color%3D%22orange%22%2C%20label%3D%22inlier%22%0A%20%20%20%20)%0A%20%20%20%20plt.plot(%0A%20%20%20%20%20%20%20%20line_points%5B%3A%2C%200%5D%2C%20np.polyval(line_best_coeffs%2C%20line_points%5B%3A%2C%200%5D)%2C%20color%3D%22green%22%2C%20label%3D%22best%20sample%22%0A%20%20%20%20)%0A%20%20%20%20plt.ylim(-1%2C%2011)%0A%20%20%20%20plt.xlabel(%22x%22)%0A%20%20%20%20plt.ylabel(%22y%22)%0A%20%20%20%20plt.legend()%0A%20%20%20%20plt.show()%0A%20%20%20%20return%20line_best_coeffs%2C%20line_best_mask%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E6%8E%A1%E7%94%A8%E3%81%97%E3%81%9F%E5%80%99%E8%A3%9C%E3%81%AF%202%20%E7%82%B9%E3%81%A0%E3%81%91%E3%81%A7%E6%B1%BA%E3%82%81%E3%81%9F%E7%9B%B4%E7%B7%9A%E3%81%AA%E3%81%AE%E3%81%A7%E3%80%81%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E3%81%A7%E3%81%AF%20inlier%20%E5%85%A8%E4%BD%93%E3%81%AE%E6%83%85%E5%A0%B1%E3%82%92%0A%20%20%20%20%E4%BD%BF%E3%81%88%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%E3%80%82%E6%9C%80%E5%BE%8C%E3%81%AB%20inlier%20%E3%81%A0%E3%81%91%E3%81%A7%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%97%E3%82%92%E8%A7%A3%E3%81%8D%E7%9B%B4%E3%81%99%E3%80%82%E6%AC%A1%E3%81%AE%E5%9B%B3%E3%81%A7%E3%81%AF%E3%80%812%20%E7%82%B9%E3%81%8B%E3%82%89%0A%20%20%20%20%E6%B1%BA%E3%82%81%E3%81%9F%E7%9B%B4%E7%B7%9A%EF%BC%88%E7%B7%91%EF%BC%89%E3%81%A8%E5%86%8D%E3%83%95%E3%82%A3%E3%83%83%E3%83%88%E3%81%97%E3%81%9F%E7%9B%B4%E7%B7%9A%EF%BC%88%E8%B5%A4%EF%BC%89%E3%82%92%E9%87%8D%E3%81%AD%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(line_best_coeffs%2C%20line_best_mask%2C%20line_points%2C%20line_true_coeffs)%3A%0A%20%20%20%20line_refined_coeffs%20%3D%20np.polyfit(line_points%5Bline_best_mask%2C%200%5D%2C%20line_points%5Bline_best_mask%2C%201%5D%2C%201)%0A%20%20%20%20print(f%22%E7%9C%9F%E3%81%AE%E4%BF%82%E6%95%B0%20%20%20%20%20(%E5%82%BE%E3%81%8D%2C%20%E5%88%87%E7%89%87)%20%3D%20%7Bline_true_coeffs%7D%22)%0A%20%20%20%20print(f%222%20%E7%82%B9%E3%81%A7%E3%81%AE%E4%BF%82%E6%95%B0%20(%E5%82%BE%E3%81%8D%2C%20%E5%88%87%E7%89%87)%20%3D%20%7Bnp.round(line_best_coeffs%2C%205)%7D%22)%0A%20%20%20%20print(f%22%E5%86%8D%E3%83%95%E3%82%A3%E3%83%83%E3%83%88%E5%BE%8C%20(%E5%82%BE%E3%81%8D%2C%20%E5%88%87%E7%89%87)%20%3D%20%7Bnp.round(line_refined_coeffs%2C%205)%7D%22)%0A%20%20%20%20print(f%22%E7%9C%9F%E5%80%A4%E3%81%A8%E3%81%AE%E5%B7%AE%20%3A%20%7Bnp.abs(line_best_coeffs%20-%20line_true_coeffs).max()%3A.5f%7D%20-%3E%20%22%0A%20%20%20%20%20%20%20%20%20%20f%22%7Bnp.abs(line_refined_coeffs%20-%20line_true_coeffs).max()%3A.5f%7D%22)%0A%20%20%20%20plt.scatter(%0A%20%20%20%20%20%20%20%20line_points%5B~line_best_mask%2C%200%5D%2C%20line_points%5B~line_best_mask%2C%201%5D%2C%20s%3D0.5%2C%20color%3D%22blue%22%2C%20label%3D%22outlier%22%0A%20%20%20%20)%0A%20%20%20%20plt.scatter(%0A%20%20%20%20%20%20%20%20line_points%5Bline_best_mask%2C%200%5D%2C%20line_points%5Bline_best_mask%2C%201%5D%2C%20s%3D0.5%2C%20color%3D%22orange%22%2C%20label%3D%22inlier%22%0A%20%20%20%20)%0A%20%20%20%20plt.plot(%0A%20%20%20%20%20%20%20%20line_points%5B%3A%2C%200%5D%2C%20np.polyval(line_best_coeffs%2C%20line_points%5B%3A%2C%200%5D)%2C%20color%3D%22green%22%2C%20label%3D%22best%20sample%22%0A%20%20%20%20)%0A%20%20%20%20plt.plot(%0A%20%20%20%20%20%20%20%20line_points%5B%3A%2C%200%5D%2C%20np.polyval(line_refined_coeffs%2C%20line_points%5B%3A%2C%200%5D)%2C%20color%3D%22red%22%2C%20label%3D%22refit%20on%20inliers%22%0A%20%20%20%20)%0A%20%20%20%20plt.ylim(-1%2C%2011)%0A%20%20%20%20plt.xlabel(%22x%22)%0A%20%20%20%20plt.ylabel(%22y%22)%0A%20%20%20%20plt.legend()%0A%20%20%20%20plt.show()%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%23%202%20%E6%AC%A1%E6%9B%B2%E7%B7%9A%E3%83%95%E3%82%A3%E3%83%83%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%0A%0A%20%20%20%20%E3%81%93%E3%81%93%E3%81%BE%E3%81%A7%E3%81%AE%E6%89%8B%E9%A0%86%E3%81%AF%E6%AC%A1%E6%95%B0%E3%82%92%E5%A4%89%E3%81%88%E3%82%8B%E3%81%A0%E3%81%91%E3%81%A7%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E4%BD%BF%E3%81%88%E3%82%8B%E3%81%AE%E3%81%A7%E3%80%81%E9%96%A2%E6%95%B0%E3%81%AB%E3%81%BE%E3%81%A8%E3%82%81%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(iteration_budget)%3A%0A%20%20%20%20def%20ransac_polyfit(points%2C%20degree%2C%20distance_th%2C%20inlier_ratio%2C%20seed%3D0%2C%20target_prob%3D0.9999)%3A%0A%20%20%20%20%20%20%20%20%22%22%22%E5%A4%9A%E9%A0%85%E5%BC%8F%E3%81%AB%E5%AF%BE%E3%81%99%E3%82%8B%20RANSAC%E3%80%82%0A%0A%20%20%20%20%20%20%20%20%3Aparam%20points%3A%20%E5%BD%A2%E7%8A%B6%20(N%2C%202)%20%E3%81%AE%E8%A6%B3%E6%B8%AC%E7%82%B9%0A%20%20%20%20%20%20%20%20%3Aparam%20degree%3A%20%E5%A4%9A%E9%A0%85%E5%BC%8F%E3%81%AE%E6%AC%A1%E6%95%B0%E3%80%821%20%E5%9B%9E%E3%81%AE%E8%A9%A6%E8%A1%8C%E3%81%A7%E3%81%AF%20degree%2B1%20%E7%82%B9%E3%82%92%E5%BC%95%E3%81%8F%0A%20%20%20%20%20%20%20%20%3Aparam%20distance_th%3A%20inlier%20%E3%81%A8%E8%A6%8B%E3%81%AA%E3%81%99%20y%20%E6%96%B9%E5%90%91%E6%AE%8B%E5%B7%AE%E3%81%AE%E9%96%BE%E5%80%A4%0A%20%20%20%20%20%20%20%20%3Aparam%20inlier_ratio%3A%20inlier%20%E3%81%AE%E5%89%B2%E5%90%88%E3%81%AE%E8%A6%8B%E7%A9%8D%E3%82%82%E3%82%8A%E3%80%82%E8%A9%A6%E8%A1%8C%E5%9B%9E%E6%95%B0%E3%81%AE%E7%AE%97%E5%87%BA%E3%81%AB%E4%BD%BF%E3%81%86%0A%20%20%20%20%20%20%20%20%3Aparam%20seed%3A%20%E4%B9%B1%E6%95%B0%E3%81%AE%E7%A8%AE%0A%20%20%20%20%20%20%20%20%3Aparam%20target_prob%3A%20RANSAC%20%E3%82%92%E6%88%90%E5%8A%9F%E3%81%95%E3%81%9B%E3%81%9F%E3%81%84%E7%A2%BA%E7%8E%87%0A%20%20%20%20%20%20%20%20%3Areturn%3A%20(%E6%9C%80%E8%89%AF%E5%80%99%E8%A3%9C%E3%81%AE%E4%BF%82%E6%95%B0%2C%20inlier%20%E3%83%9E%E3%82%B9%E3%82%AF%2C%20inlier%20%E3%81%A7%E5%86%8D%E3%83%95%E3%82%A3%E3%83%83%E3%83%88%E3%81%97%E3%81%9F%E4%BF%82%E6%95%B0%2C%20%E8%A9%A6%E8%A1%8C%E5%9B%9E%E6%95%B0)%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20rng%20%3D%20np.random.default_rng(seed)%0A%20%20%20%20%20%20%20%20sample_points%20%3D%20degree%20%2B%201%0A%20%20%20%20%20%20%20%20budget%20%3D%20iteration_budget(inlier_ratio%2C%20sample_points%2C%20target_prob)%0A%20%20%20%20%20%20%20%20samples%20%3D%20points%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20np.array(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5Brng.choice(len(points)%2C%20size%3Dsample_points%2C%20replace%3DFalse)%20for%20_%20in%20range(budget)%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%20%20candidates%20%3D%20np.array(%0A%20%20%20%20%20%20%20%20%20%20%20%20%5Bnp.polyfit(sample%5B%3A%2C%200%5D%2C%20sample%5B%3A%2C%201%5D%2C%20degree)%20for%20sample%20in%20samples%5D%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20predicted%20%3D%20np.array(%5Bnp.polyval(coeffs%2C%20points%5B%3A%2C%200%5D)%20for%20coeffs%20in%20candidates%5D)%0A%20%20%20%20%20%20%20%20masks%20%3D%20np.abs(points%5B%3A%2C%201%5D%5BNone%2C%20%3A%5D%20-%20predicted)%20%3C%20distance_th%0A%20%20%20%20%20%20%20%20best%20%3D%20int(np.argmax(masks.sum(axis%3D1)))%0A%20%20%20%20%20%20%20%20refined%20%3D%20np.polyfit(points%5Bmasks%5Bbest%5D%2C%200%5D%2C%20points%5Bmasks%5Bbest%5D%2C%201%5D%2C%20degree)%0A%20%20%20%20%20%20%20%20return%20candidates%5Bbest%5D%2C%20masks%5Bbest%5D%2C%20refined%2C%20budget%0A%0A%20%20%20%20return%20(ransac_polyfit%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E7%9C%9F%E3%81%AE%E6%9B%B2%E7%B7%9A%E3%82%92%20%24y%3Dx%5E2%24%20%E3%81%AB%E5%A4%89%E3%81%88%E3%80%81%E5%90%8C%E3%81%98%E3%81%8F%E3%82%B3%E3%83%BC%E3%82%B7%E3%83%BC%E5%88%86%E5%B8%83%E3%81%AE%E8%AA%A4%E5%B7%AE%E3%82%92%E8%B6%B3%E3%81%99%E3%80%822%20%E6%AC%A1%E6%9B%B2%E7%B7%9A%E3%81%AF%0A%20%20%20%20%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%81%8C%203%20%E5%80%8B%E3%81%AA%E3%81%AE%E3%81%A7%201%20%E5%9B%9E%E3%81%AE%E8%A9%A6%E8%A1%8C%E3%81%A7%203%20%E7%82%B9%E3%82%92%E5%BC%95%E3%81%8F%E3%80%82%24e%3D0.9%24%20%E3%81%AE%E3%81%BE%E3%81%BE%E3%81%A0%E3%81%A8%0A%20%20%20%20%24e%5En%24%20%E3%81%8C%E5%B0%8F%E3%81%95%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%A6%E8%A9%A6%E8%A1%8C%E5%9B%9E%E6%95%B0%E3%81%8C%E5%A2%97%E3%81%88%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%E3%81%93%E3%81%93%E3%81%A7%E3%81%AF%E6%8E%A7%E3%81%88%E3%82%81%E3%81%AB%20%24e%3D0.6%24%20%E3%81%A8%0A%20%20%20%20%E8%A6%8B%E7%A9%8D%E3%82%82%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20parabola_sample_size%20%3D%201000%0A%20%20%20%20parabola_true_coeffs%20%3D%20np.array(%5B1.0%2C%200.0%2C%200.0%5D)%0A%20%20%20%20_rng%20%3D%20np.random.default_rng(4)%0A%20%20%20%20parabola_x%20%3D%20np.linspace(0%2C%2010%2C%20parabola_sample_size)%0A%20%20%20%20parabola_y%20%3D%20(%0A%20%20%20%20%20%20%20%20np.polyval(parabola_true_coeffs%2C%20parabola_x)%0A%20%20%20%20%20%20%20%20%2B%20_rng.standard_cauchy(parabola_sample_size)%20%2F%2010%0A%20%20%20%20)%0A%20%20%20%20parabola_points%20%3D%20np.vstack(%5Bparabola_x%2C%20parabola_y%5D).T%0A%20%20%20%20plt.scatter(parabola_x%2C%20parabola_y%2C%20s%3D0.5)%0A%20%20%20%20plt.xlim(0%2C%203.5)%0A%20%20%20%20plt.ylim(-1%2C%2011)%0A%20%20%20%20plt.xlabel(%22x%22)%0A%20%20%20%20plt.ylabel(%22y%22)%0A%20%20%20%20plt.title(%22y%20%3D%20x%5E2%20%2B%20Cauchy%2F10%22)%0A%20%20%20%20plt.show()%0A%20%20%20%20return%20parabola_points%2C%20parabola_true_coeffs%0A%0A%0A%40app.cell%0Adef%20_(parabola_points%2C%20parabola_true_coeffs%2C%20ransac_polyfit)%3A%0A%20%20%20%20parabola_best%2C%20parabola_mask%2C%20parabola_refined%2C%20parabola_budget%20%3D%20ransac_polyfit(%0A%20%20%20%20%20%20%20%20parabola_points%2C%20degree%3D2%2C%20distance_th%3D0.3%2C%20inlier_ratio%3D0.6%2C%20seed%3D5%0A%20%20%20%20)%0A%20%20%20%20print(f%22%E8%A9%A6%E8%A1%8C%E5%9B%9E%E6%95%B0%20%3D%20%7Bparabola_budget%7D%2C%20inlier%20%3D%20%7Bint(parabola_mask.sum())%7D%20%2F%20%7Blen(parabola_points)%7D%22)%0A%20%20%20%20print(f%22%E7%9C%9F%E3%81%AE%E4%BF%82%E6%95%B0%20%20%20%20%20%3D%20%7Bparabola_true_coeffs%7D%22)%0A%20%20%20%20print(f%223%20%E7%82%B9%E3%81%A7%E3%81%AE%E4%BF%82%E6%95%B0%20%3D%20%7Bnp.round(parabola_best%2C%205)%7D%22)%0A%20%20%20%20print(f%22%E5%86%8D%E3%83%95%E3%82%A3%E3%83%83%E3%83%88%E5%BE%8C%20%3D%20%7Bnp.round(parabola_refined%2C%205)%7D%22)%0A%20%20%20%20print(f%22%E7%9C%9F%E5%80%A4%E3%81%A8%E3%81%AE%E5%B7%AE%20%3A%20%7Bnp.abs(parabola_best%20-%20parabola_true_coeffs).max()%3A.5f%7D%20-%3E%20%22%0A%20%20%20%20%20%20%20%20%20%20f%22%7Bnp.abs(parabola_refined%20-%20parabola_true_coeffs).max()%3A.5f%7D%22)%0A%20%20%20%20return%20parabola_best%2C%20parabola_mask%2C%20parabola_refined%0A%0A%0A%40app.cell%0Adef%20_(parabola_best%2C%20parabola_mask%2C%20parabola_points%2C%20parabola_refined)%3A%0A%20%20%20%20plt.scatter(%0A%20%20%20%20%20%20%20%20parabola_points%5B~parabola_mask%2C%200%5D%2C%20parabola_points%5B~parabola_mask%2C%201%5D%2C%20s%3D0.5%2C%20color%3D%22blue%22%2C%20label%3D%22outlier%22%0A%20%20%20%20)%0A%20%20%20%20plt.scatter(%0A%20%20%20%20%20%20%20%20parabola_points%5Bparabola_mask%2C%200%5D%2C%20parabola_points%5Bparabola_mask%2C%201%5D%2C%20s%3D0.5%2C%20color%3D%22orange%22%2C%20label%3D%22inlier%22%0A%20%20%20%20)%0A%20%20%20%20plt.plot(%0A%20%20%20%20%20%20%20%20parabola_points%5B%3A%2C%200%5D%2C%20np.polyval(parabola_best%2C%20parabola_points%5B%3A%2C%200%5D)%2C%20color%3D%22green%22%2C%20label%3D%22best%20sample%22%0A%20%20%20%20)%0A%20%20%20%20plt.plot(%0A%20%20%20%20%20%20%20%20parabola_points%5B%3A%2C%200%5D%2C%20np.polyval(parabola_refined%2C%20parabola_points%5B%3A%2C%200%5D)%2C%20color%3D%22red%22%2C%20label%3D%22refit%20on%20inliers%22%0A%20%20%20%20)%0A%20%20%20%20plt.xlim(0%2C%203.5)%0A%20%20%20%20plt.ylim(-1%2C%2011)%0A%20%20%20%20plt.xlabel(%22x%22)%0A%20%20%20%20plt.ylabel(%22y%22)%0A%20%20%20%20plt.legend()%0A%20%20%20%20plt.show()%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20RANSAC%EF%BC%88%E9%99%B0%E9%96%A2%E6%95%B0%EF%BC%89%0A%0A%20%20%20%20%23%23%23%23%20%E5%9F%BA%E5%BA%95%E9%96%A2%E6%95%B0%E3%81%A8%E6%A7%8B%E9%80%A0%E8%A1%8C%E5%88%97%0A%0A%20%20%20%20%E9%99%B0%E9%96%A2%E6%95%B0%E3%82%92%E5%9F%BA%E5%BA%95%20%24%5Cxi_k(x%2Cy)%24%20%E3%81%AE%E7%B7%9A%E5%BD%A2%E7%B5%90%E5%90%88%E3%81%A7%E6%9B%B8%E3%81%8F%E3%80%82%0A%0A%20%20%20%20%24%24%0A%20%20%20%20f(x%2C%20y)%20%3D%20%5Csum_%7Bk%3D1%7D%5E%7Bm%7D%20a_k%20%5Cxi_k(x%2C%20y)%20%3D%20(%5Cxi%2C%20a)%20%3D%200%0A%20%20%20%20%24%24%0A%0A%20%20%20%20%E7%9B%B4%E7%B7%9A%E3%81%AA%E3%82%89%20%24%5Cxi%20%3D%20(x%2C%5C%20y%2C%5C%201)%24%20%E3%81%A7%20%24m%3D3%24%E3%80%81%E5%86%86%E9%8C%90%E6%9B%B2%E7%B7%9A%E3%81%AA%E3%82%89%0A%20%20%20%20%24%5Cxi%20%3D%20(x%5E2%2C%5C%202xy%2C%5C%20y%5E2%2C%5C%202x%2C%5C%202y%2C%5C%201)%24%20%E3%81%A7%20%24m%3D6%24%20%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%E4%BA%A4%E5%B7%AE%E9%A0%85%E3%81%A8%201%20%E6%AC%A1%E9%A0%85%E3%81%AB%20%242%24%20%E3%82%92%0A%20%20%20%20%E4%BB%98%E3%81%91%E3%81%A6%E3%81%8A%E3%81%8F%E3%81%A8%E3%80%81%242%24%20%E6%AC%A1%E3%81%AE%E9%A0%85%E3%81%AE%E4%BF%82%E6%95%B0%E3%81%8C%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E5%AF%BE%E7%A7%B0%E8%A1%8C%E5%88%97%E3%81%AE%E6%88%90%E5%88%86%E3%81%AB%E3%81%AA%E3%82%8A%E3%80%81%E5%BE%8C%E3%81%A7%E4%B8%AD%E5%BF%83%E3%82%84%E5%8D%8A%E8%BB%B8%E9%95%B7%E3%82%92%0A%20%20%20%20%E6%B1%82%E3%82%81%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AB%E6%89%B1%E3%81%84%E3%82%84%E3%81%99%E3%81%84%E3%80%82%0A%0A%20%20%20%20%E4%BF%82%E6%95%B0%E3%82%92%E5%AE%9A%E6%95%B0%E5%80%8D%E3%81%97%E3%81%A6%E3%82%82%E5%90%8C%E3%81%98%E6%9B%B2%E7%B7%9A%E3%82%92%E8%A1%A8%E3%81%99%E3%81%AE%E3%81%A7%E3%80%81%24%5C%7Ca%5C%7C%3D1%24%20%E3%81%A8%E6%AD%A3%E8%A6%8F%E5%8C%96%E3%81%97%E3%81%A6%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%97%E3%82%92%E8%A7%A3%E3%81%8F%E3%80%82%0A%0A%20%20%20%20%24%24%0A%20%20%20%20%5Chat%7Ba%7D%20%3D%20%5Carg%5Cmin_%7B%5C%7Ca%5C%7C%3D1%7D%20%5Cfrac%7B1%7D%7BN%7D%20%5Csum_%7Bi%3D1%7D%5E%7BN%7D%20(%5Cxi_i%2C%20a)%5E2%0A%20%20%20%20%3D%20%5Carg%5Cmin_%7B%5C%7Ca%5C%7C%3D1%7D%20(a%2C%20M%20a)%2C%0A%20%20%20%20%5Cqquad%0A%20%20%20%20M%20%3D%20%5Cfrac%7B1%7D%7BN%7D%20%5Csum_%7Bi%3D1%7D%5E%7BN%7D%20%5Cxi_i%20%5Cxi_i%5E%5Ctop%0A%20%20%20%20%24%24%0A%0A%20%20%20%20%E5%8F%B3%E8%BE%BA%E3%81%AF%E3%83%AC%E3%82%A4%E3%83%AA%E3%83%BC%E5%95%86%E3%81%AA%E3%81%AE%E3%81%A7%E3%80%81%E8%A7%A3%E3%81%AF%20%24M%24%20%E3%81%AE%E6%9C%80%E5%B0%8F%E5%9B%BA%E6%9C%89%E5%80%A4%E3%81%AB%E5%AF%BE%E5%BF%9C%E3%81%99%E3%82%8B%E5%9B%BA%E6%9C%89%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%E3%81%93%E3%81%AE%20%24M%24%20%E3%82%92%E6%A7%8B%E9%80%A0%E8%A1%8C%E5%88%97%EF%BC%88%E3%83%A2%E3%83%BC%E3%83%A1%E3%83%B3%E3%83%88%E8%A1%8C%E5%88%97%EF%BC%89%E3%81%A8%E5%91%BC%E3%81%B6%E3%80%82%E7%82%B9%E6%95%B0%E3%81%A7%E5%89%B2%E3%81%A3%E3%81%A6%E3%82%82%E5%9B%BA%E6%9C%89%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%81%AF%0A%20%20%20%20%E5%A4%89%E3%82%8F%E3%82%89%E3%81%AA%E3%81%84%E3%81%8C%E3%80%81%E7%82%B9%E6%95%B0%E3%81%AB%E4%BE%9D%E3%82%89%E3%81%AA%E3%81%84%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%AB%E3%81%AB%E3%81%97%E3%81%A6%E3%81%8A%E3%81%8F%E3%81%A8%E5%BE%8C%E3%81%AE%E5%85%B1%E5%88%86%E6%95%A3%E3%81%AE%E5%BC%8F%E3%81%A8%E6%8F%83%E3%81%86%E3%80%82%0A%20%20%20%20%24M%24%20%E3%81%AF%E5%AF%BE%E7%A7%B0%E3%81%AA%E3%81%AE%E3%81%A7%20%60numpy.linalg.eigh%60%20%E3%82%92%E4%BD%BF%E3%81%88%E3%81%B0%E5%AE%9F%E5%9B%BA%E6%9C%89%E5%80%A4%E3%81%8C%E6%98%87%E9%A0%86%E3%81%A7%E5%BE%97%E3%82%89%E3%82%8C%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E8%A6%B3%E6%B8%AC%E3%81%AB%E8%AA%A4%E5%B7%AE%E3%81%8C%E7%84%A1%E3%81%91%E3%82%8C%E3%81%B0%E5%85%A8%E7%82%B9%E3%81%8C%E5%8E%B3%E5%AF%86%E3%81%AB%20%24(%5Cxi_i%2C%20a)%3D0%24%20%E3%82%92%E6%BA%80%E3%81%9F%E3%81%99%E3%81%9F%E3%82%81%E3%80%81%24M%24%20%E3%81%AF%20%24a%24%20%E6%96%B9%E5%90%91%E3%82%92%0A%20%20%20%20%E9%9B%B6%E7%A9%BA%E9%96%93%E3%81%AB%E6%8C%81%E3%81%A4%E7%89%B9%E7%95%B0%E8%A1%8C%E5%88%97%EF%BC%88%24%5Cdet%20M%20%3D%200%24%E3%80%81%E5%8D%8A%E6%AD%A3%E5%AE%9A%E5%80%A4%EF%BC%89%E3%81%AB%E3%81%AA%E3%82%8B%E3%80%82%E8%AA%A4%E5%B7%AE%E3%81%8C%E3%81%82%E3%82%8B%E3%81%A8%E6%9C%80%E5%B0%8F%E5%9B%BA%E6%9C%89%E5%80%A4%E3%81%8C%0A%20%20%20%20%E6%AD%A3%E3%81%B8%E6%8C%81%E3%81%A1%E4%B8%8A%E3%81%8C%E3%82%8A%E3%80%81%E6%AD%A3%E5%AE%9A%E5%80%A4%E8%A1%8C%E5%88%97%E3%81%AB%E3%81%AA%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20def%20linear_basis(point)%3A%0A%20%20%20%20%20%20%20%20%22%22%22%E7%9B%B4%E7%B7%9A%20ax%20%2B%20by%20%2B%20c%20%3D%200%20%E3%81%AE%E5%9F%BA%E5%BA%95%20%5Bx%2C%20y%2C%201%5D%E3%80%82%0A%0A%20%20%20%20%20%20%20%20%3Aparam%20point%3A%20(x%2C%20y)%E3%80%82x%20%E3%81%A8%20y%20%E3%81%AF%E9%85%8D%E5%88%97%E3%81%A7%E3%82%82%E3%82%88%E3%81%84%0A%20%20%20%20%20%20%20%20%3Areturn%3A%20%E5%9F%BA%E5%BA%95%E3%81%AE%E5%80%A4%E3%81%AE%E3%83%AA%E3%82%B9%E3%83%88%E3%80%82%E5%AE%9A%E6%95%B0%E9%A0%85%E3%81%AF%20x*0%2B1%20%E3%81%A8%E3%81%97%E3%81%A6%E5%BD%A2%E7%8A%B6%E3%82%92%E6%8F%83%E3%81%88%E3%82%8B%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20x%2C%20y%20%3D%20point%0A%20%20%20%20%20%20%20%20return%20%5Bx%2C%20y%2C%20x%20*%200%20%2B%201%5D%0A%0A%20%20%20%20def%20quad_basis(point)%3A%0A%20%20%20%20%20%20%20%20%22%22%22%E5%86%86%E9%8C%90%E6%9B%B2%E7%B7%9A%E3%81%AE%E5%9F%BA%E5%BA%95%20%5Bx%5E2%2C%202xy%2C%20y%5E2%2C%202x%2C%202y%2C%201%5D%E3%80%82%0A%0A%20%20%20%20%20%20%20%20%3Aparam%20point%3A%20(x%2C%20y)%E3%80%82x%20%E3%81%A8%20y%20%E3%81%AF%E9%85%8D%E5%88%97%E3%81%A7%E3%82%82%E3%82%88%E3%81%84%0A%20%20%20%20%20%20%20%20%3Areturn%3A%20%E5%9F%BA%E5%BA%95%E3%81%AE%E5%80%A4%E3%81%AE%E3%83%AA%E3%82%B9%E3%83%88%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20x%2C%20y%20%3D%20point%0A%20%20%20%20%20%20%20%20return%20%5Bx**2%2C%202%20*%20x%20*%20y%2C%20y**2%2C%202%20*%20x%2C%202%20*%20y%2C%20x%20*%200%20%2B%201%5D%0A%0A%20%20%20%20return%20linear_basis%2C%20quad_basis%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20ring_sample_size%20%3D%20500%0A%20%20%20%20ring_noise_sd%20%3D%200.02%0A%20%20%20%20_theta%20%3D%20np.linspace(0%2C%202%20*%20np.pi%2C%20ring_sample_size)%0A%20%20%20%20ring_clean_points%20%3D%20np.vstack(%5Bnp.cos(_theta)%2C%20np.sin(_theta)%5D).T%0A%20%20%20%20_rng%20%3D%20np.random.default_rng(7)%0A%20%20%20%20ring_points%20%3D%20ring_clean_points%20%2B%20ring_noise_sd%20*%20_rng.normal(%0A%20%20%20%20%20%20%20%200.0%2C%201.0%2C%20(ring_sample_size%2C%202)%0A%20%20%20%20)%0A%20%20%20%20plt.scatter(ring_points%5B%3A%2C%200%5D%2C%20ring_points%5B%3A%2C%201%5D%2C%20s%3D0.5)%0A%20%20%20%20plt.axis(%22equal%22)%0A%20%20%20%20plt.xlim(-2%2C%202)%0A%20%20%20%20plt.ylim(-2%2C%202)%0A%20%20%20%20plt.xlabel(%22x%22)%0A%20%20%20%20plt.ylabel(%22y%22)%0A%20%20%20%20plt.title(%22unit%20circle%20%2B%20normal%20noise%22)%0A%20%20%20%20plt.show()%0A%20%20%20%20return%20ring_clean_points%2C%20ring_points%2C%20ring_sample_size%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E6%A7%8B%E9%80%A0%E8%A1%8C%E5%88%97%E3%81%AF%E3%80%811%20%E7%82%B9%E3%81%94%E3%81%A8%E3%81%AE%20%24%5Cxi%5Cxi%5E%5Ctop%24%20%E3%82%92%E5%85%A8%E7%82%B9%E3%81%A7%E5%B9%B3%E5%9D%87%E3%81%97%E3%81%9F%E3%82%82%E3%81%AE%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%E3%81%BE%E3%81%9A%201%20%E7%82%B9%E5%88%86%E3%82%92%E8%A6%8B%E3%82%8B%E3%81%A8%E3%80%81%E3%83%A9%E3%83%B3%E3%82%AF%201%20%E3%81%AE%E5%AF%BE%E7%A7%B0%E8%A1%8C%E5%88%97%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(quad_basis%2C%20ring_points%2C%20show_matrix)%3A%0A%20%20%20%20_xi%20%3D%20quad_basis(ring_points%5B20%5D)%0A%20%20%20%20_single%20%3D%20np.outer(_xi%2C%20_xi)%0A%20%20%20%20print(f%22xi%20%3D%20%7Bnp.round(_xi%2C%204)%7D%22)%0A%20%20%20%20print(f%22rank(xi%20xi%5ET)%20%3D%20%7Bnp.linalg.matrix_rank(_single)%7D%22)%0A%20%20%20%20show_matrix(_single%2C%20%22xi%20xi%5ET%20for%20a%20single%20point%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E5%85%A8%E7%82%B9%E3%81%A7%E5%B9%B3%E5%9D%87%E3%82%92%E5%8F%96%E3%81%A3%E3%81%A6%E6%A7%8B%E9%80%A0%E8%A1%8C%E5%88%97%E3%82%92%E4%BD%9C%E3%82%8A%E3%80%81%E3%81%9D%E3%81%AE%E6%9C%80%E5%B0%8F%E5%9B%BA%E6%9C%89%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%82%92%E4%BF%82%E6%95%B0%E3%81%A8%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%E8%AA%A4%E5%B7%AE%E3%81%AA%E3%81%97%E3%81%AE%E7%82%B9%E7%BE%A4%E3%81%A8%E8%AA%A4%E5%B7%AE%E3%81%82%E3%82%8A%E3%81%AE%E7%82%B9%E7%BE%A4%E3%81%A7%E8%A1%8C%E5%88%97%E5%BC%8F%E3%82%92%E6%AF%94%E3%81%B9%E3%82%8B%E3%81%A8%E3%80%81%E4%B8%8A%E3%81%A7%E8%BF%B0%E3%81%B9%E3%81%9F%E7%89%B9%E7%95%B0%E6%80%A7%E3%81%AE%E9%81%95%E3%81%84%E3%81%8C%0A%20%20%20%20%E6%95%B0%E5%80%A4%E3%81%A8%E3%81%97%E3%81%A6%E8%A6%8B%E3%81%88%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20quad_basis%2C%0A%20%20%20%20ring_clean_points%2C%0A%20%20%20%20ring_points%2C%0A%20%20%20%20ring_sample_size%2C%0A%20%20%20%20show_matrix%2C%0A)%3A%0A%20%20%20%20ring_design%20%3D%20np.array(%5Bquad_basis(point)%20for%20point%20in%20ring_points%5D)%0A%20%20%20%20ring_moment%20%3D%20ring_design.T%20%40%20ring_design%20%2F%20ring_sample_size%0A%20%20%20%20_clean_design%20%3D%20np.array(%5Bquad_basis(point)%20for%20point%20in%20ring_clean_points%5D)%0A%20%20%20%20_clean_moment%20%3D%20_clean_design.T%20%40%20_clean_design%20%2F%20ring_sample_size%0A%20%20%20%20print(f%22det(M)%20%E8%AA%A4%E5%B7%AE%E3%81%AA%E3%81%97%20%3D%20%7Bnp.linalg.det(_clean_moment)%3A.3e%7D%22)%0A%20%20%20%20print(f%22det(M)%20%E8%AA%A4%E5%B7%AE%E3%81%82%E3%82%8A%20%3D%20%7Bnp.linalg.det(ring_moment)%3A.3e%7D%22)%0A%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20np.linalg.cholesky(ring_moment)%0A%20%20%20%20except%20np.linalg.LinAlgError%20as%20error%3A%0A%20%20%20%20%20%20%20%20print(f%22%E8%AA%A4%E5%B7%AE%E3%81%82%E3%82%8A%E3%81%AE%20M%20%E3%81%AF%E6%AD%A3%E5%AE%9A%E5%80%A4%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84%3A%20%7Berror%7D%22)%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20print(%22%E8%AA%A4%E5%B7%AE%E3%81%82%E3%82%8A%E3%81%AE%20M%20%E3%81%AF%E3%82%B3%E3%83%AC%E3%82%B9%E3%82%AD%E3%83%BC%E5%88%86%E8%A7%A3%E3%81%A7%E3%81%8D%E3%80%81%E6%AD%A3%E5%AE%9A%E5%80%A4%E3%81%A7%E3%81%82%E3%82%8B%22)%0A%20%20%20%20ring_eigenvalues%2C%20_eigenvectors%20%3D%20np.linalg.eigh(ring_moment)%0A%20%20%20%20ring_params%20%3D%20_eigenvectors%5B%3A%2C%200%5D%0A%20%20%20%20if%20ring_params%5Bnp.argmax(np.abs(ring_params))%5D%20%3C%200%3A%0A%20%20%20%20%20%20%20%20ring_params%20%3D%20-ring_params%0A%20%20%20%20_truth%20%3D%20np.array(%5B1.0%2C%200.0%2C%201.0%2C%200.0%2C%200.0%2C%20-1.0%5D)%20%2F%20np.sqrt(3.0)%0A%20%20%20%20print(f%22%E5%9B%BA%E6%9C%89%E5%80%A4%20%3D%20%7Bnp.round(ring_eigenvalues%2C%206)%7D%22)%0A%20%20%20%20print(f%22%E6%8E%A8%E5%AE%9A%E3%81%97%E3%81%9F%20a%20%3D%20%7Bnp.round(ring_params%2C%205)%7D%22)%0A%20%20%20%20print(f%22%E7%9C%9F%E3%81%AE%E5%8D%98%E4%BD%8D%E5%86%86%20x%5E2%20%2B%20y%5E2%20-%201%20%3D%200%20%E3%81%AB%E5%AF%BE%E5%BF%9C%E3%81%99%E3%82%8B%20a%20%3D%20%7Bnp.round(_truth%2C%205)%7D%22)%0A%20%20%20%20print(f%22%E6%9C%80%E5%A4%A7%E5%B7%AE%20%3D%20%7Bnp.max(np.abs(ring_params%20-%20_truth))%3A.5f%7D%22)%0A%20%20%20%20show_matrix(ring_moment%2C%20%22structure%20matrix%20M%22)%0A%20%20%20%20return%20(ring_params%2C)%0A%0A%0A%40app.cell%0Adef%20_(implicit_grid%2C%20quad_basis%2C%20ring_params%2C%20ring_points)%3A%0A%20%20%20%20ring_x_mesh%2C%20ring_y_mesh%2C%20ring_z_mesh%20%3D%20implicit_grid(quad_basis%2C%20ring_points%2C%20ring_params)%0A%20%20%20%20_extent%20%3D%20(ring_x_mesh%5B0%2C%200%5D%2C%20ring_x_mesh%5B0%2C%20-1%5D%2C%20ring_y_mesh%5B0%2C%200%5D%2C%20ring_y_mesh%5B-1%2C%200%5D)%0A%20%20%20%20plt.imshow(ring_z_mesh%2C%20origin%3D%22lower%22%2C%20extent%3D_extent)%0A%20%20%20%20plt.colorbar(label%3D%22f(x%2C%20y)%22)%0A%20%20%20%20plt.scatter(ring_points%5B%3A%2C%200%5D%2C%20ring_points%5B%3A%2C%201%5D%2C%20s%3D0.5%2C%20color%3D%22blue%22)%0A%20%20%20%20plt.contour(ring_x_mesh%2C%20ring_y_mesh%2C%20ring_z_mesh%2C%20%5B0%5D%2C%20colors%3D%22orange%22)%0A%20%20%20%20plt.axis(%22equal%22)%0A%20%20%20%20plt.xlabel(%22x%22)%0A%20%20%20%20plt.ylabel(%22y%22)%0A%20%20%20%20plt.title(%22fitted%20implicit%20function%22)%0A%20%20%20%20plt.show()%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%23%20%E5%B9%BE%E4%BD%95%E8%B7%9D%E9%9B%A2%E3%81%AE%E8%BF%91%E4%BC%BC%E3%81%A8%E8%87%AA%E5%8B%95%E5%BE%AE%E5%88%86%0A%0A%20%20%20%20RANSAC%20%E3%81%A7%20inlier%20%E3%82%92%E6%95%B0%E3%81%88%E3%82%8B%E3%81%AB%E3%81%AF%E3%80%81%E7%82%B9%E3%81%A8%E6%9B%B2%E7%B7%9A%E3%81%AE%E8%B7%9D%E9%9B%A2%E3%81%8C%E8%A6%81%E3%82%8B%E3%80%82%E3%81%97%E3%81%8B%E3%81%97%E4%BB%A3%E6%95%B0%E7%9A%84%E3%81%AA%E6%AE%8B%E5%B7%AE%0A%20%20%20%20%24(%5Cxi%2C%20a)%24%20%E3%81%AF%E8%B7%9D%E9%9B%A2%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84%E3%80%82%E6%9B%B2%E7%B7%9A%E3%81%AE%E5%8B%BE%E9%85%8D%E3%81%8C%E6%80%A5%E3%81%AA%E5%A0%B4%E6%89%80%E3%81%A7%E3%81%AF%E3%80%81%E5%90%8C%E3%81%98%20%24(%5Cxi%2C%20a)%24%20%E3%81%A7%E3%82%82%E5%AE%9F%E9%9A%9B%E3%81%AE%0A%20%20%20%20%E8%B7%9D%E9%9B%A2%E3%81%AF%E5%B0%8F%E3%81%95%E3%81%84%E3%81%8B%E3%82%89%E3%81%A7%E3%81%82%E3%82%8B%E3%80%821%20%E6%AC%A1%E3%81%AE%E3%83%86%E3%82%A4%E3%83%A9%E3%83%BC%E5%B1%95%E9%96%8B%E3%81%A7%E5%B9%BE%E4%BD%95%E8%B7%9D%E9%9B%A2%E3%81%AE%202%20%E4%B9%97%E3%82%92%E8%BF%91%E4%BC%BC%E3%81%97%E3%81%9F%E3%82%82%E3%81%AE%E3%81%8C%0A%20%20%20%20Sampson%20%E8%AA%A4%E5%B7%AE%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%24%24%0A%20%20%20%20E(x)%20%3D%20%5Cfrac%7B(%5Cxi(x)%2C%20a)%5E2%7D%7B(a%2C%5C%20V_0%5B%5Cxi(x)%5D%5C%20a)%7D%2C%0A%20%20%20%20%5Cqquad%0A%20%20%20%20V_0%5B%5Cxi%5D%20%3D%20J%20J%5E%5Ctop%2C%0A%20%20%20%20%5Cqquad%0A%20%20%20%20J_%7Bk%5Cell%7D%20%3D%20%5Cfrac%7B%5Cpartial%20%5Cxi_k%7D%7B%5Cpartial%20x_%5Cell%7D%0A%20%20%20%20%24%24%0A%0A%20%20%20%20%24V_0%5B%5Cxi%5D%24%20%E3%81%AF%E5%9F%BA%E5%BA%95%E3%81%AE%E3%83%A4%E3%82%B3%E3%83%93%E3%82%A2%E3%83%B3%E3%81%8B%E3%82%89%E6%B1%BA%E3%81%BE%E3%82%8B%E6%AD%A3%E8%A6%8F%E5%8C%96%E5%85%B1%E5%88%86%E6%95%A3%E8%A1%8C%E5%88%97%E3%81%A7%E3%80%81%E5%88%86%E6%AF%8D%E3%81%8C%E3%81%A1%E3%82%87%E3%81%86%E3%81%A9%E5%8B%BE%E9%85%8D%E3%81%AB%0A%20%20%20%20%E3%82%88%E3%82%8B%E8%A3%9C%E6%AD%A3%E3%81%AB%E3%81%82%E3%81%9F%E3%82%8B%E3%80%82%E3%83%A4%E3%82%B3%E3%83%93%E3%82%A2%E3%83%B3%E3%81%AF%E5%9F%BA%E5%BA%95%E3%81%94%E3%81%A8%E3%81%AB%E6%89%8B%E3%81%A7%E5%BE%AE%E5%88%86%E3%81%97%E3%81%A6%E3%82%82%E3%82%88%E3%81%84%E3%81%8C%E3%80%81%E5%9F%BA%E5%BA%95%E3%82%92%E5%B7%AE%E3%81%97%E6%9B%BF%E3%81%88%E3%82%8B%0A%20%20%20%20%E3%81%9F%E3%81%B3%E3%81%AB%E6%9B%B8%E3%81%8D%E7%9B%B4%E3%81%99%E3%81%93%E3%81%A8%E3%81%AB%E3%81%AA%E3%82%8B%E3%80%82%E3%81%9D%E3%81%93%E3%81%A7%E3%80%81%E5%80%A4%E3%81%A8%E5%BE%AE%E5%88%86%E4%BF%82%E6%95%B0%E3%82%92%E5%90%8C%E6%99%82%E3%81%AB%E6%8C%81%E3%81%A4%E6%95%B0%EF%BC%88%E4%BA%8C%E9%87%8D%E6%95%B0%2C%20Jet%EF%BC%89%E3%82%92%0A%20%20%20%20%E5%AE%9A%E7%BE%A9%E3%81%97%E3%80%81%E5%9F%BA%E5%BA%95%E9%96%A2%E6%95%B0%E3%81%B8%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E6%B5%81%E3%81%97%E8%BE%BC%E3%82%80%E5%89%8D%E9%80%B2%E3%83%A2%E3%83%BC%E3%83%89%E8%87%AA%E5%8B%95%E5%BE%AE%E5%88%86%E3%81%A7%E6%B1%82%E3%82%81%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%24%24%0A%20%20%20%20(a%20%2B%20b%5Cvarepsilon)(c%20%2B%20d%5Cvarepsilon)%20%3D%20ac%20%2B%20(ad%20%2B%20bc)%5Cvarepsilon%2C%0A%20%20%20%20%5Cqquad%20%5Cvarepsilon%5E2%20%3D%200%0A%20%20%20%20%24%24%0A%0A%20%20%20%20%E3%81%93%E3%81%AE%E8%A6%8F%E5%89%87%E3%82%92%E6%BC%94%E7%AE%97%E5%AD%90%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%83%AD%E3%83%BC%E3%83%89%E3%81%A7%E5%AE%9F%E8%A3%85%E3%81%99%E3%82%8C%E3%81%B0%E3%80%81%60quad_basis%60%20%E3%82%92%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88%E3%81%9A%E3%81%AB%0A%20%20%20%20%E3%83%A4%E3%82%B3%E3%83%93%E3%82%A2%E3%83%B3%E3%81%8C%E5%BE%97%E3%82%89%E3%82%8C%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.class_definition%0Aclass%20Jet%3A%0A%20%20%20%20%22%22%22%E5%80%A4%20a%20%E3%81%A8%E5%BE%AE%E5%88%86%E4%BF%82%E6%95%B0%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%20v%20%E3%82%92%E5%90%8C%E6%99%82%E3%81%AB%E9%81%8B%E3%81%B6%E4%BA%8C%E9%87%8D%E6%95%B0%E3%80%82%0A%0A%20%20%20%20Jet(x%2C%20(1%2C%200))%20%E3%81%A8%20Jet(y%2C%20(0%2C%201))%20%E3%82%92%E5%9F%BA%E5%BA%95%E9%96%A2%E6%95%B0%E3%81%B8%E6%B8%A1%E3%81%99%E3%81%A8%E3%80%81%E8%BF%94%E3%81%A3%E3%81%A6%E3%81%8D%E3%81%9F%20Jet%20%E3%81%AE%0A%20%20%20%20v%20%E3%81%8C%20(%E2%88%82%CE%BE%2F%E2%88%82x%2C%20%E2%88%82%CE%BE%2F%E2%88%82y)%20%E3%81%AB%E3%81%AA%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22%0A%0A%20%20%20%20def%20__init__(self%2C%20a%2C%20v)%3A%0A%20%20%20%20%20%20%20%20self.a%20%3D%20a%0A%20%20%20%20%20%20%20%20self.v%20%3D%20np.asarray(v%2C%20dtype%3Dfloat)%0A%0A%20%20%20%20def%20__str__(self)%3A%0A%20%20%20%20%20%20%20%20return%20f%22%7Bself.a%7D%2B%7Bself.v%7Deps%22%0A%0A%20%20%20%20def%20_coerce(self%2C%20other)%3A%0A%20%20%20%20%20%20%20%20%22%22%22%E5%AE%9A%E6%95%B0%E3%82%92%E5%BE%AE%E5%88%86%E4%BF%82%E6%95%B0%200%20%E3%81%AE%20Jet%20%E3%81%B8%E6%8F%83%E3%81%88%E3%82%8B%E3%80%82%22%22%22%0A%20%20%20%20%20%20%20%20return%20other%20if%20isinstance(other%2C%20Jet)%20else%20Jet(float(other)%2C%20np.zeros_like(self.v))%0A%0A%20%20%20%20def%20__add__(self%2C%20other)%3A%0A%20%20%20%20%20%20%20%20other%20%3D%20self._coerce(other)%0A%20%20%20%20%20%20%20%20return%20Jet(self.a%20%2B%20other.a%2C%20self.v%20%2B%20other.v)%0A%0A%20%20%20%20def%20__sub__(self%2C%20other)%3A%0A%20%20%20%20%20%20%20%20other%20%3D%20self._coerce(other)%0A%20%20%20%20%20%20%20%20return%20Jet(self.a%20-%20other.a%2C%20self.v%20-%20other.v)%0A%0A%20%20%20%20def%20__mul__(self%2C%20other)%3A%0A%20%20%20%20%20%20%20%20other%20%3D%20self._coerce(other)%0A%20%20%20%20%20%20%20%20return%20Jet(self.a%20*%20other.a%2C%20self.a%20*%20other.v%20%2B%20self.v%20*%20other.a)%0A%0A%20%20%20%20def%20__truediv__(self%2C%20other)%3A%0A%20%20%20%20%20%20%20%20other%20%3D%20self._coerce(other)%0A%20%20%20%20%20%20%20%20return%20Jet(self.a%20%2F%20other.a%2C%20self.v%20%2F%20other.a%20-%20self.a%20*%20other.v%20%2F%20other.a**2)%0A%0A%20%20%20%20def%20__pow__(self%2C%20other)%3A%0A%20%20%20%20%20%20%20%20other%20%3D%20self._coerce(other)%0A%20%20%20%20%20%20%20%20value%20%3D%20self.a**other.a%0A%20%20%20%20%20%20%20%20base_diff%20%3D%20other.a%20*%20self.a%20**%20(other.a%20-%201)%20*%20self.v%0A%20%20%20%20%20%20%20%20%23%20%E5%BA%95%E3%81%8C%200%20%E3%81%AE%E3%81%A8%E3%81%8D%20log%20%E3%81%8C%E7%99%BA%E6%95%A3%E3%81%99%E3%82%8B%E3%81%AE%E3%81%A7%E3%80%81%E6%8C%87%E6%95%B0%E5%81%B4%E3%81%AE%E5%BE%AE%E5%88%86%E3%81%AF%E8%90%BD%E3%81%A8%E3%81%99%E3%80%82%0A%20%20%20%20%20%20%20%20exp_diff%20%3D%200.0%20if%20np.isclose(self.a%2C%200.0)%20else%20value%20*%20other.v%20*%20np.log(np.abs(self.a))%0A%20%20%20%20%20%20%20%20return%20Jet(value%2C%20base_diff%20%2B%20exp_diff)%0A%0A%20%20%20%20def%20__radd__(self%2C%20other)%3A%0A%20%20%20%20%20%20%20%20return%20self.__add__(other)%0A%0A%20%20%20%20def%20__rsub__(self%2C%20other)%3A%0A%20%20%20%20%20%20%20%20%23%20%E6%B1%82%E3%82%81%E3%81%9F%E3%81%84%E3%81%AE%E3%81%AF%20other%20-%20self%20%E3%81%A7%E3%81%82%E3%81%A3%E3%81%A6%20self%20-%20other%20%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84%E3%80%82%0A%20%20%20%20%20%20%20%20return%20self._coerce(other).__sub__(self)%0A%0A%20%20%20%20def%20__rmul__(self%2C%20other)%3A%0A%20%20%20%20%20%20%20%20return%20self.__mul__(other)%0A%0A%20%20%20%20def%20__rtruediv__(self%2C%20other)%3A%0A%20%20%20%20%20%20%20%20return%20self._coerce(other).__truediv__(self)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E5%AE%9A%E7%BE%A9%E3%81%97%E3%81%9F%20%60Jet%60%20%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%83%A4%E3%82%B3%E3%83%93%E3%82%A2%E3%83%B3%E3%81%A8%E6%AD%A3%E8%A6%8F%E5%8C%96%E5%85%B1%E5%88%86%E6%95%A3%E8%A1%8C%E5%88%97%E3%82%92%E7%B5%84%E3%81%BF%E7%AB%8B%E3%81%A6%E3%82%8B%E3%80%82%0A%20%20%20%20%E5%86%86%E9%8C%90%E6%9B%B2%E7%B7%9A%E3%81%AE%E5%9F%BA%E5%BA%95%E3%81%AA%E3%82%89%E8%A7%A3%E6%9E%90%E7%9A%84%E3%81%AA%E3%83%A4%E3%82%B3%E3%83%93%E3%82%A2%E3%83%B3%E3%82%82%E6%9B%B8%E3%81%91%E3%82%8B%E3%81%AE%E3%81%A7%E3%80%81%E4%B8%A1%E8%80%85%E3%81%8C%E4%B8%80%E8%87%B4%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%82%92%0A%20%20%20%20%E7%A2%BA%E8%AA%8D%E3%81%97%E3%81%A6%E3%81%8A%E3%81%8F%E3%80%82%E3%81%82%E3%82%8F%E3%81%9B%E3%81%A6%E3%80%81%E5%AE%9A%E6%95%B0%E3%82%92%E5%B7%A6%E3%81%AB%E7%BD%AE%E3%81%84%E3%81%9F%E6%B8%9B%E7%AE%97%EF%BC%88%60__rsub__%60%EF%BC%89%E3%81%8C%E7%AC%A6%E5%8F%B7%E3%82%92%E5%8F%96%E3%82%8A%E9%81%95%E3%81%88%E3%81%A6%0A%20%20%20%20%E3%81%84%E3%81%AA%E3%81%84%E3%81%93%E3%81%A8%E3%82%82%E7%A2%BA%E3%81%8B%E3%82%81%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(quad_basis)%3A%0A%20%20%20%20def%20jet_jacobian(basis_func%2C%20point)%3A%0A%20%20%20%20%20%20%20%20%22%22%22%E5%9F%BA%E5%BA%95%E9%96%A2%E6%95%B0%E3%81%AE%E3%83%A4%E3%82%B3%E3%83%93%E3%82%A2%E3%83%B3%20%E2%88%82%CE%BE_k%2F%E2%88%82x_l%20%E3%82%92%E8%87%AA%E5%8B%95%E5%BE%AE%E5%88%86%E3%81%A7%E6%B1%82%E3%82%81%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%20%20%20%20%3Aparam%20basis_func%3A%20%E5%9F%BA%E5%BA%95%E9%96%A2%E6%95%B0%0A%20%20%20%20%20%20%20%20%3Aparam%20point%3A%20%E5%BD%A2%E7%8A%B6%20(2%2C)%20%E3%81%AE%E7%82%B9%0A%20%20%20%20%20%20%20%20%3Areturn%3A%20%E5%BD%A2%E7%8A%B6%20(%E5%9F%BA%E5%BA%95%E3%81%AE%E6%95%B0%2C%202)%20%E3%81%AE%E3%83%A4%E3%82%B3%E3%83%93%E3%82%A2%E3%83%B3%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20jets%20%3D%20%5BJet(point%5Bindex%5D%2C%20np.eye(len(point))%5Bindex%5D)%20for%20index%20in%20range(len(point))%5D%0A%20%20%20%20%20%20%20%20outputs%20%3D%20basis_func(jets)%0A%20%20%20%20%20%20%20%20return%20np.array(%0A%20%20%20%20%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20(output%20if%20isinstance(output%2C%20Jet)%20else%20Jet(float(output)%2C%20np.zeros(len(point)))).v%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20output%20in%20outputs%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20def%20normalized_cov(basis_func%2C%20point)%3A%0A%20%20%20%20%20%20%20%20%22%22%22%E6%AD%A3%E8%A6%8F%E5%8C%96%E5%85%B1%E5%88%86%E6%95%A3%E8%A1%8C%E5%88%97%20V0%5B%CE%BE%5D%20%3D%20J%20J%5ET%E3%80%82%0A%0A%20%20%20%20%20%20%20%20%3Aparam%20basis_func%3A%20%E5%9F%BA%E5%BA%95%E9%96%A2%E6%95%B0%0A%20%20%20%20%20%20%20%20%3Aparam%20point%3A%20%E5%BD%A2%E7%8A%B6%20(2%2C)%20%E3%81%AE%E7%82%B9%0A%20%20%20%20%20%20%20%20%3Areturn%3A%20%E5%BD%A2%E7%8A%B6%20(%E5%9F%BA%E5%BA%95%E3%81%AE%E6%95%B0%2C%20%E5%9F%BA%E5%BA%95%E3%81%AE%E6%95%B0)%20%E3%81%AE%E5%AF%BE%E7%A7%B0%E8%A1%8C%E5%88%97%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20jacobian%20%3D%20jet_jacobian(basis_func%2C%20point)%0A%20%20%20%20%20%20%20%20return%20jacobian%20%40%20jacobian.T%0A%0A%20%20%20%20_point%20%3D%20np.array(%5B1.7%2C%20-0.4%5D)%0A%20%20%20%20_x%2C%20_y%20%3D%20_point%0A%20%20%20%20_analytic%20%3D%20np.array(%0A%20%20%20%20%20%20%20%20%5B%5B2%20*%20_x%2C%200.0%5D%2C%20%5B2%20*%20_y%2C%202%20*%20_x%5D%2C%20%5B0.0%2C%202%20*%20_y%5D%2C%20%5B2.0%2C%200.0%5D%2C%20%5B0.0%2C%202.0%5D%2C%20%5B0.0%2C%200.0%5D%5D%0A%20%20%20%20)%0A%20%20%20%20_diff%20%3D%20np.max(np.abs(jet_jacobian(quad_basis%2C%20_point)%20-%20_analytic))%0A%20%20%20%20print(f%22%E8%87%AA%E5%8B%95%E5%BE%AE%E5%88%86%E3%81%A8%E8%A7%A3%E6%9E%90%E8%A7%A3%E3%81%AE%E3%83%A4%E3%82%B3%E3%83%93%E3%82%A2%E3%83%B3%E3%81%AE%E6%9C%80%E5%A4%A7%E5%B7%AE%20%3D%20%7B_diff%3A.3e%7D%22)%0A%20%20%20%20print(f%225%20-%20Jet(2%2C%20(1%2C%200))%20%3D%20%7B5%20-%20Jet(2.0%2C%20(1.0%2C%200.0))%7D%22)%0A%20%20%20%20return%20(normalized_cov%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%23%20RANSAC%20%E3%82%AF%E3%83%A9%E3%82%B9%0A%0A%20%20%20%20%E5%89%8D%E7%AF%80%E3%81%BE%E3%81%A7%E3%81%AE%E9%83%A8%E5%93%81%E3%82%92%E3%81%BE%E3%81%A8%E3%82%81%E3%82%8B%E3%80%82%E5%9F%BA%E5%BA%95%E9%96%A2%E6%95%B0%E3%82%92%E5%B7%AE%E3%81%97%E6%9B%BF%E3%81%88%E3%82%8B%E3%81%A0%E3%81%91%E3%81%A7%E7%9B%B4%E7%B7%9A%E3%81%AB%E3%82%82%E5%86%86%E9%8C%90%E6%9B%B2%E7%B7%9A%E3%81%AB%E3%82%82%E4%BD%BF%E3%81%88%E3%82%8B%E3%80%82%0A%0A%20%20%20%20-%20%60fit(points)%60%3A%20%E6%A7%8B%E9%80%A0%E8%A1%8C%E5%88%97%E3%81%AE%E6%9C%80%E5%B0%8F%E5%9B%BA%E6%9C%89%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%82%92%E8%BF%94%E3%81%99%E3%80%82%E5%9B%BA%E6%9C%89%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%81%AE%E7%AC%A6%E5%8F%B7%E3%81%AF%E4%B8%8D%E5%AE%9A%E3%81%AA%E3%81%AE%E3%81%A7%E3%80%81%0A%20%20%20%20%20%20%E7%B5%B6%E5%AF%BE%E5%80%A4%E3%81%8C%E6%9C%80%E5%A4%A7%E3%81%AE%E6%88%90%E5%88%86%E3%81%8C%E6%AD%A3%E3%81%AB%E3%81%AA%E3%82%8B%E3%82%88%E3%81%86%E6%8F%83%E3%81%88%E3%82%8B%E3%80%82%E7%AC%AC%202%20%E8%BF%94%E3%82%8A%E5%80%A4%E3%81%AF%E6%AE%8B%E5%B7%AE%E4%BA%8C%E4%B9%97%E5%92%8C%0A%20%20%20%20%20%20%24%5Csum_i%20(%5Cxi_i%2C%20a)%5E2%24%20%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20-%20%60sampson_errors(design%2C%20cov_stack%2C%20params)%60%3A%20%E5%85%A8%E7%82%B9%E3%81%AE%20Sampson%20%E8%AA%A4%E5%B7%AE%E3%82%92%E3%81%BE%E3%81%A8%E3%82%81%E3%81%A6%E8%A8%88%E7%AE%97%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%20%20%24V_0%5B%5Cxi%5D%24%20%E3%81%AF%E7%82%B9%E3%81%A0%E3%81%91%E3%81%A7%E6%B1%BA%E3%81%BE%E3%82%8A%E4%BF%82%E6%95%B0%E3%81%AB%E4%BE%9D%E5%AD%98%E3%81%97%E3%81%AA%E3%81%84%E3%81%AE%E3%81%A7%E3%80%81%60execute%60%20%E3%81%AE%E5%86%92%E9%A0%AD%E3%81%A7%E4%B8%80%E5%BA%A6%E3%81%A0%E3%81%91%0A%20%20%20%20%20%20%E4%BD%9C%E3%81%A3%E3%81%A6%E4%BD%BF%E3%81%84%E5%9B%9E%E3%81%99%E3%80%82%E3%81%93%E3%82%8C%E3%81%A7%201%20%E8%A9%A6%E8%A1%8C%E3%81%82%E3%81%9F%E3%82%8A%E3%81%AE%E8%A8%88%E7%AE%97%E3%81%8C%20numpy%20%E3%81%AE%E8%A1%8C%E5%88%97%E6%BC%94%E7%AE%97%E3%81%A0%E3%81%91%E3%81%A7%E6%B8%88%E3%82%80%E3%80%82%0A%20%20%20%20-%20%60execute(points%2C%20distance_th)%60%3A%20%E8%A9%A6%E8%A1%8C%E3%82%92%E7%B9%B0%E3%82%8A%E8%BF%94%E3%81%97%E3%81%A6%E6%9C%80%E8%89%AF%E3%81%AE%20inlier%20%E9%9B%86%E5%90%88%E3%82%92%E9%81%B8%E3%81%B3%E3%80%81%E6%9C%80%E5%BE%8C%E3%81%AB%0A%20%20%20%20%20%20inlier%20%E3%81%A0%E3%81%91%E3%81%A7%E5%86%8D%E3%83%95%E3%82%A3%E3%83%83%E3%83%88%E3%81%99%E3%82%8B%E3%80%82inlier%20%E6%95%B0%E3%81%AE%E6%9C%80%E5%A4%A7%E5%80%A4%E3%82%92%E6%9B%B4%E6%96%B0%E3%81%99%E3%82%8B%E3%81%9F%E3%81%B3%E3%81%AB%E8%A9%A6%E8%A1%8C%E5%9B%9E%E6%95%B0%E3%81%AE%E4%B8%8A%E9%99%90%E3%82%92%0A%20%20%20%20%20%20%E8%A8%88%E7%AE%97%E3%81%97%E7%9B%B4%E3%81%97%E3%81%A6%E6%97%A9%E6%9C%9F%E3%81%AB%E6%89%93%E3%81%A1%E5%88%87%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(iteration_budget%2C%20normalized_cov)%3A%0A%20%20%20%20class%20ImplicitRansac%3A%0A%20%20%20%20%20%20%20%20%22%22%22%E9%99%B0%E9%96%A2%E6%95%B0%20(%CE%BE%2C%20a)%20%3D%200%20%E3%82%92%20RANSAC%20%E3%81%A7%E5%BD%93%E3%81%A6%E3%81%AF%E3%82%81%E3%82%8B%E3%80%82%22%22%22%0A%0A%20%20%20%20%20%20%20%20def%20__init__(self%2C%20basis_func%2C%20target_prob%3D0.9999%2C%20seed%3D0)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Aparam%20basis_func%3A%20%E5%9F%BA%E5%BA%95%E9%96%A2%E6%95%B0%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Aparam%20target_prob%3A%20RANSAC%20%E3%82%92%E6%88%90%E5%8A%9F%E3%81%95%E3%81%9B%E3%81%9F%E3%81%84%E7%A2%BA%E7%8E%87%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Aparam%20seed%3A%20%E4%B9%B1%E6%95%B0%E3%81%AE%E7%A8%AE%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20self.basis_func%20%3D%20basis_func%0A%20%20%20%20%20%20%20%20%20%20%20%20self.target_prob%20%3D%20target_prob%0A%20%20%20%20%20%20%20%20%20%20%20%20self.seed%20%3D%20seed%0A%0A%20%20%20%20%20%20%20%20def%20fit(self%2C%20points)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%E7%82%B9%E7%BE%A4%E3%81%B8%E4%BB%A3%E6%95%B0%E7%9A%84%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%97%E3%82%92%E5%BD%93%E3%81%A6%E3%81%AF%E3%82%81%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Aparam%20points%3A%20%E5%BD%A2%E7%8A%B6%20(N%2C%202)%20%E3%81%AE%E7%82%B9%E7%BE%A4%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Areturn%3A%20(%E5%8D%98%E4%BD%8D%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%81%B8%E6%AD%A3%E8%A6%8F%E5%8C%96%E3%81%97%E3%81%9F%E4%BF%82%E6%95%B0%2C%20%E6%AE%8B%E5%B7%AE%E4%BA%8C%E4%B9%97%E5%92%8C)%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20design%20%3D%20np.array(%5Bself.basis_func(point)%20for%20point%20in%20points%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20moment%20%3D%20design.T%20%40%20design%20%2F%20len(design)%0A%20%20%20%20%20%20%20%20%20%20%20%20values%2C%20vectors%20%3D%20np.linalg.eigh(moment)%0A%20%20%20%20%20%20%20%20%20%20%20%20params%20%3D%20vectors%5B%3A%2C%200%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20params%5Bnp.argmax(np.abs(params))%5D%20%3C%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20params%20%3D%20-params%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20params%2C%20values%5B0%5D%20*%20len(design)%0A%0A%20%20%20%20%20%20%20%20%40staticmethod%0A%20%20%20%20%20%20%20%20def%20sampson_errors(design%2C%20cov_stack%2C%20params)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%E5%85%A8%E7%82%B9%E3%81%AE%20Sampson%20%E8%AA%A4%E5%B7%AE%EF%BC%88%E5%B9%BE%E4%BD%95%E8%B7%9D%E9%9B%A2%E3%81%AE%202%20%E4%B9%97%E3%81%AE%E8%BF%91%E4%BC%BC%EF%BC%89%E3%82%92%E8%BF%94%E3%81%99%E3%80%82%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Aparam%20design%3A%20%E5%BD%A2%E7%8A%B6%20(N%2C%20m)%20%E3%81%AE%E5%9F%BA%E5%BA%95%E3%81%AE%E5%80%A4%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Aparam%20cov_stack%3A%20%E5%BD%A2%E7%8A%B6%20(N%2C%20m%2C%20m)%20%E3%81%AE%E6%AD%A3%E8%A6%8F%E5%8C%96%E5%85%B1%E5%88%86%E6%95%A3%E8%A1%8C%E5%88%97%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Aparam%20params%3A%20%E5%BD%A2%E7%8A%B6%20(m%2C)%20%E3%81%AE%E4%BF%82%E6%95%B0%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Areturn%3A%20%E5%BD%A2%E7%8A%B6%20(N%2C)%20%E3%81%AE%20Sampson%20%E8%AA%A4%E5%B7%AE%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20numerator%20%3D%20(design%20%40%20params)%20**%202%0A%20%20%20%20%20%20%20%20%20%20%20%20denominator%20%3D%20np.einsum(%22i%2Cnij%2Cj-%3En%22%2C%20params%2C%20cov_stack%2C%20params)%0A%20%20%20%20%20%20%20%20%20%20%20%20with%20np.errstate(divide%3D%22ignore%22%2C%20invalid%3D%22ignore%22)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20errors%20%3D%20numerator%20%2F%20denominator%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20np.where(np.isfinite(errors)%2C%20errors%2C%20np.inf)%0A%0A%20%20%20%20%20%20%20%20def%20execute(self%2C%20points%2C%20distance_th%2C%20inlier_ratio%3D0.1)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22RANSAC%20%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Aparam%20points%3A%20%E5%BD%A2%E7%8A%B6%20(N%2C%202)%20%E3%81%AE%E7%82%B9%E7%BE%A4%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Aparam%20distance_th%3A%20inlier%20%E3%81%A8%E8%A6%8B%E3%81%AA%E3%81%99%E5%B9%BE%E4%BD%95%E8%B7%9D%E9%9B%A2%E3%81%AE%E9%96%BE%E5%80%A4%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Aparam%20inlier_ratio%3A%20inlier%20%E7%8E%87%E3%81%AE%E5%88%9D%E6%9C%9F%E8%A6%8B%E7%A9%8D%E3%82%82%E3%82%8A%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Areturn%3A%20(%E4%BF%82%E6%95%B0%2C%20inlier%20%E3%83%9E%E3%82%B9%E3%82%AF%2C%20inlier%20%E3%81%A7%E3%81%AE%E6%AE%8B%E5%B7%AE%E4%BA%8C%E4%B9%97%E5%92%8C%2C%20%E8%A9%A6%E8%A1%8C%E5%9B%9E%E6%95%B0)%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20rng%20%3D%20np.random.default_rng(self.seed)%0A%20%20%20%20%20%20%20%20%20%20%20%20design%20%3D%20np.array(%5Bself.basis_func(point)%20for%20point%20in%20points%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20cov_stack%20%3D%20np.array(%5Bnormalized_cov(self.basis_func%2C%20point)%20for%20point%20in%20points%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20sample_points%20%3D%20design.shape%5B1%5D%20-%201%0A%20%20%20%20%20%20%20%20%20%20%20%20budget%20%3D%20iteration_budget(inlier_ratio%2C%20sample_points%2C%20self.target_prob)%0A%20%20%20%20%20%20%20%20%20%20%20%20best_mask%20%3D%20np.zeros(len(points)%2C%20dtype%3Dbool)%0A%20%20%20%20%20%20%20%20%20%20%20%20iterations%20%3D%200%0A%20%20%20%20%20%20%20%20%20%20%20%20while%20iterations%20%3C%20budget%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20index%20%3D%20rng.choice(len(points)%2C%20size%3Dsample_points%2C%20replace%3DFalse)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20params%2C%20_%20%3D%20self.fit(points%5Bindex%2C%20%3A%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mask%20%3D%20self.sampson_errors(design%2C%20cov_stack%2C%20params)%20%3C%20distance_th**2%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20iterations%20%3D%20iterations%20%2B%201%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20mask.sum()%20%3E%20best_mask.sum()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20best_mask%20%3D%20mask%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20budget%20%3D%20min(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20budget%2C%20iteration_budget(mask.mean()%2C%20sample_points%2C%20self.target_prob)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20best_params%2C%20residual%20%3D%20self.fit(points%5Bbest_mask%2C%20%3A%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20best_params%2C%20best_mask%2C%20residual%2C%20iterations%0A%0A%20%20%20%20return%20(ImplicitRansac%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%23%20%E7%9B%B4%E7%B7%9A%E3%81%A7%E3%81%AE%E5%8B%95%E4%BD%9C%E7%A2%BA%E8%AA%8D%0A%0A%20%20%20%20%E5%AE%9F%E8%A3%85%E3%81%AE%E7%A2%BA%E8%AA%8D%E3%81%AE%E3%81%9F%E3%82%81%E3%80%81%E3%81%BE%E3%81%9A%E9%99%BD%E9%96%A2%E6%95%B0%E3%81%AE%E7%AF%80%E3%81%A8%E5%90%8C%E3%81%98%E3%82%B3%E3%83%BC%E3%82%B7%E3%83%BC%E8%AA%A4%E5%B7%AE%E4%BB%98%E3%81%8D%E3%81%AE%E7%9B%B4%E7%B7%9A%E3%83%87%E3%83%BC%E3%82%BF%E3%81%B8%E9%81%A9%E7%94%A8%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%E7%9B%B4%E7%B7%9A%E3%81%AE%E5%9F%BA%E5%BA%95%E3%81%AF%203%20%E5%80%8B%E3%81%AA%E3%81%AE%E3%81%A7%E3%80%811%20%E5%9B%9E%E3%81%AE%E8%A9%A6%E8%A1%8C%E3%81%A7%E5%BC%95%E3%81%8F%E7%82%B9%E3%81%AF%202%20%E7%82%B9%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(ImplicitRansac%2C%20linear_basis)%3A%0A%20%20%20%20implicit_line_sample_size%20%3D%201000%0A%20%20%20%20_rng%20%3D%20np.random.default_rng(8)%0A%20%20%20%20_x%20%3D%20np.linspace(0%2C%2010%2C%20implicit_line_sample_size)%0A%20%20%20%20_y%20%3D%20_x%20%2B%20_rng.standard_cauchy(implicit_line_sample_size)%20%2F%2010%0A%20%20%20%20implicit_line_points%20%3D%20np.vstack(%5B_x%2C%20_y%5D).T%0A%20%20%20%20implicit_line_params%2C%20implicit_line_mask%2C%20_residual%2C%20_iterations%20%3D%20ImplicitRansac(%0A%20%20%20%20%20%20%20%20linear_basis%2C%20seed%3D9%0A%20%20%20%20).execute(implicit_line_points%2C%20distance_th%3D0.3)%0A%20%20%20%20_slope%20%3D%20-implicit_line_params%5B0%5D%20%2F%20implicit_line_params%5B1%5D%0A%20%20%20%20_intercept%20%3D%20-implicit_line_params%5B2%5D%20%2F%20implicit_line_params%5B1%5D%0A%20%20%20%20print(f%22%E8%A9%A6%E8%A1%8C%E5%9B%9E%E6%95%B0%20%3D%20%7B_iterations%7D%22)%0A%20%20%20%20print(f%22inlier%20%3D%20%7Bint(implicit_line_mask.sum())%7D%20%2F%20%7Bimplicit_line_sample_size%7D%22)%0A%20%20%20%20print(f%22%E4%BF%82%E6%95%B0%20a%20%3D%20%7Bnp.round(implicit_line_params%2C%205)%7D%22)%0A%20%20%20%20print(f%22y%20%3D%20ax%20%2B%20b%20%E3%81%AE%E5%BD%A2%E3%81%B8%E7%9B%B4%E3%81%99%E3%81%A8%20(%E5%82%BE%E3%81%8D%2C%20%E5%88%87%E7%89%87)%20%3D%20(%7B_slope%3A.5f%7D%2C%20%7B_intercept%3A.5f%7D)%22)%0A%20%20%20%20print(%22%E7%9C%9F%E3%81%AE%E7%9B%B4%E7%B7%9A%E3%81%AF%20y%20%3D%20x%20%E3%81%AA%E3%81%AE%E3%81%A7%20(%E5%82%BE%E3%81%8D%2C%20%E5%88%87%E7%89%87)%20%3D%20(1.0%2C%200.0)%22)%0A%20%20%20%20return%20implicit_line_mask%2C%20implicit_line_params%2C%20implicit_line_points%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20implicit_grid%2C%0A%20%20%20%20implicit_line_mask%2C%0A%20%20%20%20implicit_line_params%2C%0A%20%20%20%20implicit_line_points%2C%0A%20%20%20%20linear_basis%2C%0A)%3A%0A%20%20%20%20plt.scatter(%0A%20%20%20%20%20%20%20%20implicit_line_points%5B~implicit_line_mask%2C%200%5D%2C%0A%20%20%20%20%20%20%20%20implicit_line_points%5B~implicit_line_mask%2C%201%5D%2C%0A%20%20%20%20%20%20%20%20s%3D0.5%2C%0A%20%20%20%20%20%20%20%20color%3D%22blue%22%2C%0A%20%20%20%20%20%20%20%20label%3D%22outlier%22%2C%0A%20%20%20%20)%0A%20%20%20%20plt.scatter(%0A%20%20%20%20%20%20%20%20implicit_line_points%5Bimplicit_line_mask%2C%200%5D%2C%0A%20%20%20%20%20%20%20%20implicit_line_points%5Bimplicit_line_mask%2C%201%5D%2C%0A%20%20%20%20%20%20%20%20s%3D0.5%2C%0A%20%20%20%20%20%20%20%20color%3D%22orange%22%2C%0A%20%20%20%20%20%20%20%20label%3D%22inlier%22%2C%0A%20%20%20%20)%0A%20%20%20%20plt.contour(%0A%20%20%20%20%20%20%20%20*implicit_grid(linear_basis%2C%20implicit_line_points%2C%20implicit_line_params)%2C%0A%20%20%20%20%20%20%20%20%5B0%5D%2C%0A%20%20%20%20%20%20%20%20colors%3D%22green%22%2C%0A%20%20%20%20)%0A%20%20%20%20plt.ylim(-1%2C%2011)%0A%20%20%20%20plt.xlabel(%22x%22)%0A%20%20%20%20plt.ylabel(%22y%22)%0A%20%20%20%20plt.legend()%0A%20%20%20%20plt.show()%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%23%20%E6%A5%95%E5%86%86%E3%81%A7%E3%81%AE%E5%8B%95%E4%BD%9C%E7%A2%BA%E8%AA%8D%0A%0A%20%20%20%20%E9%99%BD%E9%96%A2%E6%95%B0%E3%81%A7%E3%81%AF%E6%89%B1%E3%81%88%E3%81%AA%E3%81%84%E5%BD%A2%E3%81%AE%E4%BE%8B%E3%81%A8%E3%81%97%E3%81%A6%E3%80%81%E5%82%BE%E3%81%84%E3%81%9F%E6%A5%95%E5%86%86%E3%82%92%E5%BD%93%E3%81%A6%E3%81%AF%E3%82%81%E3%82%8B%E3%80%82%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AF%E5%8D%8A%E8%BB%B8%E9%95%B7%0A%20%20%20%20%24(2%2C%203)%24%20%E3%81%AE%E6%A5%95%E5%86%86%E3%82%92%20%24-30%5E%5Ccirc%24%20%E5%9B%9E%E8%BB%A2%E3%81%97%E3%80%81%E4%B8%AD%E5%BF%83%E3%82%92%20%24(1%2C%202)%24%20%E3%81%B8%E5%B9%B3%E8%A1%8C%E7%A7%BB%E5%8B%95%E3%81%97%E3%81%A6%E4%BD%9C%E3%82%8B%E3%80%82%0A%20%20%20%20%E8%AA%A4%E5%B7%AE%E3%81%AF%E3%82%B3%E3%83%BC%E3%82%B7%E3%83%BC%E5%88%86%E5%B8%83%E3%82%92%20%241%2F100%24%20%E3%81%AB%E7%B8%AE%E3%82%81%E3%81%9F%E3%82%82%E3%81%AE%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(rotation_matrix)%3A%0A%20%20%20%20ellipse_sample_size%20%3D%20500%0A%20%20%20%20ellipse_true_center%20%3D%20np.array(%5B1.0%2C%202.0%5D)%0A%20%20%20%20ellipse_true_semi_axes%20%3D%20np.array(%5B2.0%2C%203.0%5D)%0A%20%20%20%20ellipse_true_angle%20%3D%20-30.0%0A%20%20%20%20_theta%20%3D%20np.linspace(0%2C%202%20*%20np.pi%2C%20ellipse_sample_size)%0A%20%20%20%20_base%20%3D%20np.vstack(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20ellipse_true_semi_axes%5B0%5D%20*%20np.cos(_theta)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20ellipse_true_semi_axes%5B1%5D%20*%20np.sin(_theta)%2C%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20).T%0A%20%20%20%20ellipse_clean_points%20%3D%20_base%20%40%20rotation_matrix(ellipse_true_angle).T%20%2B%20ellipse_true_center%0A%20%20%20%20_rng%20%3D%20np.random.default_rng(10)%0A%20%20%20%20ellipse_points%20%3D%20ellipse_clean_points%20%2B%200.01%20*%20_rng.standard_cauchy((ellipse_sample_size%2C%202))%0A%20%20%20%20plt.scatter(ellipse_points%5B%3A%2C%200%5D%2C%20ellipse_points%5B%3A%2C%201%5D%2C%20s%3D0.5)%0A%20%20%20%20plt.axis(%22equal%22)%0A%20%20%20%20plt.xlabel(%22x%22)%0A%20%20%20%20plt.ylabel(%22y%22)%0A%20%20%20%20plt.title(%22rotated%20ellipse%20%2B%20Cauchy%20noise%22)%0A%20%20%20%20plt.show()%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20ellipse_clean_points%2C%0A%20%20%20%20%20%20%20%20ellipse_points%2C%0A%20%20%20%20%20%20%20%20ellipse_sample_size%2C%0A%20%20%20%20%20%20%20%20ellipse_true_angle%2C%0A%20%20%20%20%20%20%20%20ellipse_true_center%2C%0A%20%20%20%20%20%20%20%20ellipse_true_semi_axes%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20ImplicitRansac%2C%0A%20%20%20%20describe_conic%2C%0A%20%20%20%20ellipse_points%2C%0A%20%20%20%20ellipse_sample_size%2C%0A%20%20%20%20ellipse_true_angle%2C%0A%20%20%20%20ellipse_true_center%2C%0A%20%20%20%20ellipse_true_semi_axes%2C%0A%20%20%20%20quad_basis%2C%0A)%3A%0A%20%20%20%20ellipse_params%2C%20ellipse_mask%2C%20ellipse_residual%2C%20_iterations%20%3D%20ImplicitRansac(%0A%20%20%20%20%20%20%20%20quad_basis%2C%20seed%3D11%0A%20%20%20%20).execute(ellipse_points%2C%20distance_th%3D0.07)%0A%20%20%20%20_center%2C%20_semi_axes%2C%20_angles%20%3D%20describe_conic(ellipse_params)%0A%20%20%20%20print(f%22%E8%A9%A6%E8%A1%8C%E5%9B%9E%E6%95%B0%20%3D%20%7B_iterations%7D%22)%0A%20%20%20%20print(f%22inlier%20%3D%20%7Bint(ellipse_mask.sum())%7D%20%2F%20%7Bellipse_sample_size%7D%22)%0A%20%20%20%20print(f%22%E4%BF%82%E6%95%B0%20a%20%3D%20%7Bnp.round(ellipse_params%2C%205)%7D%22)%0A%20%20%20%20print(f%22%E6%8E%A8%E5%AE%9A%20%E4%B8%AD%E5%BF%83%20%20%20%3D%20%7Bnp.round(_center%2C%204)%7D%20%2F%20%E7%9C%9F%E5%80%A4%20%3D%20%7Bellipse_true_center%7D%22)%0A%20%20%20%20print(f%22%E6%8E%A8%E5%AE%9A%20%E5%8D%8A%E8%BB%B8%E9%95%B7%20%3D%20%7Bnp.round(_semi_axes%2C%204)%7D%20%2F%20%E7%9C%9F%E5%80%A4%20%3D%20%7Bellipse_true_semi_axes%7D%22)%0A%20%20%20%20print(f%22%E6%8E%A8%E5%AE%9A%20%E5%90%91%E3%81%8D%20%20%20%3D%20%7Bnp.round(_angles%2C%203)%7D%20%E5%BA%A6%20%2F%20%E7%9C%9F%E5%80%A4%20%3D%20%7Bellipse_true_angle%7D%20%E5%BA%A6%E3%81%A8%E3%81%9D%E3%81%AE%E7%9B%B4%E4%BA%A4%E6%96%B9%E5%90%91%22)%0A%20%20%20%20print(f%22%E4%B8%AD%E5%BF%83%E3%81%AE%E8%AA%A4%E5%B7%AE%20%20%20%3D%20%7Bnp.linalg.norm(_center%20-%20ellipse_true_center)%3A.5f%7D%22)%0A%20%20%20%20print(f%22%E5%8D%8A%E8%BB%B8%E9%95%B7%E3%81%AE%E8%AA%A4%E5%B7%AE%20%3D%20%7Bnp.max(np.abs(_semi_axes%20-%20ellipse_true_semi_axes))%3A.5f%7D%22)%0A%20%20%20%20return%20ellipse_mask%2C%20ellipse_params%2C%20ellipse_residual%0A%0A%0A%40app.cell%0Adef%20_(ellipse_mask%2C%20ellipse_params%2C%20ellipse_points%2C%20implicit_grid%2C%20quad_basis)%3A%0A%20%20%20%20plt.scatter(%0A%20%20%20%20%20%20%20%20ellipse_points%5B~ellipse_mask%2C%200%5D%2C%0A%20%20%20%20%20%20%20%20ellipse_points%5B~ellipse_mask%2C%201%5D%2C%0A%20%20%20%20%20%20%20%20s%3D0.5%2C%0A%20%20%20%20%20%20%20%20color%3D%22blue%22%2C%0A%20%20%20%20%20%20%20%20label%3D%22outlier%22%2C%0A%20%20%20%20)%0A%20%20%20%20plt.scatter(%0A%20%20%20%20%20%20%20%20ellipse_points%5Bellipse_mask%2C%200%5D%2C%0A%20%20%20%20%20%20%20%20ellipse_points%5Bellipse_mask%2C%201%5D%2C%0A%20%20%20%20%20%20%20%20s%3D0.5%2C%0A%20%20%20%20%20%20%20%20color%3D%22orange%22%2C%0A%20%20%20%20%20%20%20%20label%3D%22inlier%22%2C%0A%20%20%20%20)%0A%20%20%20%20plt.contour(*implicit_grid(quad_basis%2C%20ellipse_points%2C%20ellipse_params)%2C%20%5B0%5D%2C%20colors%3D%22green%22)%0A%20%20%20%20plt.axis(%22equal%22)%0A%20%20%20%20plt.xlabel(%22x%22)%0A%20%20%20%20plt.ylabel(%22y%22)%0A%20%20%20%20plt.legend()%0A%20%20%20%20plt.show()%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%23%20%E6%8E%A8%E5%AE%9A%E3%81%97%E3%81%9F%E4%BF%82%E6%95%B0%E3%81%AE%E8%AA%A4%E5%B7%AE%E5%85%B1%E5%88%86%E6%95%A3%E8%A1%8C%E5%88%97%0A%0A%20%20%20%20%24%5C%7Ca%5C%7C%3D1%24%20%E3%81%A8%E6%AD%A3%E8%A6%8F%E5%8C%96%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%81%AE%E3%81%A7%E3%80%81%24%5Chat%7Ba%7D%24%20%E3%81%AF%E5%8D%98%E4%BD%8D%E7%90%83%E4%B8%8A%E3%82%92%E5%8B%95%E3%81%8F%E3%80%82%E8%AA%A4%E5%B7%AE%E3%81%8C%E5%B0%8F%E3%81%95%E3%81%84%E7%AF%84%E5%9B%B2%E3%81%A7%0A%20%20%20%201%20%E6%AC%A1%E3%81%BE%E3%81%A7%E8%A6%8B%E3%82%8C%E3%81%B0%E3%80%81%E3%81%9D%E3%81%AE%E6%8F%BA%E3%82%89%E3%81%8E%E3%81%AF%20%24%5Chat%7Ba%7D%24%20%E3%81%AB%E7%9B%B4%E4%BA%A4%E3%81%99%E3%82%8B%20%24m-1%24%20%E6%AC%A1%E5%85%83%E3%81%AE%E6%8E%A5%E5%B9%B3%E9%9D%A2%E3%81%AB%E9%99%90%E3%82%89%E3%82%8C%E3%82%8B%E3%80%82%0A%20%20%20%20%E3%81%97%E3%81%9F%E3%81%8C%E3%81%A3%E3%81%A6%E7%B7%9A%E5%BD%A2%E5%8C%96%E3%81%97%E3%81%9F%E5%85%B1%E5%88%86%E6%95%A3%E8%A1%8C%E5%88%97%E3%81%AF%E3%83%A9%E3%83%B3%E3%82%AF%20%24m-1%24%20%E3%81%AB%E8%90%BD%E3%81%A1%E3%80%81%24%5Chat%7Ba%7D%24%20%E6%96%B9%E5%90%91%E3%81%AE%E5%88%86%E6%95%A3%E3%81%AF%200%20%E3%81%AB%0A%20%20%20%20%E3%81%AA%E3%82%8B%EF%BC%88%E5%8E%B3%E5%AF%86%E3%81%AB%E3%81%AF%E7%90%83%E9%9D%A2%E4%B8%8A%E3%81%AE%E5%A4%89%E4%BD%8D%E3%81%AB%202%20%E6%AC%A1%E3%81%AE%E6%B3%95%E7%B7%9A%E6%96%B9%E5%90%91%E6%88%90%E5%88%86%E3%81%8C%E6%AE%8B%E3%82%8B%E3%81%AE%E3%81%A7%E3%80%81%E3%81%93%E3%81%AE%E6%96%B9%E5%90%91%E3%81%AE%E5%88%86%E6%95%A3%E3%81%AF%0A%20%20%20%20%E5%AE%8C%E5%85%A8%E3%81%AA%200%20%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84%E3%80%82%E5%BE%8C%E3%81%AE%E3%83%A2%E3%83%B3%E3%83%86%E3%82%AB%E3%83%AB%E3%83%AD%E3%81%A7%E5%AE%9F%E9%9A%9B%E3%81%AE%E5%A4%A7%E3%81%8D%E3%81%95%E3%82%92%E6%B8%AC%E3%82%8B%EF%BC%89%E3%80%82%E3%81%93%E3%81%AE%E8%BF%91%E4%BC%BC%E3%81%AE%E3%82%82%E3%81%A8%E3%81%A7%E3%80%81%0A%20%20%20%20%E4%BB%A3%E6%95%B0%E7%9A%84%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%97%E3%81%AE%E8%A7%A3%E3%81%AE%E5%85%B1%E5%88%86%E6%95%A3%E3%81%AF%E6%AC%A1%E3%81%A7%E4%B8%8E%E3%81%88%E3%82%89%E3%82%8C%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%24%24%0A%20%20%20%20V%5B%5Chat%7Ba%7D%5D%20%3D%20%5Cfrac%7B%5Csigma%5E2%7D%7BN%7D%5C%20%5Cbar%7BM%7D%5E%7B-%7D%5C%20%5Cbar%7BN%7D%5C%20%5Cbar%7BM%7D%5E%7B-%7D%2C%0A%20%20%20%20%5Cqquad%0A%20%20%20%20%5Cbar%7BM%7D%20%3D%20%5Cfrac%7B1%7D%7BN%7D%5Csum_i%20%5Cxi_i%20%5Cxi_i%5E%5Ctop%2C%0A%20%20%20%20%5Cqquad%0A%20%20%20%20%5Cbar%7BN%7D%20%3D%20%5Cfrac%7B1%7D%7BN%7D%5Csum_i%20%5Cbigl(%5Chat%7Ba%7D%2C%5C%20V_0%5B%5Cxi_i%5D%5C%2C%5Chat%7Ba%7D%5Cbigr)%5C%20%5Cxi_i%20%5Cxi_i%5E%5Ctop%0A%20%20%20%20%24%24%0A%0A%20%20%20%20%24%5Cbar%7BM%7D%5E%7B-%7D%24%20%E3%81%AF%E6%9C%80%E5%B0%8F%E5%9B%BA%E6%9C%89%E5%80%A4%E3%81%AE%E6%96%B9%E5%90%91%EF%BC%88%24%5Chat%7Ba%7D%24%20%E8%87%AA%E8%BA%AB%E3%81%AE%E6%96%B9%E5%90%91%EF%BC%89%E3%82%92%E9%99%A4%E3%81%84%E3%81%9F%E3%83%A9%E3%83%B3%E3%82%AF%20%24m-1%24%20%E3%81%AE%0A%20%20%20%20%E6%93%AC%E4%BC%BC%E9%80%86%E8%A1%8C%E5%88%97%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%24%5Csigma%5E2%24%20%E3%81%AF%E8%A6%B3%E6%B8%AC%E8%AA%A4%E5%B7%AE%E3%81%AE%E5%88%86%E6%95%A3%E3%81%A7%E3%80%81Sampson%20%E8%AA%A4%E5%B7%AE%E3%81%AE%E5%92%8C%E3%81%8B%E3%82%89%E6%8E%A8%E5%AE%9A%E3%81%A7%E3%81%8D%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%24%24%0A%20%20%20%20%5Chat%7B%5Csigma%7D%5E2%20%3D%20%5Cfrac%7B1%7D%7BN-(m-1)%7D%5C%20%5Csum_i%0A%20%20%20%20%5Cfrac%7B(%5Cxi_i%2C%5C%20%5Chat%7Ba%7D)%5E2%7D%7B%5Cbigl(%5Chat%7Ba%7D%2C%5C%20V_0%5B%5Cxi_i%5D%5C%2C%5Chat%7Ba%7D%5Cbigr)%7D%0A%20%20%20%20%24%24%0A%0A%20%20%20%20%E3%81%93%E3%81%AE%E5%BC%8F%E3%81%AF%E8%AA%A4%E5%B7%AE%E3%81%8C%E6%9C%89%E9%99%90%E3%81%AE%E5%88%86%E6%95%A3%E3%82%92%E6%8C%81%E3%81%A4%E3%81%93%E3%81%A8%E3%82%92%E5%89%8D%E6%8F%90%E3%81%AB%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%80%82%E6%A5%95%E5%86%86%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AB%E8%BC%89%E3%81%9B%E3%81%9F%E3%81%AE%E3%81%AF%0A%20%20%20%20%E5%88%86%E6%95%A3%E3%82%92%E6%8C%81%E3%81%9F%E3%81%AA%E3%81%84%E3%82%B3%E3%83%BC%E3%82%B7%E3%83%BC%E5%88%86%E5%B8%83%E3%81%A7%E3%81%82%E3%82%8A%E3%80%81%E3%81%95%E3%82%89%E3%81%AB%20RANSAC%20%E3%81%8C%E9%81%B8%E3%82%93%E3%81%A0%20inlier%20%E3%81%AF%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AB%E4%BE%9D%E5%AD%98%0A%20%20%20%20%E3%81%99%E3%82%8B%E5%88%87%E3%82%8A%E5%87%BA%E3%81%97%E6%96%B9%E3%81%AA%E3%81%AE%E3%81%A7%E3%80%81%E6%AC%A1%E3%81%AE%E3%82%BB%E3%83%AB%E3%81%A7%E5%BE%97%E3%82%8B%20%24%5Chat%7B%5Csigma%7D%24%20%E3%81%AF%E3%80%8Cinlier%20%E3%81%AB%E9%81%B8%E3%81%B0%E3%82%8C%E3%81%9F%E7%82%B9%E3%81%AE%0A%20%20%20%20%E6%9B%B2%E7%B7%9A%E3%81%8B%E3%82%89%E3%81%AE%E3%81%B0%E3%82%89%E3%81%A4%E3%81%8D%E3%81%AE%E5%B0%BA%E5%BA%A6%E3%80%8D%E3%81%A7%E3%81%82%E3%81%A3%E3%81%A6%E3%80%81%E5%85%83%E3%81%AE%E8%A6%B3%E6%B8%AC%E8%AA%A4%E5%B7%AE%E3%81%AE%E6%A8%99%E6%BA%96%E5%81%8F%E5%B7%AE%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84%E3%80%82%E5%BC%8F%E3%81%9D%E3%81%AE%E3%82%82%E3%81%AE%E3%81%AE%0A%20%20%20%20%E5%A6%A5%E5%BD%93%E6%80%A7%E3%81%AF%E3%80%81%E3%81%9D%E3%81%AE%E5%BE%8C%E3%81%AE%E6%AD%A3%E8%A6%8F%E5%88%86%E5%B8%83%E8%AA%A4%E5%B7%AE%E3%81%AB%E3%82%88%E3%82%8B%E3%83%A2%E3%83%B3%E3%83%86%E3%82%AB%E3%83%AB%E3%83%AD%E3%81%A7%E7%A2%BA%E3%81%8B%E3%82%81%E3%82%8B%E3%80%82%0A%20%20%20%20%E9%99%BD%E9%96%A2%E6%95%B0%E3%81%AE%E7%AF%80%E3%81%A7%E4%BD%BF%E3%81%A3%E3%81%9F%20%24%5Cchi%5E2%2F(N-m)%5C%2C(X%5E%5Ctop%20X)%5E%7B-1%7D%24%20%E3%82%92%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E6%8C%81%E3%81%A1%E8%BE%BC%E3%82%80%E3%81%93%E3%81%A8%E3%81%AF%0A%20%20%20%20%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%80%82%E7%90%86%E7%94%B1%E3%81%AF%202%20%E3%81%A4%E3%81%82%E3%82%8B%E3%80%82%E7%AC%AC%201%20%E3%81%AB%20%24(%5Cxi%2C%20a)%24%20%E3%81%AF%E5%B9%BE%E4%BD%95%E8%B7%9D%E9%9B%A2%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84%E3%81%AE%E3%81%A7%E3%80%81%0A%20%20%20%20%24%5Cchi%5E2%24%20%E3%82%92%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E8%AA%A4%E5%B7%AE%E3%81%AE%E5%88%86%E6%95%A3%E3%81%AE%E6%8E%A8%E5%AE%9A%E3%81%AB%E4%BD%BF%E3%81%88%E3%81%AA%E3%81%84%E3%80%82%E7%AC%AC%202%20%E3%81%AB%20%24%5C%7Ca%5C%7C%3D1%24%20%E3%81%AE%E5%88%B6%E7%B4%84%E3%82%92%E7%84%A1%E8%A6%96%E3%81%97%E3%81%A6%0A%20%20%20%20%24(X%5E%5Ctop%20X)%5E%7B-1%7D%24%20%E3%82%92%E5%8F%96%E3%82%8B%E3%81%A8%E3%80%81%E3%81%BB%E3%81%A8%E3%82%93%E3%81%A9%E9%9B%B6%E7%A9%BA%E9%96%93%E3%81%A7%E3%81%82%E3%82%8B%20%24%5Chat%7Ba%7D%24%20%E6%96%B9%E5%90%91%E3%81%AE%E5%9B%BA%E6%9C%89%E5%80%A4%E3%81%AE%E9%80%86%E6%95%B0%E3%81%8C%0A%20%20%20%20%E6%B7%B7%E5%85%A5%E3%81%99%E3%82%8B%E3%80%82%E6%AC%A1%E3%81%AE%E3%82%BB%E3%83%AB%E3%81%A7%E4%B8%A1%E6%96%B9%E3%81%AE%E5%BC%8F%E3%82%92%E8%A8%88%E7%AE%97%E3%81%97%E3%80%81%E3%83%A2%E3%83%B3%E3%83%86%E3%82%AB%E3%83%AB%E3%83%AD%E3%81%A7%E6%B1%82%E3%82%81%E3%81%9F%E7%B5%8C%E9%A8%93%E7%9A%84%E3%81%AA%E5%85%B1%E5%88%86%E6%95%A3%E3%81%A8%0A%20%20%20%20%E7%AA%81%E3%81%8D%E5%90%88%E3%82%8F%E3%81%9B%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(normalized_cov)%3A%0A%20%20%20%20def%20rank_pseudo_inverse(matrix%2C%20rank)%3A%0A%20%20%20%20%20%20%20%20%22%22%22%E5%AF%BE%E7%A7%B0%E8%A1%8C%E5%88%97%E3%81%AE%E3%80%81%E5%A4%A7%E3%81%8D%E3%81%84%E6%96%B9%E3%81%8B%E3%82%89%20rank%20%E5%80%8B%E3%81%AE%E5%9B%BA%E6%9C%89%E5%80%A4%E3%81%A0%E3%81%91%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E6%93%AC%E4%BC%BC%E9%80%86%E8%A1%8C%E5%88%97%E3%80%82%0A%0A%20%20%20%20%20%20%20%20%3Aparam%20matrix%3A%20%E5%AF%BE%E7%A7%B0%E8%A1%8C%E5%88%97%0A%20%20%20%20%20%20%20%20%3Aparam%20rank%3A%20%E6%AE%8B%E3%81%99%E5%9B%BA%E6%9C%89%E5%80%A4%E3%81%AE%E6%95%B0%0A%20%20%20%20%20%20%20%20%3Areturn%3A%20%E6%93%AC%E4%BC%BC%E9%80%86%E8%A1%8C%E5%88%97%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20values%2C%20vectors%20%3D%20np.linalg.eigh(matrix)%0A%20%20%20%20%20%20%20%20kept%20%3D%20np.argsort(values)%5B%3A%3A-1%5D%5B%3Arank%5D%0A%20%20%20%20%20%20%20%20return%20sum(np.outer(vectors%5B%3A%2C%20i%5D%2C%20vectors%5B%3A%2C%20i%5D)%20%2F%20values%5Bi%5D%20for%20i%20in%20kept)%0A%0A%20%20%20%20def%20algebraic_covariance(basis_func%2C%20points%2C%20params)%3A%0A%20%20%20%20%20%20%20%20%22%22%22%E4%BB%A3%E6%95%B0%E7%9A%84%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%97%E3%81%A7%E6%B1%82%E3%82%81%E3%81%9F%E4%BF%82%E6%95%B0%E3%81%AE%E8%AA%A4%E5%B7%AE%E5%85%B1%E5%88%86%E6%95%A3%E8%A1%8C%E5%88%97%E3%82%92%E6%8E%A8%E5%AE%9A%E3%81%99%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%20%20%20%20%3Aparam%20basis_func%3A%20%E5%9F%BA%E5%BA%95%E9%96%A2%E6%95%B0%0A%20%20%20%20%20%20%20%20%3Aparam%20points%3A%20%E5%BD%A2%E7%8A%B6%20(N%2C%202)%20%E3%81%AE%E7%82%B9%E7%BE%A4%0A%20%20%20%20%20%20%20%20%3Aparam%20params%3A%20%E5%BD%A2%E7%8A%B6%20(m%2C)%20%E3%81%AE%E6%8E%A8%E5%AE%9A%E3%81%97%E3%81%9F%E4%BF%82%E6%95%B0%0A%20%20%20%20%20%20%20%20%3Areturn%3A%20(%E5%85%B1%E5%88%86%E6%95%A3%E8%A1%8C%E5%88%97%20(m%2C%20m)%2C%20%E6%8E%A8%E5%AE%9A%E3%81%97%E3%81%9F%E8%A6%B3%E6%B8%AC%E8%AA%A4%E5%B7%AE%E3%81%AE%E5%88%86%E6%95%A3)%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20design%20%3D%20np.array(%5Bbasis_func(point)%20for%20point%20in%20points%5D)%0A%20%20%20%20%20%20%20%20cov_stack%20%3D%20np.array(%5Bnormalized_cov(basis_func%2C%20point)%20for%20point%20in%20points%5D)%0A%20%20%20%20%20%20%20%20weights%20%3D%20np.einsum(%22i%2Cnij%2Cj-%3En%22%2C%20params%2C%20cov_stack%2C%20params)%0A%20%20%20%20%20%20%20%20sigma_sq%20%3D%20float(np.sum((design%20%40%20params)%20**%202%20%2F%20weights))%20%2F%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20len(points)%20-%20(len(params)%20-%201)%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20moment%20%3D%20design.T%20%40%20design%20%2F%20len(points)%0A%20%20%20%20%20%20%20%20weighted_moment%20%3D%20(design.T%20*%20weights)%20%40%20design%20%2F%20len(points)%0A%20%20%20%20%20%20%20%20moment_pinv%20%3D%20rank_pseudo_inverse(moment%2C%20len(params)%20-%201)%0A%20%20%20%20%20%20%20%20covariance%20%3D%20sigma_sq%20%2F%20len(points)%20*%20moment_pinv%20%40%20weighted_moment%20%40%20moment_pinv%0A%20%20%20%20%20%20%20%20return%20covariance%2C%20sigma_sq%0A%0A%20%20%20%20return%20(algebraic_covariance%2C)%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20algebraic_covariance%2C%0A%20%20%20%20ellipse_mask%2C%0A%20%20%20%20ellipse_params%2C%0A%20%20%20%20ellipse_points%2C%0A%20%20%20%20ellipse_residual%2C%0A%20%20%20%20quad_basis%2C%0A%20%20%20%20show_matrix%2C%0A)%3A%0A%20%20%20%20ellipse_inlier_points%20%3D%20ellipse_points%5Bellipse_mask%2C%20%3A%5D%0A%20%20%20%20ellipse_cov%2C%20ellipse_sigma_sq%20%3D%20algebraic_covariance(%0A%20%20%20%20%20%20%20%20quad_basis%2C%20ellipse_inlier_points%2C%20ellipse_params%0A%20%20%20%20)%0A%20%20%20%20_design%20%3D%20np.array(%5Bquad_basis(point)%20for%20point%20in%20ellipse_inlier_points%5D)%0A%20%20%20%20ellipse_naive_cov%20%3D%20(%0A%20%20%20%20%20%20%20%20np.linalg.inv(_design.T%20%40%20_design)%0A%20%20%20%20%20%20%20%20*%20ellipse_residual%0A%20%20%20%20%20%20%20%20%2F%20(len(ellipse_inlier_points)%20-%20_design.shape%5B1%5D)%0A%20%20%20%20)%0A%20%20%20%20print(f%22inlier%20%E6%95%B0%20%3D%20%7Blen(ellipse_inlier_points)%7D%22)%0A%20%20%20%20print(f%22Sampson%20%E8%AA%A4%E5%B7%AE%E3%81%8B%E3%82%89%E6%B1%82%E3%82%81%E3%81%9F%20sigma%20%3D%20%7Bnp.sqrt(ellipse_sigma_sq)%3A.5f%7D%22)%0A%20%20%20%20print(f%22%E5%85%B1%E5%88%86%E6%95%A3%E3%81%AE%E5%AF%BE%E8%A7%92%20%20%20%20%20%3D%20%7Bnp.diag(ellipse_cov)%7D%22)%0A%20%20%20%20print(f%22%E6%97%A7%E6%9D%A5%E3%81%AE%E5%BC%8F%E3%81%AE%E5%AF%BE%E8%A7%92%20%20%20%3D%20%7Bnp.diag(ellipse_naive_cov)%7D%22)%0A%20%20%20%20print(f%22cond(X%5ET%20X)%20%20%20%20%20%20%3D%20%7Bnp.linalg.cond(_design.T%20%40%20_design)%3A.3e%7D%22)%0A%20%20%20%20print(f%22a%20%E6%96%B9%E5%90%91%E3%81%AE%E5%88%86%E6%95%A3%20%20%20%20%20%3D%20%7Bellipse_params%20%40%20ellipse_cov%20%40%20ellipse_params%3A.3e%7D%EF%BC%88%E7%B7%9A%E5%BD%A2%E5%8C%96%E3%81%AB%E3%82%88%E3%82%8A%200%EF%BC%89%22)%0A%20%20%20%20show_matrix(ellipse_cov%2C%20%22covariance%20of%20the%20conic%20coefficients%22)%0A%20%20%20%20return%20(ellipse_inlier_points%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E5%BC%8F%E3%81%8C%E6%AD%A3%E3%81%97%E3%81%84%E3%81%8B%E3%81%A9%E3%81%86%E3%81%8B%E3%81%AF%E3%80%81%E5%90%8C%E3%81%98%E7%9C%9F%E3%81%AE%E6%A5%95%E5%86%86%E3%81%8B%E3%82%89%E8%AA%A4%E5%B7%AE%E3%81%A0%E3%81%91%E3%82%92%E5%BC%95%E3%81%8D%E7%9B%B4%E3%81%97%E3%81%9F%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E5%A4%A7%E9%87%8F%E3%81%AB%E4%BD%9C%E3%82%8A%E3%80%81%0A%20%20%20%20%E6%8E%A8%E5%AE%9A%E5%80%A4%E3%81%AE%E3%81%B0%E3%82%89%E3%81%A4%E3%81%8D%E3%82%92%E7%9B%B4%E6%8E%A5%E6%B8%AC%E3%82%8C%E3%81%B0%E7%A2%BA%E3%81%8B%E3%82%81%E3%82%89%E3%82%8C%E3%82%8B%E3%80%82%E3%81%93%E3%81%93%E3%81%A7%E3%81%AF%E5%A4%96%E3%82%8C%E5%80%A4%E3%81%AE%E5%BD%B1%E9%9F%BF%E3%82%92%E5%88%87%E3%82%8A%E9%9B%A2%E3%81%99%E3%81%9F%E3%82%81%E3%80%81%0A%20%20%20%20%E6%A8%99%E6%BA%96%E5%81%8F%E5%B7%AE%20%240.01%24%20%E3%81%AE%E6%AD%A3%E8%A6%8F%E5%88%86%E5%B8%83%E8%AA%A4%E5%B7%AE%E3%81%A0%E3%81%91%E3%82%92%E4%B9%97%E3%81%9B%E3%81%9F%E7%82%B9%E7%BE%A4%E3%82%92%201000%20%E7%B5%84%E4%BD%9C%E3%82%8A%E3%80%81%E3%81%9D%E3%82%8C%E3%81%9E%E3%82%8C%E3%81%AB%E4%BB%A3%E6%95%B0%E7%9A%84%0A%20%20%20%20%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%97%E3%82%92%E5%BD%93%E3%81%A6%E3%81%AF%E3%82%81%E3%81%A6%E7%B5%8C%E9%A8%93%E7%9A%84%E3%81%AA%E5%85%B1%E5%88%86%E6%95%A3%E8%A1%8C%E5%88%97%E3%82%92%E6%B1%82%E3%82%81%E3%82%8B%E3%80%82%E7%90%86%E8%AB%96%E5%BC%8F%E3%81%AE%E5%81%B4%E3%81%AF%E3%80%81%E3%81%9D%E3%81%AE%E3%81%86%E3%81%A1%E3%81%AE%0A%20%20%20%201%20%E7%B5%84%E3%81%A0%E3%81%91%E3%82%92%E4%BD%BF%E3%81%84%E3%80%81%E3%81%9D%E3%81%AE%201%20%E7%B5%84%E3%81%8B%E3%82%89%E5%BD%93%E3%81%A6%E3%81%AF%E3%82%81%E3%81%9F%E4%BF%82%E6%95%B0%E3%81%A8%20%24%5Chat%7B%5Csigma%7D%24%20%E3%81%A7%E8%A8%88%E7%AE%97%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%E5%AE%9F%E5%8B%99%E3%81%A7%E6%89%8B%E5%85%83%E3%81%AB%E3%81%82%E3%82%8B%E3%81%AE%E3%81%AF%201%20%E7%B5%84%E3%81%A0%E3%81%91%E3%81%A0%E3%81%8B%E3%82%89%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%E7%AC%A6%E5%8F%B7%E3%81%AE%E4%B8%8D%E5%AE%9A%E6%80%A7%E3%82%92%E6%8F%83%E3%81%88%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AB%E3%81%A0%E3%81%91%E3%80%81%0A%20%20%20%20%E8%AA%A4%E5%B7%AE%E3%81%AA%E3%81%97%E3%81%AE%E7%82%B9%E7%BE%A4%E3%81%8B%E3%82%89%E6%B1%82%E3%82%81%E3%81%9F%E4%BF%82%E6%95%B0%E3%82%92%E5%9F%BA%E6%BA%96%E3%81%AB%E4%BD%BF%E3%81%86%E3%80%82%0A%0A%20%20%20%20%E3%81%82%E3%82%8F%E3%81%9B%E3%81%A6%E3%80%81%E7%B5%8C%E9%A8%93%E7%9A%84%E3%81%AA%E5%85%B1%E5%88%86%E6%95%A3%E3%81%AE%E5%9F%BA%E6%BA%96%E4%BF%82%E6%95%B0%E6%96%B9%E5%90%91%E3%81%AE%E6%88%90%E5%88%86%E3%82%82%E6%B8%AC%E3%82%8B%E3%80%82%E7%B7%9A%E5%BD%A2%E5%8C%96%E3%81%A7%E3%81%AF%200%20%E3%81%AB%E3%81%AA%E3%82%8B%E9%87%8F%E3%81%A7%E3%80%81%0A%20%20%20%20%E5%AE%9F%E9%9A%9B%E3%81%AB%E3%81%A9%E3%81%AE%E7%A8%8B%E5%BA%A6%E5%B0%8F%E3%81%95%E3%81%84%E3%81%8B%E3%81%8C%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E8%BF%91%E4%BC%BC%E3%81%AE%E5%A6%A5%E5%BD%93%E6%80%A7%E3%82%92%E7%A4%BA%E3%81%99%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(algebraic_covariance%2C%20ellipse_clean_points%2C%20quad_basis)%3A%0A%20%20%20%20montecarlo_trials%20%3D%201000%0A%20%20%20%20montecarlo_noise_sd%20%3D%200.01%0A%20%20%20%20_reference_design%20%3D%20np.array(%5Bquad_basis(point)%20for%20point%20in%20ellipse_clean_points%5D)%0A%20%20%20%20_values%2C%20_vectors%20%3D%20np.linalg.eigh(%0A%20%20%20%20%20%20%20%20_reference_design.T%20%40%20_reference_design%20%2F%20len(ellipse_clean_points)%0A%20%20%20%20)%0A%20%20%20%20montecarlo_reference%20%3D%20_vectors%5B%3A%2C%200%5D%0A%20%20%20%20_rng%20%3D%20np.random.default_rng(12)%0A%20%20%20%20_estimates%20%3D%20%5B%5D%0A%20%20%20%20for%20_trial%20in%20range(montecarlo_trials)%3A%0A%20%20%20%20%20%20%20%20_noisy%20%3D%20ellipse_clean_points%20%2B%20montecarlo_noise_sd%20*%20_rng.standard_normal(%0A%20%20%20%20%20%20%20%20%20%20%20%20ellipse_clean_points.shape%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20_design%20%3D%20np.array(%5Bquad_basis(point)%20for%20point%20in%20_noisy%5D)%0A%20%20%20%20%20%20%20%20_eigenvalues%2C%20_eigenvectors%20%3D%20np.linalg.eigh(_design.T%20%40%20_design%20%2F%20len(_noisy))%0A%20%20%20%20%20%20%20%20_estimate%20%3D%20_eigenvectors%5B%3A%2C%200%5D%0A%20%20%20%20%20%20%20%20if%20_estimate%20%40%20montecarlo_reference%20%3C%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20_estimate%20%3D%20-_estimate%0A%20%20%20%20%20%20%20%20_estimates.append(_estimate)%0A%20%20%20%20%20%20%20%20if%20_trial%20%3D%3D%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20montecarlo_single%20%3D%20_noisy%0A%20%20%20%20%20%20%20%20%20%20%20%20montecarlo_single_params%20%3D%20_estimate%0A%20%20%20%20montecarlo_empirical%20%3D%20np.cov(np.array(_estimates).T)%0A%20%20%20%20montecarlo_theory%2C%20montecarlo_sigma_sq%20%3D%20algebraic_covariance(%0A%20%20%20%20%20%20%20%20quad_basis%2C%20montecarlo_single%2C%20montecarlo_single_params%0A%20%20%20%20)%0A%20%20%20%20_normal_variance%20%3D%20montecarlo_reference%20%40%20montecarlo_empirical%20%40%20montecarlo_reference%0A%20%20%20%20print(f%22%E8%A9%A6%E8%A1%8C%E6%95%B0%20%3D%20%7Bmontecarlo_trials%7D%2C%20%E8%AA%A4%E5%B7%AE%E3%81%AE%E6%A8%99%E6%BA%96%E5%81%8F%E5%B7%AE%20%3D%20%7Bmontecarlo_noise_sd%7D%22)%0A%20%20%20%20print(f%221%20%E7%B5%84%E3%81%8B%E3%82%89%E6%8E%A8%E5%AE%9A%E3%81%97%E3%81%9F%20sigma%20%3D%20%7Bnp.sqrt(montecarlo_sigma_sq)%3A.6f%7D%22)%0A%20%20%20%20print(f%22%E7%B5%8C%E9%A8%93%E7%9A%84%E3%81%AA%E5%85%B1%E5%88%86%E6%95%A3%E3%81%AE%E8%B7%A1%20%3D%20%7Bnp.trace(montecarlo_empirical)%3A.6e%7D%22)%0A%20%20%20%20print(f%22%E7%90%86%E8%AB%96%E5%BC%8F%E3%81%AE%E5%85%B1%E5%88%86%E6%95%A3%E3%81%AE%E8%B7%A1%20%3D%20%7Bnp.trace(montecarlo_theory)%3A.6e%7D%22)%0A%20%20%20%20print(f%22%E8%B7%A1%E3%81%AE%E6%AF%94%EF%BC%88%E7%90%86%E8%AB%96%2F%E7%B5%8C%E9%A8%93%EF%BC%89%20%3D%20%7Bnp.trace(montecarlo_theory)%20%2F%20np.trace(montecarlo_empirical)%3A.4f%7D%22)%0A%20%20%20%20print(f%22%E5%AF%BE%E8%A7%92%E6%88%90%E5%88%86%E3%81%AE%E6%AF%94%20%20%20%20%20%20%20%3D%20%7Bnp.round(np.diag(montecarlo_theory)%20%2F%20np.diag(montecarlo_empirical)%2C%204)%7D%22)%0A%20%20%20%20print(f%22%E7%B5%8C%E9%A8%93%E7%9A%84%E3%81%AA%E5%85%B1%E5%88%86%E6%95%A3%E3%81%AE%E5%9F%BA%E6%BA%96%E4%BF%82%E6%95%B0%E6%96%B9%E5%90%91%E3%81%AE%E5%88%86%E6%95%A3%20%3D%20%7B_normal_variance%3A.3e%7D%EF%BC%88%E8%B7%A1%E3%81%AE%20%22%0A%20%20%20%20%20%20%20%20%20%20f%22%7B_normal_variance%20%2F%20np.trace(montecarlo_empirical)%3A.1e%7D%20%E5%80%8D%EF%BC%89%22)%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20montecarlo_empirical%2C%0A%20%20%20%20%20%20%20%20montecarlo_single%2C%0A%20%20%20%20%20%20%20%20montecarlo_single_params%2C%0A%20%20%20%20%20%20%20%20montecarlo_theory%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20montecarlo_empirical%2C%0A%20%20%20%20montecarlo_single%2C%0A%20%20%20%20montecarlo_single_params%2C%0A%20%20%20%20montecarlo_theory%2C%0A%20%20%20%20quad_basis%2C%0A%20%20%20%20show_matrix%2C%0A)%3A%0A%20%20%20%20_design%20%3D%20np.array(%5Bquad_basis(point)%20for%20point%20in%20montecarlo_single%5D)%0A%20%20%20%20_chi2%20%3D%20float(np.sum((_design%20%40%20montecarlo_single_params)%20**%202))%0A%20%20%20%20_naive%20%3D%20(%0A%20%20%20%20%20%20%20%20np.linalg.inv(_design.T%20%40%20_design)%20*%20_chi2%20%2F%20(len(montecarlo_single)%20-%20_design.shape%5B1%5D)%0A%20%20%20%20)%0A%20%20%20%20print(f%22%E6%97%A7%E6%9D%A5%E3%81%AE%E5%BC%8F%20%2F%20%E7%B5%8C%E9%A8%93%E7%9A%84%E3%81%AA%E5%85%B1%E5%88%86%E6%95%A3%20%E3%81%AE%E5%AF%BE%E8%A7%92%E6%AF%94%20%3D%20%7Bnp.round(np.diag(_naive)%20%2F%20np.diag(montecarlo_empirical)%2C%201)%7D%22)%0A%20%20%20%20show_matrix(montecarlo_empirical%2C%20%22empirical%20covariance%20(1000%20trials)%22)%0A%20%20%20%20show_matrix(montecarlo_theory%2C%20%22theoretical%20covariance%20(single%20sample)%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%23%20scipy.odr%20%E3%81%A7%E5%90%8C%E3%81%98%E6%A5%95%E5%86%86%E3%82%92%E5%BD%93%E3%81%A6%E3%81%AF%E3%82%81%E3%82%8B%0A%0A%20%20%20%20%E5%89%8D%E5%8D%8A%E3%81%AE%E5%86%86%E3%81%A7%E3%81%AF%20%60scipy.odr%60%20%E3%81%8C%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E4%BD%BF%E3%81%88%E3%81%9F%E3%80%82%E3%81%97%E3%81%8B%E3%81%97%E5%86%86%E9%8C%90%E6%9B%B2%E7%B7%9A%E3%81%AE%E9%99%B0%E9%96%A2%E6%95%B0%0A%20%20%20%20%24(%5Cxi%2C%20a)%20%3D%200%24%20%E3%81%AF%E4%BF%82%E6%95%B0%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E5%90%8C%E6%AC%A1%E3%81%A7%E3%81%82%E3%82%8A%E3%80%81%24a%20%3D%200%24%20%E3%81%8C%E6%AE%8B%E5%B7%AE%200%20%E3%81%AE%E8%A7%A3%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%97%E3%81%BE%E3%81%86%E3%80%82%0A%20%20%20%20%60scipy.odr%60%20%E3%81%AF%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%AB%E3%81%AE%E6%8B%98%E6%9D%9F%E3%82%92%E6%8C%81%E3%81%9F%E3%81%AA%E3%81%84%E3%81%9F%E3%82%81%E3%80%81%E7%B4%A0%E7%9B%B4%E3%81%AB%E6%B8%A1%E3%81%99%E3%81%A8%E3%81%93%E3%81%AE%E8%87%AA%E6%98%8E%E8%A7%A3%E3%81%B8%E5%8F%8E%E6%9D%9F%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(ellipse_inlier_points%2C%20odr%2C%20quad_basis)%3A%0A%20%20%20%20def%20conic_residual(beta%2C%20point)%3A%0A%20%20%20%20%20%20%20%20%22%22%22%E5%86%86%E9%8C%90%E6%9B%B2%E7%B7%9A%E3%81%AE%E9%99%B0%E9%96%A2%E6%95%B0%20(%CE%BE%2C%20a)%E3%80%82%0A%0A%20%20%20%20%20%20%20%20%3Aparam%20beta%3A%20%E5%BD%A2%E7%8A%B6%20(6%2C)%20%E3%81%AE%E4%BF%82%E6%95%B0%0A%20%20%20%20%20%20%20%20%3Aparam%20point%3A%20%E5%BD%A2%E7%8A%B6%20(2%2C%20N)%20%E3%81%AE%E7%82%B9%E7%BE%A4%0A%20%20%20%20%20%20%20%20%3Areturn%3A%20%E5%BD%A2%E7%8A%B6%20(N%2C)%20%E3%81%AE%E9%99%B0%E9%96%A2%E6%95%B0%E3%81%AE%E5%80%A4%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20return%20np.dot(beta%2C%20quad_basis(point))%0A%0A%20%20%20%20odr_model%20%3D%20odr.Model(conic_residual%2C%20implicit%3DTrue)%0A%20%20%20%20odr_data%20%3D%20odr.Data(ellipse_inlier_points.T%2C%20y%3D1)%0A%20%20%20%20odr_free_result%20%3D%20odr.ODR(odr_data%2C%20odr_model%2C%20beta0%3D%5B1%20%2F%206%5D%20*%206).run()%0A%20%20%20%20print(f%22%E6%8E%A8%E5%AE%9A%E3%81%97%E3%81%9F%20beta%20%3D%20%7Bnp.round(odr_free_result.beta%2C%2010)%7D%22)%0A%20%20%20%20print(f%22%7Cbeta%7C%20%3D%20%7Bnp.linalg.norm(odr_free_result.beta)%3A.3e%7D%22)%0A%20%20%20%20print(f%22%E6%AE%8B%E5%B7%AE%E4%BA%8C%E4%B9%97%E5%92%8C%20%3D%20%7Bodr_free_result.sum_square%3A.3e%7D%22)%0A%20%20%20%20print(f%22%E5%81%9C%E6%AD%A2%E7%90%86%E7%94%B1%20%3D%20%7Bodr_free_result.stopreason%7D%22)%0A%20%20%20%20return%20odr_data%2C%20odr_model%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E8%87%AA%E6%98%8E%E8%A7%A3%E3%82%92%E9%81%BF%E3%81%91%E3%82%8B%E3%81%AB%E3%81%AF%E3%80%81%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%AB%E3%82%92%E5%A4%96%E3%81%8B%E3%82%89%E5%9B%BA%E5%AE%9A%E3%81%99%E3%82%8C%E3%81%B0%E3%82%88%E3%81%84%E3%80%82%60ODR%60%20%E3%81%AE%20%60ifixb%60%20%E3%81%AF%0A%20%20%20%20%E3%80%8C%E5%80%A4%200%20%E3%81%AE%E6%88%90%E5%88%86%E3%82%92%E5%9B%BA%E5%AE%9A%E3%81%97%E3%80%81%E6%AD%A3%E3%81%AE%E6%88%90%E5%88%86%E3%82%92%E8%87%AA%E7%94%B1%E3%81%AB%E3%81%99%E3%82%8B%E3%80%8D%E6%8C%87%E5%AE%9A%E3%81%AA%E3%81%AE%E3%81%A7%E3%80%81%E4%BB%A3%E6%95%B0%E8%A7%A3%E3%81%A7%E7%B5%B6%E5%AF%BE%E5%80%A4%E3%81%8C%E6%9C%80%E5%A4%A7%E3%81%AE%0A%20%20%20%20%E6%88%90%E5%88%86%E3%82%92%E3%81%9D%E3%81%AE%E5%80%A4%E3%81%AE%E3%81%BE%E3%81%BE%E5%9B%BA%E5%AE%9A%E3%81%97%E3%80%81%E6%AE%8B%E3%82%8A%205%20%E5%80%8B%E3%82%92%E5%8B%95%E3%81%8B%E3%81%99%E3%80%82%E3%81%93%E3%81%86%E3%81%97%E3%81%A6%E5%BE%97%E3%81%9F%E8%A7%A3%E3%82%92%E5%8D%98%E4%BD%8D%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%81%B8%0A%20%20%20%20%E6%AD%A3%E8%A6%8F%E5%8C%96%E3%81%99%E3%82%8C%E3%81%B0%E3%80%81%E4%BB%A3%E6%95%B0%E7%9A%84%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%97%E3%81%AE%E8%A7%A3%E3%81%A8%E6%AF%94%E3%81%B9%E3%82%89%E3%82%8C%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20describe_conic%2C%0A%20%20%20%20ellipse_params%2C%0A%20%20%20%20ellipse_true_center%2C%0A%20%20%20%20ellipse_true_semi_axes%2C%0A%20%20%20%20odr%2C%0A%20%20%20%20odr_data%2C%0A%20%20%20%20odr_model%2C%0A)%3A%0A%20%20%20%20_anchor%20%3D%20int(np.argmax(np.abs(ellipse_params)))%0A%20%20%20%20_ifixb%20%3D%20%5B1%5D%20*%20len(ellipse_params)%0A%20%20%20%20_ifixb%5B_anchor%5D%20%3D%200%0A%20%20%20%20odr_fixed_result%20%3D%20odr.ODR(%0A%20%20%20%20%20%20%20%20odr_data%2C%20odr_model%2C%20beta0%3Dlist(ellipse_params)%2C%20ifixb%3D_ifixb%0A%20%20%20%20).run()%0A%20%20%20%20odr_beta%20%3D%20odr_fixed_result.beta%20%2F%20np.linalg.norm(odr_fixed_result.beta)%0A%20%20%20%20if%20odr_beta%20%40%20ellipse_params%20%3C%200%3A%0A%20%20%20%20%20%20%20%20odr_beta%20%3D%20-odr_beta%0A%20%20%20%20_angle%20%3D%20np.degrees(np.arccos(np.clip(abs(odr_beta%20%40%20ellipse_params)%2C%200.0%2C%201.0)))%0A%20%20%20%20_center%2C%20_semi_axes%2C%20_angles%20%3D%20describe_conic(odr_beta)%0A%20%20%20%20print(f%22%E5%9B%BA%E5%AE%9A%E3%81%97%E3%81%9F%E6%88%90%E5%88%86%20%3D%20%7B_anchor%7D%20%E7%95%AA%E7%9B%AE%22)%0A%20%20%20%20print(f%22%E5%81%9C%E6%AD%A2%E7%90%86%E7%94%B1%20%3D%20%7Bodr_fixed_result.stopreason%7D%22)%0A%20%20%20%20print(f%22ODR%20%E3%81%AE%E4%BF%82%E6%95%B0%20%20%20%3D%20%7Bnp.round(odr_beta%2C%205)%7D%22)%0A%20%20%20%20print(f%22%E4%BB%A3%E6%95%B0%E8%A7%A3%E3%81%AE%E4%BF%82%E6%95%B0%20%3D%20%7Bnp.round(ellipse_params%2C%205)%7D%22)%0A%20%20%20%20print(f%222%20%E3%81%A4%E3%81%AE%E4%BF%82%E6%95%B0%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%81%AE%E3%81%AA%E3%81%99%E8%A7%92%20%3D%20%7B_angle%3A.4f%7D%20%E5%BA%A6%22)%0A%20%20%20%20print(f%22ODR%20%E3%81%AE%20%E4%B8%AD%E5%BF%83%20%20%20%3D%20%7Bnp.round(_center%2C%204)%7D%20%2F%20%E7%9C%9F%E5%80%A4%20%3D%20%7Bellipse_true_center%7D%22)%0A%20%20%20%20print(f%22ODR%20%E3%81%AE%20%E5%8D%8A%E8%BB%B8%E9%95%B7%20%3D%20%7Bnp.round(_semi_axes%2C%204)%7D%20%2F%20%E7%9C%9F%E5%80%A4%20%3D%20%7Bellipse_true_semi_axes%7D%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20%E3%81%BE%E3%81%A8%E3%82%81%0A%0A%20%20%20%20-%20%E9%99%BD%E9%96%A2%E6%95%B0%E3%81%AE%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%97%E3%81%AF%20%60numpy.polyfit%60%20%60scipy.optimize.curve_fit%60%0A%20%20%20%20%20%20%60scipy.optimize.leastsq%60%20%E3%81%AE%E3%81%84%E3%81%9A%E3%82%8C%E3%81%A7%E3%82%82%E5%90%8C%E3%81%98%E8%A7%A3%E3%81%AB%E5%88%B0%E9%81%94%E3%81%99%E3%82%8B%E3%80%82%E9%81%95%E3%81%84%E3%81%AF%E6%89%B1%E3%81%88%E3%82%8B%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%0A%20%20%20%20%20%20%E7%AF%84%E5%9B%B2%E3%81%A8%E5%85%B1%E5%88%86%E6%95%A3%E8%A1%8C%E5%88%97%E3%81%AE%E6%AD%A3%E8%A6%8F%E5%8C%96%E3%81%A7%E3%80%81%60leastsq%60%20%E3%81%AE%20%60cov_x%60%20%E3%81%A0%E3%81%91%E3%81%AF%20%24%5Cchi%5E2%2F(N-m)%24%20%E3%82%92%0A%20%20%20%20%20%20%E6%8E%9B%E3%81%91%E3%81%AA%E3%81%84%E3%81%A8%E4%BB%96%E3%81%A8%E6%8F%83%E3%82%8F%E3%81%AA%E3%81%84%E3%80%82%0A%20%20%20%20-%20%E9%99%B0%E9%96%A2%E6%95%B0%E3%81%AF%201%20%E3%81%A4%E3%81%AE%20%24x%24%20%E3%81%AB%E8%A4%87%E6%95%B0%E3%81%AE%20%24y%24%20%E3%81%8C%E5%AF%BE%E5%BF%9C%E3%81%99%E3%82%8B%E6%9B%B2%E7%B7%9A%E3%82%92%E6%89%B1%E3%81%88%E3%82%8B%E3%81%8C%E3%80%81%E4%BF%82%E6%95%B0%E3%81%AB%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%AB%E3%81%AE%0A%20%20%20%20%20%20%E4%B8%8D%E5%AE%9A%E6%80%A7%E3%81%8C%E3%81%82%E3%82%8B%E3%80%82%E5%90%8C%E6%AC%A1%E5%BD%A2%E3%81%AE%E3%81%BE%E3%81%BE%20%60scipy.odr%60%20%E3%81%B8%E6%B8%A1%E3%81%99%E3%81%A8%20%24a%3D0%24%20%E3%81%AE%E8%87%AA%E6%98%8E%E8%A7%A3%E3%81%AB%E8%90%BD%E3%81%A1%E3%82%8B%E3%81%AE%E3%81%A7%E3%80%81%0A%20%20%20%20%20%20%24%5C%7Ca%5C%7C%3D1%24%20%E3%81%AE%E6%AD%A3%E8%A6%8F%E5%8C%96%E3%81%8B%E3%80%81%E6%88%90%E5%88%86%E3%81%AE%201%20%E3%81%A4%E3%82%92%E5%9B%BA%E5%AE%9A%E3%81%99%E3%82%8B%E6%8B%98%E6%9D%9F%E3%81%8C%E8%A6%81%E3%82%8B%E3%80%82%0A%20%20%20%20-%20%E5%A4%96%E3%82%8C%E5%80%A4%E3%81%8C%E3%81%82%E3%82%8B%E3%81%A8%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%97%E3%81%AF%E7%A0%B4%E7%B6%BB%E3%81%99%E3%82%8B%E3%80%82RANSAC%20%E3%81%AF%E6%9C%80%E5%B0%8F%E5%80%8B%E6%95%B0%E3%81%AE%E7%82%B9%E3%81%A7%E5%80%99%E8%A3%9C%E3%82%92%E4%BD%9C%E3%82%8A%E3%80%81%0A%20%20%20%20%20%20inlier%20%E3%81%8C%E6%9C%80%E5%A4%9A%E3%81%AE%E5%80%99%E8%A3%9C%E3%82%92%E9%81%B8%E3%81%B6%E3%80%82%E8%A9%A6%E8%A1%8C%E5%9B%9E%E6%95%B0%E3%81%AF%20%24N%3D%5Cln(1-p)%2F%5Cln(1-e%5En)%24%20%E3%81%A7%E8%A6%8B%E7%A9%8D%E3%82%82%E3%82%8A%E3%80%81%0A%20%20%20%20%20%20inlier%20%E7%8E%87%E3%81%AE%E6%9B%B4%E6%96%B0%E3%81%AB%E5%90%88%E3%82%8F%E3%81%9B%E3%81%A6%E7%B8%AE%E3%82%81%E3%82%89%E3%82%8C%E3%82%8B%E3%80%82%0A%20%20%20%20-%20%E9%99%B0%E9%96%A2%E6%95%B0%E3%81%AE%20RANSAC%20%E3%81%A7%E3%81%AF%E3%80%81%E4%BB%A3%E6%95%B0%E7%9A%84%E6%AE%8B%E5%B7%AE%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%20Sampson%20%E8%AA%A4%E5%B7%AE%E3%81%A7%E8%B7%9D%E9%9B%A2%E3%82%92%E6%B8%AC%E3%82%8B%E3%80%82%E5%88%86%E6%AF%8D%E3%81%AB%0A%20%20%20%20%20%20%E7%8F%BE%E3%82%8C%E3%82%8B%E6%AD%A3%E8%A6%8F%E5%8C%96%E5%85%B1%E5%88%86%E6%95%A3%E8%A1%8C%E5%88%97%20%24V_0%5B%5Cxi%5D%24%20%E3%81%AF%E3%80%81%E4%BA%8C%E9%87%8D%E6%95%B0%E3%81%AB%E3%82%88%E3%82%8B%E8%87%AA%E5%8B%95%E5%BE%AE%E5%88%86%E3%81%A7%E5%9F%BA%E5%BA%95%E9%96%A2%E6%95%B0%E3%81%8B%E3%82%89%0A%20%20%20%20%20%20%E6%A9%9F%E6%A2%B0%E7%9A%84%E3%81%AB%E5%BE%97%E3%82%89%E3%82%8C%E3%82%8B%E3%80%82%0A%20%20%20%20-%20%E6%AD%A3%E8%A6%8F%E5%8C%96%E3%81%97%E3%81%9F%E4%BF%82%E6%95%B0%E3%81%AE%E5%85%B1%E5%88%86%E6%95%A3%E8%A1%8C%E5%88%97%E3%81%AF%E3%80%81%E8%AA%A4%E5%B7%AE%E3%81%8C%E5%B0%8F%E3%81%95%E3%81%84%E7%AF%84%E5%9B%B2%E3%81%AE%E4%B8%80%E6%AC%A1%E8%BF%91%E4%BC%BC%E3%81%A7%E3%81%AF%E3%83%A9%E3%83%B3%E3%82%AF%20%24m-1%24%20%E3%81%AB%0A%20%20%20%20%20%20%E8%90%BD%E3%81%A1%E3%82%8B%E3%80%82%E6%93%AC%E4%BC%BC%E9%80%86%E8%A1%8C%E5%88%97%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E5%BC%8F%E3%81%AF%201000%20%E5%9B%9E%E3%81%AE%E3%83%A2%E3%83%B3%E3%83%86%E3%82%AB%E3%83%AB%E3%83%AD%E3%81%A7%E5%BE%97%E3%81%9F%E7%B5%8C%E9%A8%93%E7%9A%84%E3%81%AA%E5%85%B1%E5%88%86%E6%95%A3%E3%81%A8%0A%20%20%20%20%20%20%E4%B8%80%E8%87%B4%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
45fe41e32f46283cfd8f71af93388821