import%20marimo%0A%0A__generated_with%20%3D%20%220.18.4%22%0Aapp%20%3D%20marimo.App()%0A%0Awith%20app.setup%3A%0A%20%20%20%20import%20random%0A%0A%20%20%20%20import%20matplotlib.patches%20as%20mpatches%0A%20%20%20%20import%20matplotlib.pyplot%20as%20plt%0A%20%20%20%20import%20numpy%20as%20np%0A%0A%20%20%20%20from%20cvx.ball.solver%20import%20min_circle_cvx%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%20Second%20order%20cones%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20cvxpy%20supports%20second%20order%20cones%2C%20see%3A%0A%20%20%20%20https%3A%2F%2Fwww.cvxpy.org%2Fexamples%2Fbasic%2Fsocp.html%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20The%20discussion%20in%20this%20notebook%20follows%20https%3A%2F%2Fgithub.com%2FMOSEK%2FTutorials%2Fblob%2Fmaster%2Fminimum-ellipsoid%2Fminimum-ellipsoid.ipynb%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20We%20are%20computing%20the%20smallest%20sphere%20enclosing%20a%20set%20of%20points.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20A%20random%20set%20of%20points%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.function%0Adef%20cloud(n)%3A%0A%20%20%20%20%22%22%22Generate%20a%20random%20cloud%20of%202D%20points.%0A%0A%20%20%20%20Args%3A%0A%20%20%20%20%20%20%20%20n%3A%20Number%20of%20points%20to%20sample.%0A%0A%20%20%20%20Returns%3A%0A%20%20%20%20%20%20%20%20A%20NumPy%20array%20of%20shape%20(n%2C%202)%20with%20standard%20normal%20samples.%0A%20%20%20%20%22%22%22%0A%20%20%20%20%23%20compute%20a%20random%20set%20of%20points%20of%20n_points%20in%202-dimensional%20space%0A%20%20%20%20return%20np.array(%5B%5Brandom.gauss()%2C%20random.gauss()%5D%20for%20_%20in%20range(n)%5D)%0A%0A%0A%40app.function%0Adef%20plot_points(p%2C%20p0%3DNone%2C%20r0%3DNone)%3A%0A%20%20%20%20%22%22%22Plot%202D%20points%20and%20optionally%20overlay%20the%20enclosing%20circle.%0A%0A%20%20%20%20Args%3A%0A%20%20%20%20%20%20%20%20p%3A%20Array-like%20collection%20of%202D%20points.%0A%20%20%20%20%20%20%20%20p0%3A%20Optional%20center%20point%20(x%2C%20y)%20to%20draw%20in%20red.%0A%20%20%20%20%20%20%20%20r0%3A%20Optional%20radius%20of%20the%20circle%20to%20draw%20around%20%60%60p0%60%60.%0A%20%20%20%20%22%22%22%0A%20%20%20%20k%20%3D%20len(p)%0A%0A%20%20%20%20plt.rc(%22savefig%22%2C%20dpi%3D120)%0A%0A%20%20%20%20fig%2C%20ax%20%3D%20plt.subplots()%0A%20%20%20%20ax.set_aspect(%22equal%22)%0A%20%20%20%20ax.plot(%5Bp%5Bi%5D%5B0%5D%20for%20i%20in%20range(k)%5D%2C%20%5Bp%5Bi%5D%5B1%5D%20for%20i%20in%20range(k)%5D%2C%20%22b*%22)%0A%0A%20%20%20%20if%20p0%20is%20not%20None%3A%0A%20%20%20%20%20%20%20%20assert%20r0%20is%20not%20None%0A%20%20%20%20%20%20%20%20ax.plot(p0%5B0%5D%2C%20p0%5B1%5D%2C%20%22r.%22)%0A%20%20%20%20%20%20%20%20ax.add_patch(mpatches.Circle(p0%2C%20r0%2C%20fc%3D%22w%22%2C%20ec%3D%22r%22%2C%20lw%3D1.5))%0A%20%20%20%20plt.grid()%0A%20%20%20%20plt.show()%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20k%20%3D%20500%0A%20%20%20%20p%20%3D%20cloud(n%3Dk)%0A%20%20%20%20r0%2C%20p0%20%3D%20min_circle_cvx(p%2C%20solver%3D%22CLARABEL%22)%0A%20%20%20%20print(%22r0%5E*%20%3D%20%22%2C%20r0)%0A%20%20%20%20print(%22p0%5E*%20%3D%20%22%2C%20p0)%0A%20%20%20%20plot_points(p%2C%20p0%2C%20r0)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%0A%20%20%20%20We%20follow%20Mosek's%20excellent%20documentation%3A%0A%0A%20%20%20%20Before%20defining%20the%20constraints%2C%20we%20note%20that%20we%20can%20write%0A%0A%20%20%20%20%5Cbegin%7Bequation%7D%0A%20%20%20%20R_0%20%3D%20%5Cleft(%20%5Cbegin%7Barray%7D%7Bc%7D%20r_0%20%20%20%5C%5C%20%5Cvdots%20%5C%5C%20r_0%20%20%20%5Cend%7Barray%7D%20%5Cright)%20%5Cin%20%5Cmathbb%7BR%7D%5Ek%20%20%20%20%20%20%20%20%20%20%2C%20%5Cquad%0A%20%20%20%20P_0%20%3D%20%5Cleft(%20%5Cbegin%7Barray%7D%7Bc%7D%20p_0%5ET%20%5C%5C%20%5Cvdots%20%5C%5C%20p_0%5ET%20%5Cend%7Barray%7D%20%5Cright)%20%5Cin%20%5Cmathbb%7BR%7D%5E%7Bk%5Ctimes%20n%7D%2C%20%5Cquad%0A%20%20%20%20P%20%20%20%3D%20%5Cleft(%20%5Cbegin%7Barray%7D%7Bc%7D%20p_1%5ET%20%5C%5C%20%5Cvdots%20%5C%5C%20p_k%5ET%20%5Cend%7Barray%7D%20%5Cright)%20%5Cin%20%5Cmathbb%7BR%7D%5E%7Bk%5Ctimes%20n%7D.%0A%20%20%20%20%5Cend%7Bequation%7D%0A%0A%20%20%20%20so%20that%0A%0A%20%20%20%20%5Cbegin%7Bequation%7D%0A%20%20%20%20%5Cleft%5Br_0%2Cp_i%20-%20p_0%5Cright%5D%20%5Cin%20Q%5E%7B(n%2B1)%7D%2C%20%20%5Cquad%20%20i%3D1%2C%5Cldots%2Ck.%0A%20%20%20%20%5Cend%7Bequation%7D%0A%0A%20%20%20%20can%20be%20compactly%20expressed%20as%0A%0A%20%20%20%20%5Cbegin%7Bequation%7D%0A%20%20%20%20%5Cleft%5B%20R_0%2CP_0-P%5Cright%5D%20%5Cin%20%5CPi%20Q%5E%7B(n%2B1)%7D%2C%0A%20%20%20%20%5Cend%7Bequation%7D%0A%0A%20%20%20%20that%20means%2C%20with%20a%20little%20abuse%20of%20notation%2C%20that%20each%20rows%20belongs%20to%20a%0A%20%20%20%20quadratic%20cone%20of%20dimension%20%24n%2B1%24.%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%20import%20marimo%20as%20mo%0A%20%20%20%20return%20(mo%2C)%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
731937e0a690406ebc2cfc0d87056a0f