<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" style="display:none;"><!-- P {margin-top:0;margin-bottom:0;} --></style>
</head>
<body dir="ltr">
<style type="text/css" style="display:none;"><!-- P {margin-top:0;margin-bottom:0;} --></style>
<div id="divtagdefaultwrapper" style="font-size:12pt;color:#000000;font-family:Calibri,Helvetica,sans-serif;" dir="ltr">
<p>Not sure if anyone cares, but it was not a fundamental algorithmic problem in need of clever constraints but a typo:</p>
<p><br>
</p>
<p></p>
<pre style="background-color:#2b2b2b; color:#a9b7c6; font-family:'JetBrains Mono',monospace; font-size:9,0pt">error = center_point + a_axis_vector * np.cos(t * a_phase) + b_axis_vector * np.sin(t + b_phase) - data</pre>
here i multiply t with a_phase. A phase difference however is added to the time in a wave function, not multiplied with it. if you change this into
<br>
<p></p>
<p><br>
</p>
<p></p>
<pre style="background-color:#2b2b2b; color:#a9b7c6; font-family:'JetBrains Mono',monospace; font-size:9,0pt">error = center_point + a_axis_vector * np.cos(t + a_phase) + b_axis_vector * np.sin(t + b_phase) - data</pre>
it works as expected.<br>
<p></p>
</div>
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>Von:</b> Schuldei, Andreas<br>
<b>Gesendet:</b> Mittwoch, 7. Oktober 2020 11:28:42<br>
<b>An:</b> SciPy Users List<br>
<b>Betreff:</b> numeric deformation when using minimize() - looking for good constrains, boundaries or just a clever way to express the problem</font>
<div> </div>
</div>
<div>
<div id="divtagdefaultwrapper" dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,"EmojiFont","Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<p></p>
<pre style="background-color:#2b2b2b; color:#a9b7c6; font-family:'JetBrains Mono',monospace; font-size:9,0pt"><span style="color:#cc7832">import </span>numpy <span style="color:#cc7832">as </span>np<br><span style="color:#cc7832">from </span>scipy.optimize <span style="color:#cc7832">import </span>minimize<br><br><br><span style="color:#cc7832">def </span><span style="color:#ffc66d">find_ellipse_from_chunk</span>(data):<br> n = data.shape[<span style="color:#6897bb">0</span>] <span style="color:#808080"># number of points<br></span><span style="color:#808080"> </span><span style="color:#cc7832">assert </span>data.shape == (n<span style="color:#cc7832">, </span><span style="color:#6897bb">3</span>)<br> guess_center_point = data.mean(<span style="color:#aa4926">axis</span>=<span style="color:#6897bb">0</span>)<br> guess_a_axis_vector = np.array([<span style="color:#6897bb">0.0</span><span style="color:#cc7832">, </span><span style="color:#6897bb">0.0</span><span style="color:#cc7832">, </span><span style="color:#6897bb">1.0</span>])<br> guess_b_axis_vector = np.array([<span style="color:#6897bb">0.0</span><span style="color:#cc7832">, </span><span style="color:#6897bb">1.0</span>])<br> guess_phases = np.array([<span style="color:#6897bb">0.0</span><span style="color:#cc7832">, </span><span style="color:#6897bb">0.0</span>])<br> p0 = np.hstack([guess_center_point<span style="color:#cc7832">, </span>guess_a_axis_vector<span style="color:#cc7832">, </span>guess_b_axis_vector<span style="color:#cc7832">, </span>guess_phases])<br><br> <span style="color:#cc7832">def </span><span style="color:#ffc66d">ellipse_func</span>(x<span style="color:#cc7832">, </span>data):<br> center_point = x[<span style="color:#6897bb">0</span>:<span style="color:#6897bb">3</span>]<br> a_axis_vector = x[<span style="color:#6897bb">3</span>:<span style="color:#6897bb">6</span>]<br> b_axis_vector = np.hstack((x[<span style="color:#6897bb">6</span>]<span style="color:#cc7832">, </span>x[<span style="color:#6897bb">7</span>]<span style="color:#cc7832">, </span>(x[<span style="color:#6897bb">3</span>] * x[<span style="color:#6897bb">6</span>] + x[<span style="color:#6897bb">4</span>] * x[<span style="color:#6897bb">7</span>]) / (-x[<span style="color:#6897bb">5</span>])))<br> a_phase<span style="color:#cc7832">, </span>b_phase = x[<span style="color:#6897bb">8</span>:<span style="color:#6897bb">10</span>]<br> t = np.linspace(<span style="color:#6897bb">0</span><span style="color:#cc7832">, </span>(n / <span style="color:#6897bb">20</span>) * <span style="color:#6897bb">2 </span>* np.pi<span style="color:#cc7832">, </span>n)[np.newaxis].T <span style="color:#808080"># this must be transposed, so the math adds up<br></span><span style="color:#808080"> </span>error = center_point + a_axis_vector * np.cos(t * a_phase) + b_axis_vector * np.sin(t + b_phase) - data<br> error_sum = np.sum(error ** <span style="color:#6897bb">2</span>) + np.sum(error ** <span style="color:#6897bb">2</span>) * np.dot(a_axis_vector<span style="color:#cc7832">, </span>b_axis_vector)<br> <span style="color:#cc7832">return </span>error_sum<br><br> res = minimize(ellipse_func<span style="color:#cc7832">, </span>p0<span style="color:#cc7832">, </span><span style="color:#aa4926">args</span>=data)<br> x = res.x<br> result = np.hstack((x[<span style="color:#6897bb">0</span>:<span style="color:#6897bb">8</span>]<span style="color:#cc7832">, </span>(x[<span style="color:#6897bb">3</span>] * x[<span style="color:#6897bb">6</span>] + x[<span style="color:#6897bb">4</span>] * x[<span style="color:#6897bb">7</span>]) / (-x[<span style="color:#6897bb">5</span>])<span style="color:#cc7832">, </span>x[<span style="color:#6897bb">8</span>:<span style="color:#6897bb">10</span>]))<br> <span style="color:#cc7832">return </span>result<br><br><br><span style="color:#cc7832">def </span><span style="color:#ffc66d">main</span>():<br> data = np.array([[-<span style="color:#6897bb">4.62767933</span><span style="color:#cc7832">, </span>-<span style="color:#6897bb">4.6275775</span><span style="color:#cc7832">, </span>-<span style="color:#6897bb">4.62735346</span><span style="color:#cc7832">, </span>-<span style="color:#6897bb">4.62719652</span><span style="color:#cc7832">, </span>-<span style="color:#6897bb">4.62711625</span><span style="color:#cc7832">, </span>-<span style="color:#6897bb">4.62717975</span><span style="color:#cc7832">,<br></span><span style="color:#cc7832"> </span>-<span style="color:#6897bb">4.62723845</span><span style="color:#cc7832">, </span>-<span style="color:#6897bb">4.62722407</span><span style="color:#cc7832">, </span>-<span style="color:#6897bb">4.62713901</span><span style="color:#cc7832">, </span>-<span style="color:#6897bb">4.62708749</span><span style="color:#cc7832">, </span>-<span style="color:#6897bb">4.62703238</span><span style="color:#cc7832">, </span>-<span style="color:#6897bb">4.62689101</span><span style="color:#cc7832">,<br></span><span style="color:#cc7832"> </span>-<span style="color:#6897bb">4.62687185</span><span style="color:#cc7832">, </span>-<span style="color:#6897bb">4.62694013</span><span style="color:#cc7832">, </span>-<span style="color:#6897bb">4.62701082</span><span style="color:#cc7832">, </span>-<span style="color:#6897bb">4.62700483</span><span style="color:#cc7832">, </span>-<span style="color:#6897bb">4.62697488</span><span style="color:#cc7832">, </span>-<span style="color:#6897bb">4.62686825</span><span style="color:#cc7832">,<br></span><span style="color:#cc7832"> </span>-<span style="color:#6897bb">4.62675683</span><span style="color:#cc7832">, </span>-<span style="color:#6897bb">4.62675204</span>]<span style="color:#cc7832">,<br></span><span style="color:#cc7832"> </span>[-<span style="color:#6897bb">1.58625998</span><span style="color:#cc7832">, </span>-<span style="color:#6897bb">1.58625039</span><span style="color:#cc7832">, </span>-<span style="color:#6897bb">1.58619648</span><span style="color:#cc7832">, </span>-<span style="color:#6897bb">1.58617611</span><span style="color:#cc7832">, </span>-<span style="color:#6897bb">1.58620606</span><span style="color:#cc7832">, </span>-<span style="color:#6897bb">1.5861833</span><span style="color:#cc7832">,<br></span><span style="color:#cc7832"> </span>-<span style="color:#6897bb">1.5861821</span><span style="color:#cc7832">, </span>-<span style="color:#6897bb">1.58619169</span><span style="color:#cc7832">, </span>-<span style="color:#6897bb">1.58615814</span><span style="color:#cc7832">, </span>-<span style="color:#6897bb">1.58616893</span><span style="color:#cc7832">, </span>-<span style="color:#6897bb">1.58613179</span><span style="color:#cc7832">, </span>-<span style="color:#6897bb">1.58615934</span><span style="color:#cc7832">,<br></span><span style="color:#cc7832"> </span>-<span style="color:#6897bb">1.58611262</span><span style="color:#cc7832">, </span>-<span style="color:#6897bb">1.58610782</span><span style="color:#cc7832">, </span>-<span style="color:#6897bb">1.58613179</span><span style="color:#cc7832">, </span>-<span style="color:#6897bb">1.58614017</span><span style="color:#cc7832">, </span>-<span style="color:#6897bb">1.58613059</span><span style="color:#cc7832">, </span>-<span style="color:#6897bb">1.58612699</span><span style="color:#cc7832">,<br></span><span style="color:#cc7832"> </span>-<span style="color:#6897bb">1.58607428</span><span style="color:#cc7832">, </span>-<span style="color:#6897bb">1.58610183</span>]<span style="color:#cc7832">,<br></span><span style="color:#cc7832"> </span>[-<span style="color:#6897bb">0.96714786</span><span style="color:#cc7832">, </span>-<span style="color:#6897bb">0.96713827</span><span style="color:#cc7832">, </span>-<span style="color:#6897bb">0.96715984</span><span style="color:#cc7832">, </span>-<span style="color:#6897bb">0.96715145</span><span style="color:#cc7832">, </span>-<span style="color:#6897bb">0.96716703</span><span style="color:#cc7832">, </span>-<span style="color:#6897bb">0.96712869</span><span style="color:#cc7832">,<br></span><span style="color:#cc7832"> </span>-<span style="color:#6897bb">0.96716104</span><span style="color:#cc7832">, </span>-<span style="color:#6897bb">0.96713228</span><span style="color:#cc7832">, </span>-<span style="color:#6897bb">0.96719698</span><span style="color:#cc7832">, </span>-<span style="color:#6897bb">0.9671838</span><span style="color:#cc7832">, </span>-<span style="color:#6897bb">0.96717062</span><span style="color:#cc7832">, </span>-<span style="color:#6897bb">0.96717062</span><span style="color:#cc7832">,<br></span><span style="color:#cc7832"> </span>-<span style="color:#6897bb">0.96715744</span><span style="color:#cc7832">, </span>-<span style="color:#6897bb">0.96707717</span><span style="color:#cc7832">, </span>-<span style="color:#6897bb">0.96709275</span><span style="color:#cc7832">, </span>-<span style="color:#6897bb">0.96706519</span><span style="color:#cc7832">, </span>-<span style="color:#6897bb">0.96715026</span><span style="color:#cc7832">, </span>-<span style="color:#6897bb">0.96711791</span><span style="color:#cc7832">,<br></span><span style="color:#cc7832"> </span>-<span style="color:#6897bb">0.96713588</span><span style="color:#cc7832">, </span>-<span style="color:#6897bb">0.96714786</span>]])<br><br> x = find_ellipse_from_chunk(data.T)<br> <span style="color:#72737a">center_point </span>= x[<span style="color:#6897bb">0</span>:<span style="color:#6897bb">3</span>]<br> a_axis_vector = x[<span style="color:#6897bb">3</span>:<span style="color:#6897bb">6</span>]<br> b_axis_vector = x[<span style="color:#6897bb">6</span>:<span style="color:#6897bb">9</span>]<br> <span style="color:#72737a">a_phase</span><span style="color:#cc7832">, </span><span style="color:#72737a">b_phase </span>= x[<span style="color:#6897bb">9</span>:<span style="color:#6897bb">11</span>]<br> <span style="color:#8888c6">print</span>(<span style="color:#6a8759">"a: " </span>+ <span style="color:#8888c6">str</span>(a_axis_vector) + <span style="color:#6a8759">" b: " </span>+ <span style="color:#8888c6">str</span>(b_axis_vector))<br><br><br><span style="color:#cc7832">if </span>__name__ == <span style="color:#6a8759">'__main__'</span>:<br> main()<br></pre>
This is the algorithm that displays the weirdness. <br>
<p></p>
<p><br>
</p>
<p>I am trying to fit my data to ellipses. The weired form of the b_axis_vector is a mathematical attempt to make the a_axis_vector and b_axis_vector, which should represent the major and minor axis of the ellipse, stand orthogonal on each other. But apparently
this form of expressing the vector has a bad effect on the optimization algorithm, because the resulting vectors for the major and minor axis are rather unbalanced:</p>
<p><br>
</p>
<p></p>
<div>a: [-4.93203143e-07 -2.14349197e-05 5.00000007e-01] b: [-1.77464077e-04 -4.05250071e-05 -1.91235220e-09]<br>
<br>
</div>
always, the third dimensions of the vectors is much bigger (for vector a) or smaller (for vector b) then the other components and the resulting ellipse ends up as a line.
<br>
<p></p>
<p><br>
</p>
<p>What are ways that are more accomodating to numerical optimization for orthogonal vectors? How could constrictions look that would help? I really would appriciate helpful pointers, since this is clearly not my core expertise!</p>
<p><br>
</p>
<p>This is a version of the code that has a simple 3d plot that is helpful to view the data and the fitted ellipse:</p>
<p><br>
</p>
<p></p>
<pre style="background-color:#2b2b2b;color:#a9b7c6;font-family:'JetBrains Mono',monospace;font-size:9,0pt;"><span style="color:#cc7832;">import </span>numpy <span style="color:#cc7832;">as </span>np<br><span style="color:#cc7832;">from </span>scipy.optimize <span style="color:#cc7832;">import </span>minimize<br><span style="color:#cc7832;">from </span>matplotlib.pyplot <span style="color:#cc7832;">import </span>cm<br><span style="color:#cc7832;">import </span>matplotlib.pyplot <span style="color:#cc7832;">as </span>plt<br><span style="color:#cc7832;">import </span>matplotlib <span style="color:#cc7832;">as </span>mpl<br><br><span style="color:#cc7832;">def </span><span style="color:#ffc66d;">find_ellipse_from_chunk</span>(data):<br> n = data.shape[<span style="color:#6897bb;">0</span>] <span style="color:#808080;"># number of points<br></span><span style="color:#808080;"> </span><span style="color:#cc7832;">assert </span>data.shape == (n<span style="color:#cc7832;">, </span><span style="color:#6897bb;">3</span>)<br> guess_center_point = data.mean(<span style="color:#aa4926;">axis</span>=<span style="color:#6897bb;">0</span>)<br> guess_a_axis_vector = np.array([<span style="color:#6897bb;">0.0</span><span style="color:#cc7832;">, </span><span style="color:#6897bb;">0.0</span><span style="color:#cc7832;">, </span><span style="color:#6897bb;">1.0</span>])<br> guess_b_axis_vector = np.array([<span style="color:#6897bb;">0.0</span><span style="color:#cc7832;">, </span><span style="color:#6897bb;">1.0</span>])<br> guess_phases = np.array([<span style="color:#6897bb;">0.0</span><span style="color:#cc7832;">, </span><span style="color:#6897bb;">0.0</span>])<br> p0 = np.hstack([guess_center_point<span style="color:#cc7832;">, </span>guess_a_axis_vector<span style="color:#cc7832;">, </span>guess_b_axis_vector<span style="color:#cc7832;">, </span>guess_phases])<br><br> <span style="color:#cc7832;">def </span><span style="color:#ffc66d;">ellipse_func</span>(x<span style="color:#cc7832;">, </span>data):<br> center_point = x[<span style="color:#6897bb;">0</span>:<span style="color:#6897bb;">3</span>]<br> a_axis_vector = x[<span style="color:#6897bb;">3</span>:<span style="color:#6897bb;">6</span>]<br> b_axis_vector = np.hstack((x[<span style="color:#6897bb;">6</span>]<span style="color:#cc7832;">, </span>x[<span style="color:#6897bb;">7</span>]<span style="color:#cc7832;">, </span>(x[<span style="color:#6897bb;">3</span>] * x[<span style="color:#6897bb;">6</span>] + x[<span style="color:#6897bb;">4</span>] * x[<span style="color:#6897bb;">7</span>]) / (-x[<span style="color:#6897bb;">5</span>])))<br> a_phase<span style="color:#cc7832;">, </span>b_phase = x[<span style="color:#6897bb;">8</span>:<span style="color:#6897bb;">10</span>]<br> t = np.linspace(<span style="color:#6897bb;">0</span><span style="color:#cc7832;">, </span>(n / <span style="color:#6897bb;">20</span>) * <span style="color:#6897bb;">2 </span>* np.pi<span style="color:#cc7832;">, </span>n)[np.newaxis].T <span style="color:#808080;"># this must be transposed, so the math adds up<br></span><span style="color:#808080;"> </span>error = center_point + a_axis_vector * np.cos(t * a_phase) + b_axis_vector * np.sin(t + b_phase) - data<br> error_sum = np.sum(error ** <span style="color:#6897bb;">2</span>) + np.sum(error ** <span style="color:#6897bb;">2</span>) * np.dot(a_axis_vector<span style="color:#cc7832;">, </span>b_axis_vector)<br> <span style="color:#cc7832;">return </span>error_sum<br><br> res = minimize(ellipse_func<span style="color:#cc7832;">, </span>p0<span style="color:#cc7832;">, </span><span style="color:#aa4926;">args</span>=data)<br> x = res.x<br> result = np.hstack((x[<span style="color:#6897bb;">0</span>:<span style="color:#6897bb;">8</span>]<span style="color:#cc7832;">, </span>(x[<span style="color:#6897bb;">3</span>] * x[<span style="color:#6897bb;">6</span>] + x[<span style="color:#6897bb;">4</span>] * x[<span style="color:#6897bb;">7</span>]) / (-x[<span style="color:#6897bb;">5</span>])<span style="color:#cc7832;">, </span>x[<span style="color:#6897bb;">8</span>:<span style="color:#6897bb;">10</span>]))<br> <span style="color:#cc7832;">return </span>result<br><br><br><span style="color:#cc7832;">def </span><span style="color:#ffc66d;">calculate_ellipses</span>(ellipse<span style="color:#cc7832;">, </span>points):<br> <span style="color:#72737a;">calculated_ellipse </span>= np.zeros((points<span style="color:#cc7832;">, </span><span style="color:#6897bb;">3</span>))<br><br> center_point = ellipse[<span style="color:#6897bb;">0</span>:<span style="color:#6897bb;">3</span>]<br> a_axis_vector = ellipse[<span style="color:#6897bb;">3</span>:<span style="color:#6897bb;">6</span>]<br> b_axis_vector = ellipse[<span style="color:#6897bb;">6</span>:<span style="color:#6897bb;">9</span>]<br> a_phase<span style="color:#cc7832;">, </span>b_phase = ellipse[<span style="color:#6897bb;">9</span>:<span style="color:#6897bb;">11</span>]<br><br> <span style="color:#8888c6;">print</span>(<span style="color:#6a8759;">"a: " </span>+ <span style="color:#8888c6;">str</span>(a_axis_vector) + <span style="color:#6a8759;">" b: " </span>+ <span style="color:#8888c6;">str</span>(b_axis_vector))<br> t = np.linspace(<span style="color:#6897bb;">0</span><span style="color:#cc7832;">, </span>(points / <span style="color:#6897bb;">20</span>) * <span style="color:#6897bb;">2 </span>* np.pi<span style="color:#cc7832;">, </span>points)[np.newaxis].T<br> calculated_ellipse = center_point + a_axis_vector * np.cos(<br> t * a_phase) + b_axis_vector * np.sin(t + b_phase)<br><br> <span style="color:#cc7832;">return </span>calculated_ellipse.transpose()<br><br><br><span style="color:#cc7832;">def </span><span style="color:#ffc66d;">plot_sensor_in_3d</span>(data<span style="color:#cc7832;">, </span>calculated_ellipse):<br> fig_3d = plt.figure(<span style="color:#aa4926;">num</span>=<span style="color:#cc7832;">None, </span><span style="color:#aa4926;">figsize</span>=(<span style="color:#6897bb;">10</span><span style="color:#cc7832;">, </span><span style="color:#6897bb;">10</span>)<span style="color:#cc7832;">, </span><span style="color:#aa4926;">dpi</span>=<span style="color:#6897bb;">80</span><span style="color:#cc7832;">, </span><span style="color:#aa4926;">facecolor</span>=<span style="color:#6a8759;">'w'</span><span style="color:#cc7832;">, </span><span style="color:#aa4926;">edgecolor</span>=<span style="color:#6a8759;">'k'</span>)<br> mpl.rcParams[<span style="color:#6a8759;">'legend.fontsize'</span>] = <span style="color:#6897bb;">10<br></span><span style="color:#6897bb;"> </span>ax_3d = fig_3d.gca(<span style="color:#aa4926;">projection</span>=<span style="color:#6a8759;">'3d'</span>)<br> title = <span style="color:#6a8759;">"3D representation of magnetic field vector over 20ms </span><span style="color:#cc7832;">\n</span><span style="color:#6a8759;">for " </span><span style="color:#808080;"># + self.filestem<br></span><span style="color:#808080;"> </span>fig_3d.suptitle(title)<br> plt.xlabel(<span style="color:#6a8759;">'x-direction of magnetic flux density [10uT]'</span>)<br> plt.ylabel(<span style="color:#6a8759;">'y-direction of magnetic flux density [10uT]'</span>)<br> color = <span style="color:#8888c6;">iter</span>(cm.rainbow(np.linspace(<span style="color:#6897bb;">0</span><span style="color:#cc7832;">, </span><span style="color:#6897bb;">1</span><span style="color:#cc7832;">, </span><span style="color:#6897bb;">2</span>)))<br> c = <span style="color:#8888c6;">next</span>(color)<br> ax_3d.scatter(data[<span style="color:#6897bb;">0</span><span style="color:#cc7832;">, </span>:]<span style="color:#cc7832;">, </span>data[<span style="color:#6897bb;">1</span><span style="color:#cc7832;">, </span>:]<span style="color:#cc7832;">, </span>data[<span style="color:#6897bb;">2</span><span style="color:#cc7832;">, </span>:]<span style="color:#cc7832;">, </span><span style="color:#aa4926;">s</span>=<span style="color:#6897bb;">10</span><span style="color:#cc7832;">, </span><span style="color:#aa4926;">color</span>=c)<br> c = <span style="color:#8888c6;">next</span>(color)<br> ax_3d.plot(calculated_ellipse[<span style="color:#6897bb;">0</span><span style="color:#cc7832;">, </span>:]<span style="color:#cc7832;">, </span>calculated_ellipse[<span style="color:#6897bb;">1</span><span style="color:#cc7832;">, </span>:]<span style="color:#cc7832;">, </span>calculated_ellipse[<span style="color:#6897bb;">2</span><span style="color:#cc7832;">, </span>:]<span style="color:#cc7832;">, </span><span style="color:#aa4926;">color</span>=c)<br> plt.show()<br><br><br><span style="color:#cc7832;">def </span><span style="color:#ffc66d;">main</span>():<br> data = np.array([[-<span style="color:#6897bb;">4.62767933</span><span style="color:#cc7832;">, </span>-<span style="color:#6897bb;">4.6275775</span><span style="color:#cc7832;">, </span>-<span style="color:#6897bb;">4.62735346</span><span style="color:#cc7832;">, </span>-<span style="color:#6897bb;">4.62719652</span><span style="color:#cc7832;">, </span>-<span style="color:#6897bb;">4.62711625</span><span style="color:#cc7832;">, </span>-<span style="color:#6897bb;">4.62717975</span><span style="color:#cc7832;">,<br></span><span style="color:#cc7832;"> </span>-<span style="color:#6897bb;">4.62723845</span><span style="color:#cc7832;">, </span>-<span style="color:#6897bb;">4.62722407</span><span style="color:#cc7832;">, </span>-<span style="color:#6897bb;">4.62713901</span><span style="color:#cc7832;">, </span>-<span style="color:#6897bb;">4.62708749</span><span style="color:#cc7832;">, </span>-<span style="color:#6897bb;">4.62703238</span><span style="color:#cc7832;">, </span>-<span style="color:#6897bb;">4.62689101</span><span style="color:#cc7832;">,<br></span><span style="color:#cc7832;"> </span>-<span style="color:#6897bb;">4.62687185</span><span style="color:#cc7832;">, </span>-<span style="color:#6897bb;">4.62694013</span><span style="color:#cc7832;">, </span>-<span style="color:#6897bb;">4.62701082</span><span style="color:#cc7832;">, </span>-<span style="color:#6897bb;">4.62700483</span><span style="color:#cc7832;">, </span>-<span style="color:#6897bb;">4.62697488</span><span style="color:#cc7832;">, </span>-<span style="color:#6897bb;">4.62686825</span><span style="color:#cc7832;">,<br></span><span style="color:#cc7832;"> </span>-<span style="color:#6897bb;">4.62675683</span><span style="color:#cc7832;">, </span>-<span style="color:#6897bb;">4.62675204</span>]<span style="color:#cc7832;">,<br></span><span style="color:#cc7832;"> </span>[-<span style="color:#6897bb;">1.58625998</span><span style="color:#cc7832;">, </span>-<span style="color:#6897bb;">1.58625039</span><span style="color:#cc7832;">, </span>-<span style="color:#6897bb;">1.58619648</span><span style="color:#cc7832;">, </span>-<span style="color:#6897bb;">1.58617611</span><span style="color:#cc7832;">, </span>-<span style="color:#6897bb;">1.58620606</span><span style="color:#cc7832;">, </span>-<span style="color:#6897bb;">1.5861833</span><span style="color:#cc7832;">,<br></span><span style="color:#cc7832;"> </span>-<span style="color:#6897bb;">1.5861821</span><span style="color:#cc7832;">, </span>-<span style="color:#6897bb;">1.58619169</span><span style="color:#cc7832;">, </span>-<span style="color:#6897bb;">1.58615814</span><span style="color:#cc7832;">, </span>-<span style="color:#6897bb;">1.58616893</span><span style="color:#cc7832;">, </span>-<span style="color:#6897bb;">1.58613179</span><span style="color:#cc7832;">, </span>-<span style="color:#6897bb;">1.58615934</span><span style="color:#cc7832;">,<br></span><span style="color:#cc7832;"> </span>-<span style="color:#6897bb;">1.58611262</span><span style="color:#cc7832;">, </span>-<span style="color:#6897bb;">1.58610782</span><span style="color:#cc7832;">, </span>-<span style="color:#6897bb;">1.58613179</span><span style="color:#cc7832;">, </span>-<span style="color:#6897bb;">1.58614017</span><span style="color:#cc7832;">, </span>-<span style="color:#6897bb;">1.58613059</span><span style="color:#cc7832;">, </span>-<span style="color:#6897bb;">1.58612699</span><span style="color:#cc7832;">,<br></span><span style="color:#cc7832;"> </span>-<span style="color:#6897bb;">1.58607428</span><span style="color:#cc7832;">, </span>-<span style="color:#6897bb;">1.58610183</span>]<span style="color:#cc7832;">,<br></span><span style="color:#cc7832;"> </span>[-<span style="color:#6897bb;">0.96714786</span><span style="color:#cc7832;">, </span>-<span style="color:#6897bb;">0.96713827</span><span style="color:#cc7832;">, </span>-<span style="color:#6897bb;">0.96715984</span><span style="color:#cc7832;">, </span>-<span style="color:#6897bb;">0.96715145</span><span style="color:#cc7832;">, </span>-<span style="color:#6897bb;">0.96716703</span><span style="color:#cc7832;">, </span>-<span style="color:#6897bb;">0.96712869</span><span style="color:#cc7832;">,<br></span><span style="color:#cc7832;"> </span>-<span style="color:#6897bb;">0.96716104</span><span style="color:#cc7832;">, </span>-<span style="color:#6897bb;">0.96713228</span><span style="color:#cc7832;">, </span>-<span style="color:#6897bb;">0.96719698</span><span style="color:#cc7832;">, </span>-<span style="color:#6897bb;">0.9671838</span><span style="color:#cc7832;">, </span>-<span style="color:#6897bb;">0.96717062</span><span style="color:#cc7832;">, </span>-<span style="color:#6897bb;">0.96717062</span><span style="color:#cc7832;">,<br></span><span style="color:#cc7832;"> </span>-<span style="color:#6897bb;">0.96715744</span><span style="color:#cc7832;">, </span>-<span style="color:#6897bb;">0.96707717</span><span style="color:#cc7832;">, </span>-<span style="color:#6897bb;">0.96709275</span><span style="color:#cc7832;">, </span>-<span style="color:#6897bb;">0.96706519</span><span style="color:#cc7832;">, </span>-<span style="color:#6897bb;">0.96715026</span><span style="color:#cc7832;">, </span>-<span style="color:#6897bb;">0.96711791</span><span style="color:#cc7832;">,<br></span><span style="color:#cc7832;"> </span>-<span style="color:#6897bb;">0.96713588</span><span style="color:#cc7832;">, </span>-<span style="color:#6897bb;">0.96714786</span>]])<br><br> x = find_ellipse_from_chunk(data.T)<br> <span style="color:#8888c6;">print</span>(<span style="color:#8888c6;">str</span>(x))<br> <span style="color:#72737a;">center_point </span>= x[<span style="color:#6897bb;">0</span>:<span style="color:#6897bb;">3</span>]<br> a_axis_vector = x[<span style="color:#6897bb;">3</span>:<span style="color:#6897bb;">6</span>]<br> b_axis_vector = x[<span style="color:#6897bb;">6</span>:<span style="color:#6897bb;">9</span>]<br> <span style="color:#72737a;">a_phase</span><span style="color:#cc7832;">, </span><span style="color:#72737a;">b_phase </span>= x[<span style="color:#6897bb;">9</span>:<span style="color:#6897bb;">11</span>]<br> <span style="color:#8888c6;">print</span>(<span style="color:#6a8759;">"a: " </span>+ <span style="color:#8888c6;">str</span>(a_axis_vector) + <span style="color:#6a8759;">" b: " </span>+ <span style="color:#8888c6;">str</span>(b_axis_vector))<br> calculated_ellipse = calculate_ellipses(x<span style="color:#cc7832;">, </span>data.shape[<span style="color:#6897bb;">1</span>])<br> plot_sensor_in_3d(data<span style="color:#cc7832;">, </span>calculated_ellipse)<br><br><br><span style="color:#cc7832;">if </span>__name__ == <span style="color:#6a8759;">'__main__'</span>:<br> main()<br></pre>
<br>
</div>
</div>
</body>
</html>