python4enlighteninghttp://junilyd.github.io/2014-09-20T14:12:00-03:00Fundamentals of Estimation Theory2014-09-20T14:12:00-03:00junilydtag:junilyd.github.io,2014-09-20:blog/2014/09/20/fundamentals-of-estimation-theory/<p>
<div class="text_cell_render border-box-sizing rendered_html">
<h2 id="the-mathematical-estimation-problem">The Mathematical Estimation Problem</h2>
<p>Since our study group has planned to design a poly tuner, by utilizing multi pitch estimation, this is a brief investigation into the basics of estimation theory.</p>
</div>
<div class="text_cell_render border-box-sizing rendered_html">
The <span class="math">\(N\)</span>-point dataset is <span class="math">\(\texttt{x} = x(n) = \{x[0], x[1], ... ,x[N-1] \}\)</span> is dependent on an unknown parameter <span class="math">\(\theta\)</span>, which is to be determined based on the data. Therefore, an estimator <span class="math">\(\hat{\theta}\)</span> is defined as
<p>When determining good estimators the first step is to mathematically model the data. Because the data are random, it is described by its probability density function (PDF).</p>
</div>
<div class="text_cell_render border-box-sizing rendered_html">
</div>
<div class="text_cell_render border-box-sizing rendered_html">
<p>Therefore, it is clear that the signal is gaussian distributed with mean <span class="math">\(\theta\)</span>. The next figure shows the dependency between these by an example where <span class="math">\(N=1\)</span> for <span class="math">\(x[0]\)</span>.</p>
</div>
<div class="cell border-box-sizing code_cell vbox">
<div class="input hbox">
<div class="prompt input_prompt">
In [1]:
</div>
<div class="input_area box-flex1">
<div class="highlight-ipynb"><pre class="ipynb"><span class="kn">import</span> <span class="nn">pymatbridge</span> <span class="kn">as</span> <span class="nn">mpb</span>
<span class="n">ip</span> <span class="o">=</span> <span class="n">get_ipython</span><span class="p">()</span>
<span class="n">mpb</span><span class="o">.</span><span class="n">load_ipython_extension</span><span class="p">(</span><span class="n">ip</span><span class="p">)</span>
</pre></div>
</div>
</div>
<div class="vbox output_wrapper">
<div class="output vbox">
<div class="hbox output_area"><div class="prompt"></div>
<div class="box-flex1 output_subarea output_stream output_stdout">
<pre>
Starting MATLAB on ZMQ socket ipc:///tmp/pymatbridge
Send 'exit' command to kill the server
............................MATLAB started and connected!
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell vbox">
<div class="input hbox">
<div class="prompt input_prompt">
In [2]:
</div>
<div class="input_area box-flex1">
<div class="highlight-ipynb"><pre class="ipynb"><span class="o">%%</span><span class="k">matlab</span>
<span class="n">sigma</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
<span class="n">theta1</span> <span class="o">=-</span><span class="mi">18</span><span class="p">;</span> <span class="n">theta2</span> <span class="o">=</span> <span class="n">theta1</span><span class="o">+</span><span class="mi">10</span><span class="p">;</span> <span class="n">theta3</span> <span class="o">=</span> <span class="n">theta2</span><span class="o">+</span><span class="mi">10</span><span class="p">;</span>
<span class="n">x0</span> <span class="o">=</span> <span class="n">linspace</span><span class="p">(</span><span class="n">theta1</span><span class="o">-</span><span class="mi">5</span><span class="p">,</span><span class="n">theta3</span><span class="o">+</span><span class="mi">5</span><span class="p">,</span><span class="mi">1000</span><span class="p">);</span>
<span class="n">p1</span> <span class="o">=</span> <span class="mf">1.</span><span class="o">/</span><span class="n">sqrt</span><span class="p">(</span><span class="mi">2</span><span class="o">*</span><span class="n">pi</span><span class="o">*</span><span class="n">sigma</span><span class="o">.^</span><span class="mi">2</span><span class="p">)</span> <span class="o">.*</span> <span class="n">exp</span><span class="p">(</span> <span class="o">-</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="o">./</span><span class="p">(</span><span class="mi">2</span><span class="o">*</span><span class="n">sigma</span><span class="o">.^</span><span class="mi">2</span><span class="p">)</span><span class="o">.*</span><span class="p">(</span><span class="n">x0</span><span class="o">-</span><span class="n">theta1</span><span class="p">)</span><span class="o">.^</span><span class="mi">2</span> <span class="p">);</span>
<span class="n">p2</span> <span class="o">=</span> <span class="mf">1.</span><span class="o">/</span><span class="n">sqrt</span><span class="p">(</span><span class="mi">2</span><span class="o">*</span><span class="n">pi</span><span class="o">*</span><span class="n">sigma</span><span class="o">.^</span><span class="mi">2</span><span class="p">)</span> <span class="o">.*</span> <span class="n">exp</span><span class="p">(</span> <span class="o">-</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="o">./</span><span class="p">(</span><span class="mi">2</span><span class="o">*</span><span class="n">sigma</span><span class="o">.^</span><span class="mi">2</span><span class="p">)</span><span class="o">.*</span><span class="p">(</span><span class="n">x0</span><span class="o">-</span><span class="n">theta2</span><span class="p">)</span><span class="o">.^</span><span class="mi">2</span> <span class="p">);</span>
<span class="n">p3</span> <span class="o">=</span> <span class="mf">1.</span><span class="o">/</span><span class="n">sqrt</span><span class="p">(</span><span class="mi">2</span><span class="o">*</span><span class="n">pi</span><span class="o">*</span><span class="n">sigma</span><span class="o">.^</span><span class="mi">2</span><span class="p">)</span> <span class="o">.*</span> <span class="n">exp</span><span class="p">(</span> <span class="o">-</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="o">./</span><span class="p">(</span><span class="mi">2</span><span class="o">*</span><span class="n">sigma</span><span class="o">.^</span><span class="mi">2</span><span class="p">)</span><span class="o">.*</span><span class="p">(</span><span class="n">x0</span><span class="o">-</span><span class="n">theta3</span><span class="p">)</span><span class="o">.^</span><span class="mi">2</span> <span class="p">);</span>
<span class="n">plot</span><span class="p">(</span><span class="n">x0</span><span class="p">,</span><span class="n">p1</span><span class="p">,</span><span class="s">'k'</span><span class="p">,</span><span class="n">x0</span><span class="p">,</span><span class="n">p2</span><span class="p">,</span><span class="s">'.k'</span><span class="p">,</span><span class="n">x0</span><span class="p">,</span><span class="n">p3</span><span class="p">,</span><span class="s">'--k'</span><span class="p">,</span><span class="s">'linewidth'</span><span class="p">,</span><span class="mi">2</span><span class="p">)</span>
<span class="n">title</span><span class="p">(</span><span class="s">'Dependence of PDF on unknown parameter </span><span class="se">\t</span><span class="s">heta'</span><span class="p">,</span><span class="s">'fontsize'</span><span class="p">,</span><span class="mi">18</span><span class="p">)</span>
<span class="n">xlabel</span><span class="p">(</span><span class="s">'x[0]'</span><span class="p">,</span><span class="s">'fontsize'</span><span class="p">,</span><span class="mi">16</span><span class="p">)</span>
<span class="n">ylabel</span><span class="p">(</span><span class="s">'p(x[0];</span><span class="se">\t</span><span class="s">heta)'</span><span class="p">,</span><span class="s">'fontsize'</span><span class="p">,</span><span class="mi">16</span><span class="p">);</span> <span class="n">ylim</span><span class="p">([</span><span class="mi">0</span> <span class="mi">1</span><span class="p">])</span>
<span class="n">legend</span><span class="p">(</span><span class="n">sprintf</span><span class="p">(</span><span class="s">'</span><span class="se">\\</span><span class="s">theta1 = </span><span class="si">%1.0f</span><span class="s">'</span><span class="p">,</span><span class="n">theta1</span><span class="p">),</span><span class="n">sprintf</span><span class="p">(</span><span class="s">'</span><span class="se">\\</span><span class="s">theta2 = </span><span class="si">%1.0f</span><span class="s">'</span><span class="p">,</span><span class="n">theta2</span><span class="p">),</span><span class="n">sprintf</span><span class="p">(</span><span class="s">'</span><span class="se">\\</span><span class="s">theta3 = </span><span class="si">%3.0f</span><span class="s">'</span><span class="p">,</span><span class="n">theta3</span><span class="p">))</span>
</pre></div>
</div>
</div>
<div class="vbox output_wrapper">
<div class="output vbox">
<div class="hbox output_area"><div class="prompt"></div>
<div class="box-flex1 output_subarea output_display_data">
<img src="data:image/png;base64,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
">
</div>
</div>
</div>
</div>
</div>
<div class="text_cell_render border-box-sizing rendered_html">
<p>From this figure it can be seen that the value of <span class="math">\(\theta\)</span> affects the probaility of x[0], and we should be able to infer the value of <span class="math">\(\theta\)</span> from the observed value of <span class="math">\(x[0]\)</span>. i.e. If we masure x[0] to be positive, it is most likely that <span class="math">\(\theta = \theta3\)</span>.</p>
<p>In order to design a good estimator it is required to specify a PDF which is consistent with the problem constraints and any prior knowledge.</p>
</div>
<div class="text_cell_render border-box-sizing rendered_html">
<p>This will be continued later...</p>
</div>
<div class="cell border-box-sizing code_cell vbox">
<div class="input hbox">
<div class="prompt input_prompt">
In []:
</div>
<div class="input_area box-flex1">
<div class="highlight-ipynb"><pre class="ipynb">
</pre></div>
</div>
</div>
</div></p>Matlab Code in iPython Notebook2014-09-19T18:10:00-03:00junilydtag:junilyd.github.io,2014-09-19:blog/2014/09/19/matlab-code-in-ipython-notebook/<p>
<div class="text_cell_render border-box-sizing rendered_html">
<p>I was very pleased today to find out that some people made a library which makes it possible to utilize MATLAB code directly in the iPython Notebook, which this webpage is written in. As you see in the In[134] the library is called pymatbridge. For me personally this is advantageous because most of the material at this semester is based on utilizing MATLAB libraries, so now this webpage is directly compatible with my daily work, with <span class="math">\(\LaTeX\)</span>, MATLAB and Python.</p>
</div>
<div class="text_cell_render border-box-sizing rendered_html">
<h2 id="importing-pymatbridge-and-starting-matlab">Importing pymatbridge and starting MATLAB</h2>
<p>This is how to enable the bridge.</p>
</div>
<div class="cell border-box-sizing code_cell vbox">
<div class="input hbox">
<div class="prompt input_prompt">
In [2]:
</div>
<div class="input_area box-flex1">
<div class="highlight-ipynb"><pre class="ipynb"><span class="kn">import</span> <span class="nn">pymatbridge</span> <span class="kn">as</span> <span class="nn">mpb</span>
<span class="n">ip</span> <span class="o">=</span> <span class="n">get_ipython</span><span class="p">()</span>
<span class="n">mpb</span><span class="o">.</span><span class="n">load_ipython_extension</span><span class="p">(</span><span class="n">ip</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
<div class="text_cell_render border-box-sizing rendered_html">
<h2 id="example-of-plotting">Example of plotting</h2>
</div>
<div class="cell border-box-sizing code_cell vbox">
<div class="input hbox">
<div class="prompt input_prompt">
In [3]:
</div>
<div class="input_area box-flex1">
<div class="highlight-ipynb"><pre class="ipynb"><span class="o">%%</span><span class="k">matlab</span>
<span class="n">a</span><span class="o">=</span> <span class="n">linspace</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">6</span><span class="o">*</span><span class="n">pi</span><span class="p">,</span><span class="mi">1000</span><span class="p">);</span>
<span class="n">plot</span><span class="p">(</span><span class="n">sin</span><span class="p">(</span><span class="n">a</span><span class="p">)</span><span class="o">+</span><span class="mf">0.25</span><span class="o">*</span><span class="n">sin</span><span class="p">(</span><span class="mi">20</span><span class="o">*</span><span class="n">a</span><span class="o">+</span><span class="mf">0.5</span><span class="o">*</span><span class="n">pi</span><span class="p">))</span>
<span class="n">title</span><span class="p">(</span><span class="s">'Test Plot of Amplitude Modulation Signal'</span><span class="p">,</span><span class="s">'fontsize'</span><span class="p">,</span><span class="mi">18</span><span class="p">)</span>
<span class="n">xlabel</span><span class="p">(</span><span class="s">'n'</span><span class="p">,</span><span class="s">'fontsize'</span><span class="p">,</span><span class="mi">16</span><span class="p">)</span>
<span class="n">ylabel</span><span class="p">(</span><span class="s">'f(n)'</span><span class="p">,</span><span class="s">'fontsize'</span><span class="p">,</span><span class="mi">16</span><span class="p">)</span>
</pre></div>
</div>
</div>
<div class="vbox output_wrapper">
<div class="output vbox">
<div class="hbox output_area"><div class="prompt"></div>
<div class="box-flex1 output_subarea output_display_data">
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAkAAAAGwCAIAAADOgk3lAAAACXBIWXMAAAsSAAALEgHS3X78AAAA
IXRFWHRTb2Z0d2FyZQBBcnRpZmV4IEdob3N0c2NyaXB0IDguNTRTRzzSAAATvUlEQVR4nO3d0Zqi
urYGUDlfv/8rey5czbYFERGSOWfGuFqry5JASP4kRGu63+83AMjm/3oXAACOEGAApCTAAEhJgAGQ
kgADICUBBkBKAgyAlAQYACkJMABS+tO7ALw1TdP2C677FpV3h34+4uM1Db7JZS7M9rEalOf5ECce
7vBbbV+Zndft91L9WP6Lqmx5D7e/e5u1kWEJsLhe7vtzG8Oed1sWYJqmxv3Ut797rIQHdMny7F4u
1NUjsJc6er43VFYNlhDZ63nmEU3MUtHF6ngi8t3LYQKMOt6tpD26remvlx8V6NSWp1DgpOAjS4gV
PPdWqwuPLz+d//H0BznLYuw51i+/u/zp6iri/I/zUtLyX+aXvSvP6kGXhVxdv1o9r3c2KnRpWeB3
/759Xhul+nhGq69/OdDHC7VRvOXV3jj6/Curk7DV8r+87erDzm9bGQ0IsPSeG+rLQv+ylT5+utrJ
7jnQu195d6Dbmw79rN/d7/nhx/bDvI3yvHvnrwr5Mcw2KvQX2+f1bcRuH2j14dP2hdpz2b+9MvNZ
fLX9Z/Xct1vZxsM2LmUJMbftoe6LRyfy1Zs/u+3rej4W46zffXbuw/nfy/POu/N9ecGBoz+/ZjUU
V487/V1c3S7VV07Z5rN64jvfeXmfP9/DOw+9fM+Nw+0pFVcwA0vvY/s5PIlJ0TI/jpfTOVZTVrFe
rM6oUt8YLAmw9DaG58snNLeiXdtZM6QIDp/LtPYAr73uBXhxyrrohmjnOxQBVsHO9Y15vahYhq1u
2Uh9mnlLvpzut+/fW1Z9hPMdmWdgBS1nXQ95u8V3Buks9pzmWU+wahjkxkCA5bZ81r3cE9WlDLd9
3egvv3udc8vz/G7vznf7BfuPvrF/Z/W4827P7VLtPMrhV557G6xuAHn3ht+e+zbB2ZglxPTmfeHz
/7770W3RgM9Ki48H2jjWnt9dtVH4j3vlt92/+bzRsjzLGnl5t2V9fXzB77av83apts9o4yjzK6f3
W/b3FO/3k914w/1nt/93U69gJ+Iqw/9EmP/RndsgC0uIwNCs++UlwIDRRXsKy06egQFDO/fxGy15
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
">
</div>
</div>
</div>
</div>
</div>
<div class="text_cell_render border-box-sizing rendered_html">
<h2 id="matrix-syntax-and-covariance-matrices">Matrix Syntax and Covariance Matrices</h2>
</div>
<div class="text_cell_render border-box-sizing rendered_html">
<h3 id="covariance-matrix">Covariance Matrix</h3>
<p>Now we will show how to calculate the covariance matrix by matrix multiplications.</p>
</div>
<div class="cell border-box-sizing code_cell vbox">
<div class="input hbox">
<div class="prompt input_prompt">
In [4]:
</div>
<div class="input_area box-flex1">
<div class="highlight-ipynb"><pre class="ipynb"><span class="o">%%</span><span class="k">matlab</span>
<span class="n">format</span> <span class="n">compact</span>
<span class="n">X</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="o">+</span><span class="n">j</span> <span class="mi">2</span><span class="o">-</span><span class="n">j</span><span class="p">;</span><span class="mi">3</span><span class="o">+</span><span class="n">j</span> <span class="mi">4</span><span class="o">-</span><span class="n">j</span><span class="p">]</span>
<span class="p">[</span><span class="n">m</span><span class="p">,</span><span class="n">n</span><span class="p">]</span> <span class="o">=</span> <span class="n">size</span><span class="p">(</span><span class="n">X</span><span class="p">);</span>
<span class="n">ONE</span> <span class="o">=</span> <span class="n">ones</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="n">m</span><span class="p">)</span>
<span class="n">X_bar</span> <span class="o">=</span> <span class="n">mean</span><span class="p">(</span><span class="n">X</span><span class="p">)</span>
<span class="n">X_bar</span> <span class="o">=</span> <span class="p">(</span><span class="n">X_bar</span><span class="s">'*ONE)'</span>
<span class="n">R</span> <span class="o">=</span> <span class="n">X</span><span class="o">-</span><span class="n">X_bar</span>
<span class="n">Covariance</span> <span class="o">=</span> <span class="p">(</span><span class="s">R'*R)/(m-1)</span>
</pre></div>
</div>
</div>
<div class="vbox output_wrapper">
<div class="output vbox">
<div class="hbox output_area"><div class="prompt"></div>
<div class="box-flex1 output_subarea output_display_data">
<pre>
X =
1.0000 + 1.0000i 2.0000 - 1.0000i
3.0000 + 1.0000i 4.0000 - 1.0000i
ONE =
1 1
X_bar =
2.0000 + 1.0000i 3.0000 - 1.0000i
X_bar =
2.0000 + 1.0000i 3.0000 - 1.0000i
2.0000 + 1.0000i 3.0000 - 1.0000i
R =
-1 -1
1 1
Covariance =
2 2
2 2
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="text_cell_render border-box-sizing rendered_html">
<p>And basically, the correlation matrix is a scaled version of the covariance matrix. It is scaled to the sample variance as follows: Firstly, we define the covariance as <span class="math">\(\sigma\)</span> and the correlation <span class="math">\(C\)</span></p>
</div>
<div class="text_cell_render border-box-sizing rendered_html">
</div>
<div class="text_cell_render border-box-sizing rendered_html">
<h2 id="correlation-between-two-vectors">Correlation Between Two Vectors</h2>
<p>Now we will do a quick example of plotting the correlation between 2 measurements of 400 random samples. Therefore, they do show no correlation.</p>
</div>
<div class="cell border-box-sizing code_cell vbox">
<div class="input hbox">
<div class="prompt input_prompt">
In [5]:
</div>
<div class="input_area box-flex1">
<div class="highlight-ipynb"><pre class="ipynb"><span class="o">%%</span><span class="k">matlab</span>
<span class="n">X</span><span class="o">=</span><span class="n">rand</span><span class="p">(</span><span class="mi">400</span><span class="p">,</span><span class="mi">2</span><span class="p">);</span>
<span class="n">x_bar</span> <span class="o">=</span> <span class="n">mean</span><span class="p">(</span><span class="n">X</span><span class="p">)</span><span class="s">'</span>
<span class="n">x_covar</span> <span class="o">=</span> <span class="n">cov</span><span class="p">(</span><span class="n">X</span><span class="p">)</span>
<span class="n">x_corr</span> <span class="o">=</span> <span class="n">corr</span><span class="p">(</span><span class="n">X</span><span class="p">)</span>
<span class="n">R</span> <span class="o">=</span> <span class="n">corrcoef</span><span class="p">(</span><span class="n">X</span><span class="p">)</span>
<span class="n">Sn</span> <span class="o">=</span> <span class="n">x_covar</span><span class="p">;</span> <span class="n">fprintf</span><span class="p">(</span><span class="s">'</span><span class="se">\n</span><span class="s">------------------------------------------------</span><span class="se">\n</span><span class="s">'</span><span class="p">);</span>
<span class="n">figure</span>
<span class="n">a</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span><span class="n">b</span><span class="o">=</span><span class="mi">2</span><span class="p">;</span>
<span class="n">scatterhist</span><span class="p">(</span><span class="n">X</span><span class="p">(:,</span><span class="n">a</span><span class="p">),</span><span class="n">X</span><span class="p">(:,</span><span class="n">b</span><span class="p">),</span><span class="mi">100</span><span class="p">);</span>
<span class="n">xlabel</span><span class="p">(</span><span class="n">sprintf</span><span class="p">(</span><span class="s">'Column </span><span class="si">%1.0f</span><span class="s">'</span><span class="p">,</span><span class="n">a</span><span class="p">),</span><span class="s">'Fontsize'</span><span class="p">,</span><span class="mi">15</span><span class="p">);</span> <span class="n">ylabel</span><span class="p">(</span><span class="n">sprintf</span><span class="p">(</span><span class="s">'Column </span><span class="si">%1.0f</span><span class="s">'</span><span class="p">,</span><span class="n">b</span><span class="p">),</span><span class="s">'fontsize'</span><span class="p">,</span><span class="mi">15</span><span class="p">);</span>
</pre></div>
</div>
</div>
<div class="vbox output_wrapper">
<div class="output vbox">
<div class="hbox output_area"><div class="prompt"></div>
<div class="box-flex1 output_subarea output_display_data">
<pre>
x_bar =
0.4997
0.4969
x_covar =
0.0783 0.0007
0.0007 0.0801
x_corr =
1.0000 0.0088
0.0088 1.0000
R =
1.0000 0.0088
0.0088 1.0000
------------------------------------------------
</pre>
</div>
</div>
<div class="hbox output_area"><div class="prompt"></div>
<div class="box-flex1 output_subarea output_display_data">
<img src="data:image/png;base64,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
">
</div>
</div>
</div>
</div>
</div></p>Fibonacci Mystery Pythonified2014-08-13T22:44:00-03:00junilydtag:junilyd.github.io,2014-08-13:blog/2014/08/13/fibonacci-mystery-pythonified/<p>
<div class="text_cell_render border-box-sizing rendered_html">
<p>The Fibonacci numbers are generated by setting <span class="math">\(F(0)=0, F(1)=1\)</span>, and then using the recursive formula <span class="math">\[
\begin{equation}
F(n) = F(n-1) + F(n-2)
\end{equation}
\]</span> to get the rest. Thus the sequence begins: <span class="math">\(0, 1, 1, 2, 3, 5, 8, 13, 21, 34,\)</span> ...</p>
<p>Leonardo of Pisa, known as Fibonacci, introduced the Fibonacci sequence to European mathematics in his 1202 book <a href="http://en.wikipedia.org/wiki/Liber_Abaci">Liber Abaci</a>. It is thought to have arisen even earlier in Indian mathematics.</p>
<h3 id="appearance-in-nature">Appearance in Nature</h3>
<p>I have read many claims of fibonacci numbers appearing as spirals in galaxies and in plant life as <a href="http://en.wikipedia.org/wiki/Phyllotaxis">phyllotaxis</a> of leaves, because spiral structures allow organisms to grow without changing shape and optimizes the consumption of water and sun light. Also the pyramids, ancient greek architecture is said to utilize the golden ratio. The golden ratio was used widely in the Renaissance in paintings. I will describe the math with some programming in the following.</p>
<p>You can look all these mystical subjects up yourself, if you wish to study this further. <img src="http://jwilson.coe.uga.edu/emat6680/parveen/Fibona50.jpg" /> the image is from John Wilsons page at <a href="http://jwilson.coe.uga.edu/emat6680/parveen/fib_nature.htm">University of Georgia</a>.</p>
<h2 id="how-du-you-calculate-the-numbers">How du you calculate the numbers?</h2>
<p>Because of all these claims which I have read, I thought it would be interesting to know a bit more about the mathematical nature of the called golden ratio and the fibonacci numbers and spiral. Therefore, it would be an interesting way for me to learn some more coding in Python. There are mainly the recursive way of calculating the sequence and then two non recursive ways of calcuating for example fibonacci number one hundred.</p>
<p>For example to calculate the first <span class="math">\(25\)</span> numbers.</p>
</div>
<div class="cell border-box-sizing code_cell vbox">
<div class="input hbox">
<div class="prompt input_prompt">
In [1]:
</div>
<div class="input_area box-flex1">
<div class="highlight-ipynb"><pre class="ipynb"><span class="c"># A recursive method</span>
<span class="n">n</span><span class="o">=</span><span class="mi">25</span><span class="p">;</span>
<span class="k">def</span> <span class="nf">fib</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
<span class="k">if</span> <span class="n">n</span> <span class="o"><</span> <span class="mi">2</span><span class="p">:</span>
<span class="k">return</span> <span class="n">n</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="n">fib</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="n">fib</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">2</span><span class="p">)</span>
<span class="k">print</span> <span class="p">[</span><span class="n">fib</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)]</span>
</pre></div>
</div>
</div>
<div class="vbox output_wrapper">
<div class="output vbox">
<div class="hbox output_area"><div class="prompt"></div>
<div class="box-flex1 output_subarea output_stream output_stdout">
<pre>
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025]
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="text_cell_render border-box-sizing rendered_html">
<h2 id="the-golden-ratio">The golden ratio</h2>
<p>However, if I wanted the 100th term of this sequence and had no computer, it would take lots of intermediate calculations with the recursive formula to get a result.</p>
<p>There is an exact formula for the n<span class="math">\(th\)</span> term. This formula is attributed to <a href="http://en.wikipedia.org/wiki/Jacques_Philippe_Marie_Binet">Binet</a> in 1843: <span class="math">\[
\begin{equation}
F(n) = \frac{\Phi^n - (-\Phi)^{-n}}{\sqrt{5}}
\end{equation}
\]</span> <span class="math">\(\Phi=\frac{1+\sqrt{5}}{2}\approx1.618\)</span> is called the <a href="http://mathworld.wolfram.com/GoldenRatio.html">golden ratio</a>. <img src="http://mathworld.wolfram.com/images/eps-gif/GoldenRatio_1401.gif" /></p>
<p>The higher up in the sequence, the closer two consecutive Fibonacci numbers of the sequence divided by each other will approach the golden ratio. That is <span class="math">\(\frac{F(n)}{F(n-1)}\approx\Phi\)</span></p>
</div>
<div class="cell border-box-sizing code_cell vbox">
<div class="input hbox">
<div class="prompt input_prompt">
In [2]:
</div>
<div class="input_area box-flex1">
<div class="highlight-ipynb"><pre class="ipynb"><span class="c"># Using Binet's formula</span>
<span class="n">n</span><span class="o">=</span><span class="mi">25</span>
<span class="k">def</span> <span class="nf">fib2</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
<span class="n">phi</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span> <span class="o">+</span> <span class="mi">5</span><span class="o">**</span><span class="mf">0.5</span><span class="p">)</span><span class="o">/</span><span class="mf">2.</span><span class="p">;</span> <span class="k">print</span> <span class="s">"phi = "</span><span class="p">,</span> <span class="n">phi</span>
<span class="k">return</span> <span class="p">(((</span><span class="n">phi</span><span class="o">**</span><span class="n">n</span> <span class="o">-</span> <span class="p">(</span><span class="mi">1</span><span class="o">-</span><span class="n">phi</span><span class="p">)</span><span class="o">**</span><span class="n">n</span><span class="p">)</span> <span class="o">/</span> <span class="mi">5</span><span class="o">**</span><span class="mf">0.5</span><span class="p">))</span>
<span class="k">print</span> <span class="s">"f(n) = </span><span class="si">%1.0f</span><span class="s">"</span> <span class="o">%</span><span class="k">fib2</span><span class="p">(</span><span class="n">n</span><span class="p">)</span>
</pre></div>
</div>
</div>
<div class="vbox output_wrapper">
<div class="output vbox">
<div class="hbox output_area"><div class="prompt"></div>
<div class="box-flex1 output_subarea output_stream output_stdout">
<pre>
phi = 1.61803398875
f(n) = 75025
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="text_cell_render border-box-sizing rendered_html">
<p>This can in fact also be implemented with matrix algebra in the following form: <span class="math">\[
\left[
\begin{array}{l}
F( n )\\F(n-1)
\end{array}
\right] = Ax =
\begin{equation}
\begin{bmatrix}
1 & 1 \\
1 & 0 \\
\end{bmatrix}
\left[
\begin{array}{l}
F(n-1)\\F(n-2)
\end{array}
\right]\\
\end{equation}
\]</span> or simply just this form will contain the desired number. <span class="math">\[
\begin{equation}
A^n =
\begin{bmatrix}
1 & 1 \\
1 & 0 \\
\end{bmatrix}^n
\end{equation}
\]</span> A actaully has the eigenvalues <span class="math">\(\lambda=\frac{1\pm\sqrt{5}}{2}\)</span>. More info on this <a href="http://www.the-idea-shop.com/article/218/the-linear-algebra-view-of-the-fibonacci-sequence">here</a>. Finally, I will demonstrate a python program which plots the fibonacci spiral.</p>
<h2 id="programming-a-plot-of-fibonacci-spiral-in-python">Programming a plot of Fibonacci spiral in Python</h2>
<p>A Fibonacci spiral approximates the golden spiral using quarter-circle arcs inscribed in squares with sides with size of Fibonacci-numbers. I have made an approximation of the golden spiral created by drawing circular arcs connecting the opposite corners of squares in the Fibonacci tiling; this one uses squares of sizes 1, 1, 2, 3, 5, 8, 13, 21, 34 and 55 as plotted in the labels.</p>
</div>
<div class="cell border-box-sizing code_cell vbox">
<div class="input hbox">
<div class="prompt input_prompt">
In [3]:
</div>
<div class="input_area box-flex1">
<div class="highlight-ipynb"><pre class="ipynb"><span class="sd">"""</span>
<span class="sd">Fibonacci squares and spirals by the use of artist, by Jacob Møller</span>
<span class="sd">http://matplotlib.org/examples/shapes_and_collections/artist_reference.html</span>
<span class="sd">"""</span>
<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="kn">as</span> <span class="nn">plt</span><span class="p">;</span> <span class="n">plt</span><span class="o">.</span><span class="n">rcdefaults</span><span class="p">()</span>
<span class="kn">import</span> <span class="nn">numpy</span> <span class="kn">as</span> <span class="nn">np</span>
<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="kn">as</span> <span class="nn">plt</span>
<span class="kn">import</span> <span class="nn">matplotlib.path</span> <span class="kn">as</span> <span class="nn">mpath</span>
<span class="kn">import</span> <span class="nn">matplotlib.lines</span> <span class="kn">as</span> <span class="nn">mlines</span>
<span class="kn">import</span> <span class="nn">matplotlib.patches</span> <span class="kn">as</span> <span class="nn">mpatches</span>
<span class="kn">from</span> <span class="nn">matplotlib.collections</span> <span class="kn">import</span> <span class="n">PatchCollection</span>
<span class="k">def</span> <span class="nf">fib</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
<span class="k">if</span> <span class="n">n</span> <span class="o"><</span> <span class="mi">2</span><span class="p">:</span>
<span class="k">return</span> <span class="n">n</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="n">fib</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="n">fib</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">2</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">label</span><span class="p">(</span><span class="n">xy</span><span class="p">,</span> <span class="n">text</span><span class="p">,</span> <span class="n">j</span><span class="p">):</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">xy</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="mf">0.025</span> <span class="c"># shift y-value to center label</span>
<span class="n">plt</span><span class="o">.</span><span class="n">text</span><span class="p">(</span><span class="n">xy</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">y</span><span class="p">,</span> <span class="n">text</span><span class="p">,</span> <span class="n">ha</span><span class="o">=</span><span class="s">"center"</span><span class="p">,</span> <span class="n">family</span><span class="o">=</span><span class="s">'sans-serif'</span><span class="p">,</span> <span class="n">size</span><span class="o">=</span><span class="n">j</span><span class="p">)</span>
<span class="n">fig</span><span class="p">,</span> <span class="n">ax</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplots</span><span class="p">();</span> <span class="n">patches</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">xy</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">]);</span> <span class="n">c</span> <span class="o">=</span> <span class="n">xy</span><span class="p">;</span> <span class="n">i</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span> <span class="n">t</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="mi">270</span><span class="p">,</span> <span class="mi">0</span><span class="p">])</span>
<span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">7</span><span class="o">+</span><span class="mi">4</span><span class="p">):</span>
<span class="n">t</span> <span class="o">+=</span> <span class="mi">90</span><span class="p">;</span>
<span class="k">if</span> <span class="n">i</span> <span class="o">==</span> <span class="mi">5</span><span class="p">:</span> <span class="n">i</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span>
<span class="k">if</span> <span class="n">i</span><span class="o">==</span><span class="mi">1</span><span class="p">:</span>
<span class="n">xy</span> <span class="o">=</span> <span class="n">xy</span> <span class="o">+</span> <span class="p">[</span> <span class="o">-</span><span class="n">fib</span><span class="p">(</span><span class="n">j</span><span class="o">-</span><span class="mi">2</span><span class="p">)</span> <span class="p">,</span> <span class="n">fib</span><span class="p">(</span><span class="n">j</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="p">];</span> <span class="n">c</span> <span class="o">=</span> <span class="n">c</span> <span class="o">+</span> <span class="p">[</span> <span class="o">-</span><span class="n">fib</span><span class="p">(</span><span class="n">j</span><span class="o">-</span><span class="mi">2</span><span class="p">),</span> <span class="mi">0</span> <span class="p">];</span>
<span class="k">if</span> <span class="n">i</span><span class="o">==</span><span class="mi">2</span><span class="p">:</span>
<span class="n">xy</span> <span class="o">=</span> <span class="n">xy</span> <span class="o">+</span> <span class="p">[</span> <span class="o">-</span><span class="n">fib</span><span class="p">(</span><span class="n">j</span><span class="p">)</span> <span class="p">,</span> <span class="o">-</span><span class="n">fib</span><span class="p">(</span><span class="n">j</span><span class="o">-</span><span class="mi">2</span><span class="p">)];</span> <span class="n">c</span> <span class="o">=</span> <span class="n">c</span> <span class="o">+</span> <span class="p">[</span><span class="mi">0</span> <span class="p">,</span> <span class="o">-</span><span class="n">fib</span><span class="p">(</span><span class="n">j</span><span class="o">-</span><span class="mi">2</span><span class="p">)</span> <span class="p">];</span>
<span class="k">elif</span> <span class="n">i</span><span class="o">==</span><span class="mi">3</span><span class="p">:</span>
<span class="n">xy</span> <span class="o">=</span> <span class="n">xy</span> <span class="o">+</span> <span class="p">[</span> <span class="mi">0</span> <span class="p">,</span> <span class="o">-</span><span class="n">fib</span><span class="p">(</span><span class="n">j</span><span class="p">)</span> <span class="p">];</span> <span class="n">c</span> <span class="o">=</span> <span class="n">c</span> <span class="o">+</span> <span class="p">[</span> <span class="n">fib</span><span class="p">(</span><span class="n">j</span><span class="o">-</span><span class="mi">2</span><span class="p">)</span> <span class="p">,</span> <span class="mi">0</span> <span class="p">];</span>
<span class="k">elif</span> <span class="n">i</span><span class="o">==</span><span class="mi">4</span><span class="p">:</span>
<span class="n">xy</span> <span class="o">=</span> <span class="n">xy</span> <span class="o">+</span> <span class="p">[</span> <span class="n">fib</span><span class="p">(</span><span class="n">j</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="p">,</span> <span class="mi">0</span> <span class="p">];</span> <span class="n">c</span> <span class="o">=</span> <span class="n">c</span> <span class="o">+</span> <span class="p">[</span> <span class="mi">0</span> <span class="p">,</span> <span class="n">fib</span><span class="p">(</span><span class="n">j</span><span class="o">-</span><span class="mi">2</span><span class="p">)</span> <span class="p">];</span>
<span class="c"># Add a wedge</span>
<span class="n">rect</span> <span class="o">=</span> <span class="n">mpatches</span><span class="o">.</span><span class="n">Wedge</span><span class="p">([</span><span class="n">c</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span><span class="n">c</span><span class="p">[</span><span class="mi">1</span><span class="p">]],</span> <span class="n">fib</span><span class="p">(</span><span class="n">j</span><span class="p">),</span> <span class="n">t</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="p">,</span> <span class="n">t</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">,</span> <span class="n">ec</span><span class="o">=</span><span class="s">"none"</span><span class="p">)</span>
<span class="n">patches</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">rect</span><span class="p">)</span>
<span class="c"># Add a rectangle</span>
<span class="n">rect</span> <span class="o">=</span> <span class="n">mpatches</span><span class="o">.</span><span class="n">Rectangle</span><span class="p">([</span><span class="n">xy</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span><span class="n">xy</span><span class="p">[</span><span class="mi">1</span><span class="p">]],</span> <span class="n">fib</span><span class="p">(</span><span class="n">j</span><span class="p">),</span> <span class="n">fib</span><span class="p">(</span><span class="n">j</span><span class="p">),</span> <span class="n">ec</span><span class="o">=</span><span class="s">"none"</span><span class="p">);</span> <span class="n">patches</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">rect</span><span class="p">);</span> <span class="n">i</span><span class="o">+=</span><span class="mi">1</span><span class="p">;</span>
<span class="n">label</span><span class="p">(</span> <span class="n">xy</span><span class="o">+</span><span class="p">[</span><span class="mf">0.5</span><span class="o">*</span><span class="n">fib</span><span class="p">(</span><span class="n">j</span><span class="p">),</span> <span class="mf">0.5</span><span class="o">*</span><span class="n">fib</span><span class="p">(</span><span class="n">j</span><span class="p">)],</span> <span class="s">"</span><span class="si">%s</span><span class="s">"</span><span class="o">%</span><span class="k">fib</span><span class="p">(</span><span class="n">j</span><span class="p">),</span> <span class="n">j</span><span class="o">*</span><span class="mi">2</span><span class="p">)</span>
<span class="n">colors</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linspace</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="n">collection</span> <span class="o">=</span> <span class="n">PatchCollection</span><span class="p">(</span><span class="n">patches</span><span class="p">,</span> <span class="n">cmap</span><span class="o">=</span><span class="n">plt</span><span class="o">.</span><span class="n">cm</span><span class="o">.</span><span class="n">hsv</span><span class="p">,</span> <span class="n">alpha</span><span class="o">=</span><span class="mf">0.9</span><span class="p">);</span> <span class="n">collection</span><span class="o">.</span><span class="n">set_array</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">colors</span><span class="p">));</span> <span class="n">ax</span><span class="o">.</span><span class="n">add_collection</span><span class="p">(</span><span class="n">collection</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">axis</span><span class="p">(</span><span class="s">'equal'</span><span class="p">);</span> <span class="n">plt</span><span class="o">.</span><span class="n">axis</span><span class="p">(</span><span class="s">'off'</span><span class="p">);</span> <span class="n">plt</span><span class="o">.</span><span class="n">grid</span><span class="p">(</span><span class="s">'off'</span><span class="p">);</span><span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">();</span>
</pre></div>
</div>
</div>
<div class="vbox output_wrapper">
<div class="output vbox">
<div class="hbox output_area"><div class="prompt"></div>
<div class="box-flex1 output_subarea output_display_data">
<img src="data:image/png;base64,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
AACAcZRSAAAAGEcpBQAAgHGUUgAAABhHKQUAAIBxlFIAAAAYRykFAACAcZRSAAAAGEcpBQAAgHGU
UgAAABhHKQUAAIBxlFIAAAAYRykFAACAcZRSAAAAGEcpBQAAgHGUUgAAABhHKQUAAIBxlFIAAAAY
RykFAACAcZRSAAAAGEcpBQAAgHGUUgAAABhHKQUAAIBxlFIAAAAYRykFAACAcZRSAAAAGEcpBQAA
gHGUUgAAABhHKQUAAIBxlFIAAAAYRykFAACAcZRSAAAAGEcpBQAAgHGUUgAAABhHKQUAAIBxlFIA
AAAYRykFAACAcZRSAAAAGEcpBQAAgHGUUgAAABhHKQUAAIBxlFIAAAAYRykFAACAcZRSAAAAGEcp
BQAAgHGUUgAAABhHKQUAAIBxlFIAAAAYRykFAACAcZRSAAAAGEcpBQAAgHGUUgAAABhHKQUAAIBx
lFIAAAAYRykFAACAcZRSAAAAGEcpBQAAgHGUUgAAABhHKQUAAIBxlFIAAAAYRykFAACAcZRSAAAA
GEcpBQAAgHGUUgAAABhHKQUAAIBxlFIAAAAYRykFAACAcZRSAAAAGEcpBQAAgHGUUgAAABhHKQUA
AIBxlFIAAAAYRykFAACAcZRSAAAAGEcpBQAAgHGUUgAAABhHKQUAAIBxlFIAAAAYRykFAACAcZRS
AAAAGEcpBQAAgHGUUgAAABhHKQUAAIBxlFIAAAAYRykFAACAcZRSAAAAGEcpBQAAgHGUUgAAABhH
KQUAAIBxlFIAAAAYRykFAACAcZRSAAAAGEcpBQAAgHGUUgAAABj3fykTweqEM+/CAAAAAElFTkSu
QmCC
">
</div>
</div>
</div>
</div>
</div>
<div class="text_cell_render border-box-sizing rendered_html">
<p>Yes, That was it. Feel free to use the code for your amusement!</p>
<p>...</p>
</div>
<div class="text_cell_render border-box-sizing rendered_html">
<p><img src="http://4.bp.blogspot.com/-nhfIAb8jGkA/UE2bl4ggwRI/AAAAAAAAAQY/guldTVcY-wM/s1600/IMG_6354.jpg" /></p>
</div></p><script type= "text/javascript">
if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https:' == document.location.protocol
? 'https://c328740.ssl.cf1.rackcdn.com/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'
: 'http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML';
mathjaxscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'AMS' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: 'center'," +
" displayIndent: '0em'," +
" showMathMenu: true," +
" tex2jax: { " +
" inlineMath: [ ['$','$'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'black ! important'} }" +
" } " +
"}); ";
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>
A root less evil2014-08-11T23:04:00-03:00junilydtag:junilyd.github.io,2014-08-11:blog/2014/08/11/a-root-less-evil/<p>
<div class="text_cell_render border-box-sizing rendered_html">
<p>Since it sometimes is required to calculate the square root of some number. This job is straight forward by solving the 2nd order equation for the square root of 2 i.e. <span class="math">\[
\begin{equation}
x^2 − 2 = 0 \Rightarrow x = \sqrt{2} \approx 1.41
\end{equation}
\]</span></p>
<p>However, when we need to define how a computer is suppose to calculate the square root, we can use numerical methods. I finished my B.Sc.EE project this semester. The project theme was Embedded Signal Processing with the design and implementation of a GFSK-Demodulator for Satellite Communication, in a fixed point DSP. For the design it was necessary to calculate the Magnitude <span class="math">\[M\]</span> of a complex number <span class="math">\(I + jQ\)</span> which is defined as <span class="math">\(M = \sqrt{I^2 + Q^2}\)</span>. Therefore, I came across several interesting algorithms for approximation of the square root in fixed point arithmetic. I believe this is an obvious subject for my first blog post here, where I will demonstrate some of these in Python, starting with Newtons Method.</p>
<p>Newtons Method is an iterative approach, with an initial guess, <span class="math">\(s\)</span>, as seen here</p>
<p><span class="math">\[ s = \frac{1}{2}(s + x/s)\]</span></p>
<p>where <span class="math">\(x\)</span> is the number from which it is desired to calculate the square root.</p>
<p>As an example, if we want to calculate the square root of 25 we can make a loop like this.</p>
</div>
<div class="cell border-box-sizing code_cell vbox">
<div class="input hbox">
<div class="prompt input_prompt">
In [15]:
</div>
<div class="input_area box-flex1">
<div class="highlight-ipynb"><pre class="ipynb"><span class="n">x</span> <span class="o">=</span> <span class="mf">25.</span>
<span class="n">s</span> <span class="o">=</span> <span class="mf">1.</span>
<span class="n">kmax</span> <span class="o">=</span> <span class="mi">6</span>
<span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">kmax</span><span class="p">):</span>
<span class="n">s</span> <span class="o">=</span> <span class="mf">1.</span><span class="o">/</span><span class="mf">2.</span> <span class="o">*</span> <span class="p">(</span><span class="n">s</span> <span class="o">+</span> <span class="n">x</span><span class="o">/</span><span class="n">s</span><span class="p">)</span>
<span class="k">print</span> <span class="s">"After </span><span class="si">%s</span><span class="s"> iterations, s = </span><span class="si">%20.15f</span><span class="s">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">k</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span><span class="n">s</span><span class="p">)</span>
</pre></div>
</div>
</div>
<div class="vbox output_wrapper">
<div class="output vbox">
<div class="hbox output_area"><div class="prompt"></div>
<div class="box-flex1 output_subarea output_stream output_stdout">
<pre>
After 1 iterations, s = 13.000000000000000
After 2 iterations, s = 7.461538461538462
After 3 iterations, s = 5.406026962727994
After 4 iterations, s = 5.015247601944898
After 5 iterations, s = 5.000023178253949
After 6 iterations, s = 5.000000000053722
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="text_cell_render border-box-sizing rendered_html">
<p>Newtons Methods approaches the correct answer rather quick, compared to the initial guess being <span class="math">\(1\)</span>, which is relatively far from <span class="math">\(5\)</span>. An automatic guess could be the fraction i.e</p>
<p><span class="math">\[ s = \frac{x}{4}\]</span></p>
</div>
<div class="cell border-box-sizing code_cell vbox">
<div class="input hbox">
<div class="prompt input_prompt">
In [16]:
</div>
<div class="input_area box-flex1">
<div class="highlight-ipynb"><pre class="ipynb"><span class="n">x</span> <span class="o">=</span> <span class="mf">25.</span>
<span class="n">s</span> <span class="o">=</span> <span class="n">x</span><span class="o">/</span><span class="mf">4.</span>
<span class="n">kmax</span> <span class="o">=</span> <span class="mi">6</span>
<span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">kmax</span><span class="p">):</span>
<span class="n">s</span> <span class="o">=</span> <span class="mf">1.</span><span class="o">/</span><span class="mf">2.</span> <span class="o">*</span> <span class="p">(</span><span class="n">s</span> <span class="o">+</span> <span class="n">x</span><span class="o">/</span><span class="n">s</span><span class="p">)</span>
<span class="k">print</span> <span class="s">"After </span><span class="si">%s</span><span class="s"> iterations, s = </span><span class="si">%20.15f</span><span class="s">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">k</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span><span class="n">s</span><span class="p">)</span>
</pre></div>
</div>
</div>
<div class="vbox output_wrapper">
<div class="output vbox">
<div class="hbox output_area"><div class="prompt"></div>
<div class="box-flex1 output_subarea output_stream output_stdout">
<pre>
After 1 iterations, s = 5.125000000000000
After 2 iterations, s = 5.001524390243903
After 3 iterations, s = 5.000000232305737
After 4 iterations, s = 5.000000000000005
After 5 iterations, s = 5.000000000000000
After 6 iterations, s = 5.000000000000000
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="text_cell_render border-box-sizing rendered_html">
<p>Then the square root approximation algorithm has reached the correct <span class="math">\(5\)</span> already after 4 iterations, which is quite fair.</p>
<p>Another situation is when we have a fixed point machine for implementing such an algorithm. In such a situation we have to work primarily with numbers which is a power of <span class="math">\(2\)</span>. Any mulitplication or division with a power of two is normally done without mulitplying, since it can be done by a shifting the binary registers from inside the ALU.</p>
<p>When calculating the complex magnitude <span class="math">\(M = \sqrt{I^2 + Q^2}\)</span> as described above a similar procedure can be utilized. To approximate the square root operation, the Binary-Shift Magitude Estimation can be used to estimate <span class="math">\(M\)</span>.</p>
<p><span class="math">\[ M \approx A\text{M}_{ax} + B\text{M}_{in}\]</span><br />where <span class="math">\(A=\frac{15}{16}, B = \frac{15}{32}\)</span> which is similar sizes as used in Newtons Method</p>
</div>
<div class="cell border-box-sizing code_cell vbox">
<div class="input hbox">
<div class="prompt input_prompt">
In [17]:
</div>
<div class="input_area box-flex1">
<div class="highlight-ipynb"><pre class="ipynb"><span class="kn">import</span> <span class="nn">math</span>
<span class="n">I</span> <span class="o">=</span> <span class="mf">3.</span>
<span class="n">J</span> <span class="o">=</span> <span class="mf">11.</span>
<span class="n">A</span> <span class="o">=</span> <span class="mi">15</span><span class="o">/</span><span class="mf">16.</span>
<span class="n">B</span> <span class="o">=</span> <span class="mi">15</span><span class="o">/</span><span class="mf">32.</span>
<span class="k">if</span> <span class="n">I</span> <span class="o">></span> <span class="n">J</span><span class="p">:</span>
<span class="n">M</span> <span class="o">=</span> <span class="n">A</span><span class="o">*</span><span class="n">I</span> <span class="o">+</span> <span class="n">B</span><span class="o">*</span><span class="n">J</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">M</span> <span class="o">=</span> <span class="n">B</span><span class="o">*</span><span class="n">I</span> <span class="o">+</span> <span class="n">A</span><span class="o">*</span><span class="n">J</span>
<span class="k">print</span> <span class="s">"M = </span><span class="si">%10.5f</span><span class="s">"</span> <span class="o">%</span><span class="k">M</span>
<span class="n">M2</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">I</span><span class="o">**</span><span class="mi">2</span> <span class="o">+</span> <span class="n">J</span><span class="o">**</span><span class="mi">2</span><span class="p">)</span>
<span class="k">print</span> <span class="s">"M = </span><span class="si">%10.5f</span><span class="s">"</span> <span class="o">%</span><span class="k">M2</span>
</pre></div>
</div>
</div>
<div class="vbox output_wrapper">
<div class="output vbox">
<div class="hbox output_area"><div class="prompt"></div>
<div class="box-flex1 output_subarea output_stream output_stdout">
<pre>
M = 11.71875
M = 11.40175
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="text_cell_render border-box-sizing rendered_html">
<p>This algorithm’s appeal is that it requires no explicit multiples because the <span class="math">\(A\)</span> and <span class="math">\(B\)</span> values are binary fractions and the formula is implemented with simple binary right-shifts, additions, and subtractions. (For example, a 15/32 times <span class="math">\(I\)</span> multiply can be performed by first shifting <span class="math">\(I\)</span> right by four bits and subtracting that number from <span class="math">\(I\)</span> to obtain 15/16 times z. That result is then shifted right one bit). This is simulated in the following script.</p>
</div>
<div class="cell border-box-sizing code_cell vbox">
<div class="input hbox">
<div class="prompt input_prompt">
In [18]:
</div>
<div class="input_area box-flex1">
<div class="highlight-ipynb"><pre class="ipynb"><span class="n">I</span> <span class="o">=</span> <span class="mi">3</span>
<span class="n">J</span> <span class="o">=</span> <span class="mi">11</span>
<span class="n">J4</span><span class="o">=</span><span class="n">J</span><span class="o">>></span><span class="mi">4</span><span class="p">;</span> <span class="n">J5</span><span class="o">=</span><span class="n">J</span><span class="o">>></span><span class="mi">5</span><span class="p">;</span> <span class="n">I4</span><span class="o">=</span><span class="n">I</span><span class="o">>></span><span class="mi">4</span><span class="p">;</span> <span class="n">I5</span><span class="o">=</span><span class="n">I</span><span class="o">>></span><span class="mi">5</span><span class="p">;</span>
<span class="k">if</span> <span class="n">I</span> <span class="o">></span> <span class="n">J</span><span class="p">:</span>
<span class="n">M</span> <span class="o">=</span> <span class="p">(</span><span class="n">I</span><span class="o">-</span><span class="n">I4</span><span class="p">)</span> <span class="o">+</span> <span class="p">((</span><span class="n">J</span><span class="o">-</span><span class="n">J5</span><span class="p">)</span><span class="o">>></span><span class="mi">1</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">M</span> <span class="o">=</span> <span class="p">(</span><span class="n">J</span><span class="o">-</span><span class="n">J4</span><span class="p">)</span> <span class="o">+</span> <span class="p">((</span><span class="n">I</span><span class="o">-</span><span class="n">I5</span><span class="p">)</span><span class="o">>></span><span class="mi">1</span><span class="p">)</span>
<span class="k">print</span> <span class="s">"M = </span><span class="si">%10.5f</span><span class="s">"</span> <span class="o">%</span><span class="k">M</span>
<span class="c">## For comparison</span>
<span class="n">M2</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">I</span><span class="o">**</span><span class="mi">2</span> <span class="o">+</span> <span class="n">J</span><span class="o">**</span><span class="mi">2</span><span class="p">)</span>
<span class="k">print</span> <span class="s">"M2 = </span><span class="si">%10.5f</span><span class="s">"</span> <span class="o">%</span><span class="k">M2</span>
</pre></div>
</div>
</div>
<div class="vbox output_wrapper">
<div class="output vbox">
<div class="hbox output_area"><div class="prompt"></div>
<div class="box-flex1 output_subarea output_stream output_stdout">
<pre>
M = 12.00000
M2 = 11.40175
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="text_cell_render border-box-sizing rendered_html">
<p>Many combinations of <span class="math">\(A\)</span> and <span class="math">\(B\)</span> are provided in scientific litterature, yielding various accuracies for estimating <span class="math">\(M\)</span>. All these algorithms are open to modification and experimentation. This will make them more accurate and computationally expensive, or less accurate and computationally less demanding. Your accuracy and data throughput needs determine the path you take to a root of less evil.</p>
<p>Further reading about this subject can be suggested here:</p>
<p><a href="https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&cad=rja&uact=8&ved=0CCcQFjAB&url=https%3A%2F%2Fminds.wisconsin.edu%2Fbitstream%2Fhandle%2F1793%2F9200%2Ffile_1.pdf%3Fsequence%3D1&ei=X4zmU6P4E6iaygOeyoHIDQ&usg=AFQjCNFNnWHNdL0lFLmMT2FOB-fYjE71sg&sig2=8mcC-PpsDU0SYVcafYsDHg&bvm=bv.72676100,d.bGQ">A Root Less Evil - DSP tips & tricks</a></p>
<p>Lastly, a small piece of square root code is submitted.</p>
</div>
<div class="cell border-box-sizing code_cell vbox">
<div class="input hbox">
<div class="prompt input_prompt">
In [18]:
</div>
<div class="input_area box-flex1">
<div class="highlight-ipynb"><pre class="ipynb">
</pre></div>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell vbox">
<div class="input hbox">
<div class="prompt input_prompt">
In [18]:
</div>
<div class="input_area box-flex1">
<div class="highlight-ipynb"><pre class="ipynb">
</pre></div>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell vbox">
<div class="input hbox">
<div class="prompt input_prompt">
In []:
</div>
<div class="input_area box-flex1">
<div class="highlight-ipynb"><pre class="ipynb">
</pre></div>
</div>
</div>
</div></p>
<figure class='code'>
<figcaption><span>My Sqrt mysqrt.py</span> <a href='/downloads/code/mysqrt.py'>download</a></figcaption>
<div class="highlight"><pre><span class="sd">'''</span>
<span class="sd">Module for approximating the square root</span>
<span class="sd">Input</span>
<span class="sd"> x: The number for which the square root is approximated.</span>
<span class="sd">output</span>
<span class="sd"> s: The requested square root.</span>
<span class="sd">'''</span>
<span class="k">def</span> <span class="nf">newton</span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="n">debug</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span>
<span class="sd">'''newton(x)'''</span>
<span class="kn">from</span> <span class="nn">numpy</span> <span class="kn">import</span> <span class="n">nan</span>
<span class="n">x</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
<span class="k">if</span> <span class="n">x</span><span class="o">==</span><span class="mf">0.</span><span class="p">:</span>
<span class="k">return</span> <span class="mf">0.</span>
<span class="k">elif</span> <span class="n">x</span><span class="o"><</span><span class="mf">0.</span><span class="p">:</span>
<span class="k">print</span> <span class="s">'*** Error, x must be nonnegative'</span>
<span class="k">return</span> <span class="n">nan</span>
<span class="k">assert</span> <span class="n">x</span><span class="o">></span><span class="mf">0.</span> <span class="ow">and</span> <span class="nb">type</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="ow">is</span> <span class="nb">float</span><span class="p">,</span><span class="s">"Unrecognized input"</span>
<span class="n">s</span> <span class="o">=</span> <span class="n">x</span><span class="o">/</span><span class="mf">5.</span>
<span class="n">kmax</span> <span class="o">=</span> <span class="mi">100</span>
<span class="n">tol</span> <span class="o">=</span> <span class="mf">1.e-14</span>
<span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">kmax</span><span class="p">):</span>
<span class="k">if</span> <span class="n">debug</span><span class="p">:</span>
<span class="k">print</span> <span class="s">"Before iteration </span><span class="si">%s</span><span class="s">, s = </span><span class="si">%20.15f</span><span class="s">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">k</span><span class="p">,</span><span class="n">s</span><span class="p">)</span>
<span class="n">s0</span> <span class="o">=</span> <span class="n">s</span>
<span class="n">s</span> <span class="o">=</span> <span class="mf">1.</span><span class="o">/</span><span class="mf">2.</span> <span class="o">*</span> <span class="p">(</span><span class="n">s</span> <span class="o">+</span> <span class="n">x</span><span class="o">/</span><span class="n">s</span><span class="p">)</span>
<span class="n">delta_s</span> <span class="o">=</span> <span class="n">s</span> <span class="o">-</span> <span class="n">s0</span>
<span class="k">if</span> <span class="nb">abs</span><span class="p">(</span><span class="n">delta_s</span> <span class="o">/</span> <span class="n">x</span><span class="p">)</span> <span class="o"><</span> <span class="n">tol</span><span class="p">:</span>
<span class="k">break</span>
<span class="k">if</span> <span class="n">debug</span><span class="p">:</span>
<span class="k">print</span> <span class="s">"After </span><span class="si">%s</span><span class="s"> iterations, s = </span><span class="si">%20.15f</span><span class="s">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">k</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span><span class="n">s</span><span class="p">)</span>
<span class="k">return</span> <span class="n">s</span>
<span class="k">def</span> <span class="nf">test</span><span class="p">():</span>
<span class="kn">from</span> <span class="nn">numpy</span> <span class="kn">import</span> <span class="n">sqrt</span>
<span class="kn">import</span> <span class="nn">mysqrt</span>
<span class="n">xvalues</span> <span class="o">=</span><span class="p">[</span><span class="mf">0.</span><span class="p">,</span> <span class="mf">2.</span><span class="p">,</span> <span class="mf">100.</span><span class="p">,</span> <span class="mi">10000</span><span class="p">,</span> <span class="mf">1.e-4</span><span class="p">]</span>
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">xvalues</span><span class="p">:</span>
<span class="k">print</span> <span class="s">'Testing with x = </span><span class="si">%20.15e</span><span class="s">'</span> <span class="o">%</span> <span class="n">x</span>
<span class="n">s</span> <span class="o">=</span> <span class="n">mysqrt</span><span class="o">.</span><span class="n">newton</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
<span class="n">s_numpy</span> <span class="o">=</span> <span class="n">sqrt</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
<span class="k">print</span> <span class="s">'s = </span><span class="si">%20.15e</span><span class="s">, numpy.sqrt = </span><span class="si">%20.15e</span><span class="s">'</span> \
<span class="o">%</span> <span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">s_numpy</span><span class="p">)</span>
<span class="k">assert</span> <span class="nb">abs</span><span class="p">(</span><span class="n">s</span><span class="o">-</span><span class="n">s_numpy</span><span class="p">)</span> <span class="o"><</span> <span class="mf">1.e-14</span><span class="p">,</span> \
<span class="s">'Disagree for x = </span><span class="si">%20.15e</span><span class="s">'</span> <span class="o">%</span> <span class="n">x</span>
</pre></div>
</figure><script type= "text/javascript">
if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https:' == document.location.protocol
? 'https://c328740.ssl.cf1.rackcdn.com/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'
: 'http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML';
mathjaxscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'AMS' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: 'center'," +
" displayIndent: '0em'," +
" showMathMenu: true," +
" tex2jax: { " +
" inlineMath: [ ['$','$'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'black ! important'} }" +
" } " +
"}); ";
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>
Plotting Polynomial InterPolation2014-08-09T21:28:00-03:00junilydtag:junilyd.github.io,2014-08-09:blog/2014/08/09/plotting-polynomial-interpolation/<p>
<div class="text_cell_render border-box-sizing rendered_html">
<p>This post is a note where I gain some experience with Python matplotlib and linear equations with NumPy. This post is initialized with a specific solution for only the quadratic polynomial. At the end of this post there is a program which generalizes the order of the polynomial solution and therefore the number of points which it is required to fit. ####Polynomial interpolation. Suppose we want to determine the quadratic polynomial <span class="math">\(p(x) = c_0 + c_1x + c_2x^2\)</span> that passes through three given data points <span class="math">\((x_i,y_i)\)</span> for <span class="math">\(i = 1,2,3\)</span>.</p>
<p>Requiring that <span class="math">\(p(x) = y_i\)</span> for these three values gives a linear system of 3 equations in 3 unknowns (the coefficient <span class="math">\(c_i\)</span>).</p>
<p>For example, if the data points are <span class="math">\((x_i,y_i) = (-1, 1), (0, -1), (2, 7)\)</span> then the system of equations is</p>
<p><span class="math">\[\begin{align}
c_0 - c_1 + c_2 & = 1 \\
c_0 + 0c_1 + 0c_2 & = 0 \\
c_0 + 2c_1 + 4c_2 & = 7 \\
\end{align}\]</span></p>
<p>This has the form <span class="math">\(Ac = y\)</span> where <span class="math">\(y\)</span> is the vector of coefficients we seek, and <span class="math">\(A\)</span> is the <span class="math">\(3 x 3\)</span> matrix</p>
<p><span class="math">\[\begin{equation}
A =
\begin{bmatrix}
1 & -1 & 1 \\
1 & 0 & 0 \\
1 & 2 & 4
\end{bmatrix}
\end{equation}\]</span></p>
<p>To solve this system we can use the <span class="math">\(solve\)</span> function from the <span class="math">\(numpy.linalg\)</span> module. The solution is <span class="math">\(c = [-1, 0, 2]^T\)</span> corresponding to the polynomial <span class="math">\(p(x) = 2x^2 - 1\)</span>, as easily verified. I will now demonstrate how to create a script for this in Python.</p>
<h3 id="solving-the-equations-in-python">Solving the Equations in Python</h3>
</div>
<div class="cell border-box-sizing code_cell vbox">
<div class="input hbox">
<div class="prompt input_prompt">
In [94]:
</div>
<div class="input_area box-flex1">
<div class="highlight-ipynb"><pre class="ipynb"><span class="sd">"""</span>
<span class="sd">Script for quadratic interpolation.</span>
<span class="sd">"""</span>
<span class="kn">import</span> <span class="nn">numpy</span> <span class="kn">as</span> <span class="nn">np</span>
<span class="kn">from</span> <span class="nn">numpy.linalg</span> <span class="kn">import</span> <span class="n">solve</span>
<span class="c"># Data points:</span>
<span class="n">xi</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="o">-</span><span class="mf">1.</span><span class="p">,</span> <span class="mf">0.</span><span class="p">,</span> <span class="mi">2</span><span class="p">])</span>
<span class="n">yi</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="mf">1.</span><span class="p">,</span> <span class="o">-</span><span class="mf">1.</span><span class="p">,</span> <span class="mf">7.</span><span class="p">])</span>
<span class="n">A</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([[</span><span class="n">xi</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">**</span><span class="mi">0</span><span class="p">,</span> <span class="n">xi</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">**</span><span class="mi">1</span><span class="p">,</span> <span class="n">xi</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">**</span><span class="mi">2</span><span class="p">],</span>
<span class="p">[</span><span class="n">xi</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">**</span><span class="mi">0</span><span class="p">,</span> <span class="n">xi</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">**</span><span class="mi">1</span><span class="p">,</span> <span class="n">xi</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">**</span><span class="mi">2</span><span class="p">],</span>
<span class="p">[</span><span class="n">xi</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">**</span><span class="mi">0</span><span class="p">,</span> <span class="n">xi</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">**</span><span class="mi">1</span><span class="p">,</span> <span class="n">xi</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">**</span><span class="mi">2</span><span class="p">]]);</span>
<span class="k">print</span> <span class="s">"A = </span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">A</span>
<span class="n">b</span> <span class="o">=</span> <span class="n">yi</span><span class="p">;</span>
<span class="n">c</span> <span class="o">=</span> <span class="n">solve</span><span class="p">(</span><span class="n">A</span><span class="p">,</span><span class="n">b</span><span class="p">);</span>
<span class="k">print</span> <span class="s">"</span><span class="se">\n</span><span class="s">The polynomial coefficients are:"</span><span class="p">;</span> <span class="k">print</span> <span class="s">"c ="</span><span class="p">,</span> <span class="n">c</span>
</pre></div>
</div>
</div>
<div class="vbox output_wrapper">
<div class="output vbox">
<div class="hbox output_area"><div class="prompt"></div>
<div class="box-flex1 output_subarea output_stream output_stdout">
<pre>
A =
[[ 1. -1. 1.]
[ 1. 0. 0.]
[ 1. 2. 4.]]
The polynomial coefficients are:
c = [-1. 0. 2.]
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="text_cell_render border-box-sizing rendered_html">
<h3 id="a-function-for-plotting-the-solution">A Function for Plotting the Solution</h3>
</div>
<div class="cell border-box-sizing code_cell vbox">
<div class="input hbox">
<div class="prompt input_prompt">
In [95]:
</div>
<div class="input_area box-flex1">
<div class="highlight-ipynb"><pre class="ipynb"><span class="k">def</span> <span class="nf">plot_quad</span><span class="p">(</span><span class="n">xi</span><span class="p">,</span><span class="n">yi</span><span class="p">,</span><span class="n">c</span><span class="p">):</span>
<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="kn">as</span> <span class="nn">plt</span>
<span class="n">clf</span><span class="p">()</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linspace</span><span class="p">(</span><span class="o">-</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">1001</span><span class="p">)</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">c</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="n">c</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="n">x</span> <span class="o">+</span> <span class="n">c</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">*</span><span class="n">x</span><span class="o">**</span><span class="mi">2</span>
<span class="n">fig</span><span class="p">,</span> <span class="n">ax</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplots</span><span class="p">()</span>
<span class="n">ax</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="s">'b'</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s">'Interpolating Polynomial'</span><span class="p">)</span>
<span class="n">ax</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">xi</span><span class="p">,</span> <span class="n">yi</span><span class="p">,</span> <span class="s">'ro'</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s">'Data Points'</span><span class="p">)</span>
<span class="n">legend</span> <span class="o">=</span> <span class="n">ax</span><span class="o">.</span><span class="n">legend</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="s">'upper center'</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s">"Data points and interpolating polynomial"</span><span class="p">,</span> <span class="n">fontsize</span> <span class="o">=</span> <span class="s">'14'</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">grid</span><span class="p">()</span>
<span class="n">plt</span><span class="o">.</span><span class="n">ylim</span><span class="p">(</span><span class="nb">min</span><span class="p">(</span><span class="n">yi</span><span class="p">)</span><span class="o">-</span><span class="mi">50</span><span class="p">,</span> <span class="nb">max</span><span class="p">(</span><span class="n">yi</span><span class="p">)</span><span class="o">+</span><span class="mi">50</span><span class="p">)</span>
<span class="c"># Set the fontsize</span>
<span class="k">for</span> <span class="n">label</span> <span class="ow">in</span> <span class="n">legend</span><span class="o">.</span><span class="n">get_texts</span><span class="p">():</span>
<span class="n">label</span><span class="o">.</span><span class="n">set_fontsize</span><span class="p">(</span><span class="s">'large'</span><span class="p">)</span>
<span class="k">for</span> <span class="n">label</span> <span class="ow">in</span> <span class="n">legend</span><span class="o">.</span><span class="n">get_lines</span><span class="p">():</span>
<span class="n">label</span><span class="o">.</span><span class="n">set_linewidth</span><span class="p">(</span><span class="mf">1.5</span><span class="p">)</span>
<span class="n">ax</span><span class="o">.</span><span class="n">set_xticklabels</span><span class="p">(</span><span class="n">ax</span><span class="o">.</span><span class="n">get_xticks</span><span class="p">(),</span> <span class="n">fontsize</span><span class="o">=</span><span class="s">'16'</span><span class="p">)</span>
<span class="n">ax</span><span class="o">.</span><span class="n">set_yticklabels</span><span class="p">(</span><span class="n">ax</span><span class="o">.</span><span class="n">get_yticks</span><span class="p">(),</span> <span class="n">fontsize</span><span class="o">=</span><span class="s">'16'</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
<span class="n">plot_quad</span><span class="p">(</span><span class="n">xi</span><span class="p">,</span><span class="n">yi</span><span class="p">,</span><span class="n">c</span><span class="p">)</span>
</pre></div>
</div>
</div>
<div class="vbox output_wrapper">
<div class="output vbox">
<div class="hbox output_area"><div class="prompt"></div>
<div class="box-flex1 output_subarea output_display_data">
<pre>
<matplotlib.figure.Figure at 0x112588450>
</pre>
</div>
</div>
<div class="hbox output_area"><div class="prompt"></div>
<div class="box-flex1 output_subarea output_display_data">
<img src="data:image/png;base64,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
3XXXAfC73/2Ofv368eyzz1JcXMxTTz3FTz/9xFlnnUX//v1ZvXo1f/zjH7nuuutYtmxZ2fZefPFF
LrroIjZu3Ejfvn0B+Nvf/sbIkSMpKiri2GOPZdiwYQD8+OOPDBo0iOHDh/Pjjz9y++23M2jQILZu
3Rq2rffeey/r169n2rRpLFu2jIceegiAV155hU6dOjFx4kSKi4v57W9/G7b+c889x1133cWSJUvY
unUrY8aMAeCrr77i5ptv5vXXX2flypUUFhZSVFQU1RXa2rVrGTduHD179qSkpIQLLriAs88+m02b
NvH0008zZMgQVq5ceUC9a665hn/+859l8++//z7Z2dkcf/zxZWVvvfUWU6ZM4dVXX+X+++8v61b7
3e9+x5w5c1i0aBGLFi3ik08+4dFHHy2r98MPP/DVV1+xYMECrrjiCoYNG8bYsWN54403ePvtt3nk
kUfYt28fcOBV6KBBg1i1ahUrVqygc+fOZc+VSRyWUJJUMvQRN2/enPvuu49WrVpx0003sX79en74
4Yey5f4ujokTJ5KWlsaoUaPIyMhg0KBB9O/fv9xVSq9evRg6dCgNGzakcePGAPTs2ZO+ffty8MEH
M3z4cObMmcP333/PpEmTaNasGVdffTUNGjRg2LBhNGvW7IB39QC5ubmceeaZNGrUiOOOO45f//rX
zJw5M+r9FBEGDx7MmWeeSXZ2NhdffDFffPEFAO+88w4nnXQSvXv3plGjRtx6662UlJRE3JaqMmbM
GFq1akWvXr1o3LgxL7/8Mp988glr165lxIgRNGzYkDPOOIOePXvy+uuvHxDPYcOGMWnSJHbu3Am4
pOi/UgC466676NixIwMGDOCII45g0aJFALz66qvccMMNZGVlkZWVxfXXX88rr7xSVq+0tJQHH3yQ
zMxMrr32WjZu3Eh+fj65ubmcccYZdOjQgY8//rhcewLy8/Np3rw57dq144EHHmDRokUUFxdHHWe/
ZHh9JCL7pLwp8+c/13ULyuvevTsNGrj3PO3btwdg586dHHLIIUD5d7Dffvsta9asoVWrVmVl+/fv
Jzs7u2zdXr16ldu+iJR71921a1eaN29OUVERRUVFnHDCCeXWP+mkk1i3bt0B7dy4cSO33347H330
EcXFxZSWltK6desq7WuPHj3K/m/Xrl3ZybyoqKjcsi5dutCyZcuI2xER7rzzTkaPHl2ufN68eWX7
59+foqKiA7bRoUMH+vTpwzvvvMPgwYOZPHkyTz/9dMT2tm/fvqy969ev58QTTyxbduKJJ5Z7jPbt
25OZmQlA27ZtAco9B23btg0b4/3793PvvffyzjvvsGnTprLjYvPmzaSnp0eMh6lddoWSpJK9j1hE
yg2sd+rUidzcXLZu3Vo27dixg2effbZsnYMOOqjcNlS17EoAYMWKFfz0009kZ2fToUMHPv/883Lr
L1iwoCxB+d1zzz1s376dJUuWsH37dp588slybavJoHyHDh3KtXH16tVl4zORhHusDh06sHLlSn76
6aeysvnz54fdHwh2e7399tv07t27LKFH094FCxaUzUeKWVW99tprjBs3jg8//JDt27eXdYdWN67J
/vqoK5ZQTL3Utm1bFi5cWHZCOf/889m5cydjxoxhw4YN7Nu3j/nz57N8+XIg8oln4cKFzJkzh717
9/LMM8/Qp08fsrOzOe+88/j555955ZVXKCkp4bXXXmPXrl2cf/75B2wjLS2NjIwMGjVqxLx583jm
mWcOaOtnn31W4f5Eat8ll1zCggULeP3111m/fj2jR4+mYcPIHQuRtnPqqafSsWNHxo4dy759+ygo
KGDhwoVcfvnlYetddNFFfP755zz11FNcffXVFbbdb+jQobz00kts3ryZzZs389JLL3HllVdGXT+S
tLQ0mjdvTrNmzSgsLOSBBx4ot9zu8EoMllCSVH3vIw53C7F//vbbb2fq1KlkZGQwYsQI0tLSmDp1
KgUFBRx77LG0b9+eUaNGld1hFGl7N9xwA3/84x9p3749ixcvLhuMzszMZOLEiYwdO5asrCyefPJJ
Jk6cGLYra+TIkfz888907tyZO+64g1tuuaXcY40aNYpnn32Wli1b8qc//emAfQmd97e1e/fuPP/8
89x999384he/oGfPnmRkZJSNAUUTN4BGjRoxYcIEpkyZQps2bbj11lt5/fXX6dq1a9h6TZo04eKL
L6awsJCLL744YltD3XfffZx66qkcd9xxHHfccfTq1Yv77rsvYt2KtuVv04UXXkj//v3p0aMHF1xw
AUOGDIkYs2jU99dHorIvh0wx9mV5Qddeey2HHnoojzzySF03JWpLly7l2GOPZc2aNXTu3DmujzV6
9GhWrVrFuHHj4vo48WTHe+XsyyFNpayPuHL15UQzYcIEdu3axcqVK3nwwQc54YQT4p5MtmzZwvPP
P8+NN94Y18epK/b6iA9LKCZlJeLXjYQzfvx4srOzOfnkk9m+fTtvvPFGXB/vxRdf5Mgjj2TYsGFl
n9cxJhrW5ZVirAvApBI73itnXV7GGGMSjiWUJGV9xMZEZq+P+LCEYowxJiZillBEZLKIlIrIIyHl
jUVkrIisEJENIvKuiHSqwnZ/IyILRGSriEwXkTNj1eZkZvfZGxOZvT7iIyYJRUSGAsd5s6EjYP8G
hgJPALcAHYA5ItI2iu2OAsYC471tFAGTRKR/LNptjDEmdmqcUESkFfAnYGSYZf2AAcDVqvqSqr4L
nAe0AG6uZLvNgbuBMao6WlUnA1cB8wH7rc9KWB9x7UpPT6ewsLCum2GiZK+P+IjFFcoTwGJVfTPM
smHAD14yAEBVfwT+A1T2BT8XAOlA2Xdfe/cEvwqcLiIdatpwk1hycnJo1qwZLVu2JCcnh/79+/PO
O+9EXT/0h6uqo0GDBqSlpZGWlsahhx7KHXfcEdX2iouLycnJifoxVq9eXe02GpOoavT19SLSF3fV
cFyEVboA4X5WbSlwcZjy0Lqlqro0TF2Aw3BdYCaMqvYRz5o0iSlPPUXDPXsoadyYAbfdxmmDBtXq
NkSEiRMn0r9/f4qLiykoKOD222/n008/LfvBqWjU9HMHX375JV26dOHjjz9mwIABdO3alZtuuqlG
2wxln42oWzaGEieqWq0JOBh3ch/tKysNmV8MvB2m7i3eum0q2P7TwOYw5Ud7dS8Ns0xNxcLFaObE
iXpPbq4qlE335ObqzIkTo95uLLaRk5Oj06ZNK1c2b948bdiwoX799deqqjpx4kTt0aOHpqena8eO
HfWhhx4qW7djx44qIpqWlqZpaWn66aef6qpVq/SMM87QzMxMzcrK0mHDhum2bdsitkFE9Jtvvimb
HzhwoA4fPlxVVf/617/q4Ycfrq1bt9b/+q//0qKiorD1rrnmGh05cqQOGTJEW7Vqpb169Spb1q9f
PxURbd68uaalpelbb72lu3bt0uuuu047d+6srVu31n79+mlpaWnUcTOR2Tmhcl6Mqp0L/FNNEsp9
wCqgsa8sNKF8aQmlbsyYMSNsebgY3TtgQLlEEJjuGzgw6seLxTbCJRRV1U6dOukbb7yhqqoFBQW6
ZMkSLSkp0cmTJ2t6erq+9957qqpaWFioIqL79+8vq7tq1SqdOnWq7t27VxctWqQ9e/bUESNGRGyD
iOiqVat0//79Onv2bG3WrJm+9NJLOm3aNM3IyNCFCxfqnj179JZbbtHTTjutXD1/QmnRooW+++67
umnTJj3//PP18ssvD7uuquozzzyjV1xxhW7fvl1LSkr0o48+ijpmpmKRzgmRXh+pKJYJpVpdXt5t
v/cC1wFNRaSpb3ETEWkJ7ATWA1lhNpEJlKjqpgoeZj2QEaEuROjuys/PL+vLzsjIoEePHmWXt4GB
uFSfD9Vwz56w5Qft3h22PF7biKRDhw589913AJx++ull5QMHDuTCCy9k5syZXHjhhWG7kXJzc8nN
zQUo+3ne5557rsLH69mzJw0aNCAzM5M77riD/Px8rr/+es4999yyXyocOXIkXbt2Ze3atXTqdOBd
8KeffjoXXXQR4H5S9+GHH474eKWlpWzevJl169Zx1FFH0adPn0oiYqojUV5/dT0f+D8uN5FUJwsB
ebirhIqm44EXgA1h6r8JrKzkMYZ62+keUv5rrzw7TJ3Ypu4kFC5GiX6F0rFjx7IrlE8//VTz8vK0
TZs22rJlS23SpIleffXVqqq6Zs2aA65QNmzYoEOGDNHs7Gxt0aKFpqWlaadOnSK2IfTqIeDcc8/V
MWPGlCtr2bKlfvzxxwfUy8/P1/vvv79svRkzZuihhx4a8TF++uknfeyxxzQ3N1e7dOmif/jDHyIH
yVSJnRMqRwyvUKp7l9dCL6n4pzO8Za9486twd2QdIiIDAxVFpDVwrresIuOBYnx3g4n7atihwExV
PfCHp021DLjtNu713sUH3JOby9nDh9fqNsKZP38+69evp2fPngBcccUVnHbaaXz//fds27aNSy65
pOzKJPDNwYF5qPzneaMV+tO2X3/9NTt27Ij487b+NlS2vFmzZowaNYpVq1Yxfvx4Hn30UZYuDb0X
xZjEV60uL1XdDswKLfde0N+qamDZbBGZCozzPqS4DbgL2AH8JaRuCfCyql7vPcZPIvIH4GER2QV8
hksmpwBVu/0oBRUUFER9J0vgTqz7n36ag3bvZn+TJpwzfHiV7tCKxTYgeKLdsWMHs2bNYsSIEQwf
PpwjjjgCcD8F27p1a/bv38/48eMZP348gwcPBqBNmzY0aNCABQsW0KtXr7L1K/p53mgNHTqUSy+9
lEWLFtGtWzfGjh1L3759w3Z3VZZM2rZty4IFC8q64iZNmsSRRx5Jly5dEBEaNGjA5s2bq9VOE52q
vD5MFcTqUsd7EZUblPfKDgaeAr4GNgLvAp0i1H0pTPmtwAJcMpoBnFnB49f06i9pVGVQPlHk5ORo
06ZNtUWLFtqxY0fNy8vTN998s9w6H374ofbu3VuzsrL08ssv1zvvvFOvuuqqsuUPPPCAZmZmaqtW
rXTu3Lm6Zs0avfDCCzUzM1P79u2rf/nLX7Rjx44R29CgQYOwXV6qqi+88ILm5uZq69at9YILLtB1
69aFrReuy8v/mC+88IK2bdtWW7ZsqW+99ZY++eSTmpOTo2lpadq7d2998sknqxY4E1Gk490G5YOI
YZeX/R5KirHfhzCpxI73ytnvoRhjjEk4llCSlH1XkTGR2esjPiyhGGOMiQkbQ0kx1qdsUokd75Wz
MRRjjDEJxxJKkrI+YmMis9dHfNTo6+tN/RT4RLkxxsSSjaEYY0wKszEUY4wxCccSSpKyPuIgi4Vj
cQiyWMSHJRRjjDExYWMoxhiTwmwMxRhjTMKxhJKkrI84yGLhWByCLBbxYQnFGGNMTNgYijHGpDAb
QzHGGJNwLKEkKesjDrJYOBaHIItFfFhCMcYYExM2hmKMMSnMxlCMMcYkHEsoScr6iIMsFo7FIchi
ER+WUIwxxsSEjaEYY0wKszEUY4wxCccSSpKyPuIgi4VjcQiyWMSHJRRjjDExYWMoxhiTwup8DEVE
fiki74nIWhHZJSLLReQxEUkLWa+xiIwVkRUiskFE3hWRTlV4nN+IyAIR2Soi00XkzOq01xhjTPxV
t8vrTq/uI8Bg4APgN8C7IuLPdP8GhgJPALcAHYA5ItK2sgcQkVHAWGC8t40iYJKI9K9mm1OK9REH
WSwci0OQxSI+Glaz3gWq+oNvfoqIbAUeAE4G5olIP2AAcJ6qTgYQkQJgDXAz8HCkjYtIc+BuYIyq
jvbKPgA6A/cD06vZbmOMMXESszEUETkJmAcMUdW3ReQFYLCqtgtZ7w3gRFU9ooJtXQ68Bhyrqkt9
5TcDzwGHqmpRmHo2hmKMMVVQ52MoEfTx/i7x/nYBvgqz3lLclUZFugCl/mTiqwtwWLVaaIwxJm5i
klBEpDOuC+tfqrrMK24PbAmz+hagoYi0qWCT7YFtEeqCG4sxFbA+4iCLhWNxCLJYxEeNE4qIpAP/
B+zEDcwHWN+TMcakkOoOygMgIk2BCUAOcLqqbvAtXg9khamWCZSo6qYKNr0eyIhQF9wdX2Hl5+eT
k5MDQEZGBj169CAvLw8IvitJhfm8vLyEao/N1/18oCxR2mOvj7qZD/xfWFhIrFV7UF5EGgHvAX2B
s1V1XsiXojLwAAAZ+0lEQVTySIPybwInqGrXCrY9FHiVAwflfw08C3RU1XVh6tmgvDHGVEGdD8qL
SAPgn0AeLmnMC7Paq8AhIjLQV681cK63rCLjgWLgSl9dwX0eZWa4ZGLK878bSXUWC8fiEGSxiI/q
dnk9A1wK/A74WURO9S37TlXXqepsEZkKjPM+pLgNuAvYAfzFvzERKQFeVtXrAVT1JxH5A/CwiOwC
PsMlk1OAQdVsszHGmDiqVpeXiKwBOgHhLpMe8n0Y8WBgDO6qpAUwBxihqmtDtleKSyi/Cim/FcgH
DgcWAo+q6rQK2mVdXsYYUwWx7PKyL4c0xpgUtXcvNG6cmB9sNAnE+oiDLBaOxSEolWOhCvPmwfDh
kJ0d221bQjHGmBTw9dfw0ENw5JEwbBhkZcHcubF9DOvyMsaYJLVhA7z5Jrz6KqxdC0OGuGRy8skQ
+F54G0OJwBKKMSbVFRfDv/7lksjcufBf/+WSyJlnQsMw9/XW+edQTOJL5T7iUBYLx+IQlGyx2LMH
JkyAyy+HQw+Ft9+Ga6+FoiIYNw4GDgyfTGKtFh7CGGNMrO3ZAx9+CG+9BRMnwjHHwNCh8Mwzbnyk
LliXlzHG1BN79waTyIQJ0L07XHYZXHIJdKjmd7DbGEoEllCMMclm716YOtUlkfHjXRK59FKXRGJx
26+NoZhKJVsfcU1YLByLQ1Cix+Lnn1031rXXQrt28NhjcMIJ8OWXMHs23HZb7D9DEgs2hmKMMQlg
61Z4/313h9aHH0KPHnDRRfDII26gvT6wLi9jjKkj69bBv//tksjcuZCX55LI+edDm4p+0zaGbAwl
AksoxphEt2wZvPeem1atgkGDYPBgGDAA0tJqvz02hmIqleh9xLXJYuFYHIJqMxaBQfWRI6FrV5c4
iorcuMiGDe5zIhdfXDfJJNZsDMUYY2KsqMiNh7z/PkyfDkcdBeedB2+84QbXJSbXA4nHuryMMaaG
9u+H+fNh0iQ3FRa6K5FBg+Ccc2pvPKQ6bAwlAksoxpjasmGDuxtryhT44AM45BCXQAYNgt69a+er
TmLBxlBMpay/PMhi4VgcgqoTi59/dsnjzjvh+ONdN9Z770GfPu73RZYsgSeegNNOqz/JJNZSdLeN
MaZiqrB4sUsiU6bAJ5+4RDJgALzwgvsK+FRNHJFYl5cxJmXMmjSJKU89RcM9eyhp3JgBt93GaYMG
AS6BrF4NBQUwY4a7Mys93SWQAQPcZ0RatqzT5seFjaFEYAnFGBPJrEmT+OD22/ndN9+Uld3VKZfG
F43l2x8HUVAAJSVwxhkueZx1Fhx2WJ01t9bYGEoFVq927zRSnfWXB1ksnFSPw5SnnipLJgVe2R/W
fsMXbz5N377uimTdOvfDVDfckBrJJNaSrgewb193j3e/fu7/fv3c7wQcdFBdt8wYU5tKS2HpUpgz
Bz76CDbP3BN2vROP3M2NN9Zy45JU0iWUdetgzRr3jZyzZ7sfm9m4EX7xC5dc+vWDk06CJk3quqXx
lZeXV9dNSBgWCyfZ47Brl7vbas4cN33yifuhqb59XRfWkjWN4WO3bp6v3v5kPxnUopQYQ/nhB/cO
5aOPXJJZtgyOPRZ69XLTqadCTk7yfnrVmGSj6t48zp0bTCBLlrjXdZ8+Lon07g1t2wbrhBtDuSc3
l3PGji0bmE9FNigfQbSD8jt3wmefuYPx00/dVFISTC69erlbAuvzHR0FBQVJ/440WhYLpz7HYft2
90n0efOCU0kJnHKKSxx9+rjXbLNmFW9n1qRJfPj003y3YQMd27Xj7OHDUzqZQGwTStJ1eUUjLQ1O
P91N4N7tfP+9SzBz58LDD8PChdC5s0suJ50EPXvCccdVfsAaY2pm715YtKh88vjuO/caPOUUuOIK
+POf3euzqr0Kpw0axGmDBtXr5JrIUvIKJRr79rkPNc2d665mPv8cli+H3Fx3YAemHj3cverGmKor
Lna/QrhwYXBavhyOOMIlj8DUvbt9iDBerMsrgnh/DmXPHnfXyOefB5PMkiXQsWMwwRx3nOvHbdfO
xmSM8fvhh/KJY+FCNw7Svbv7Bt7AdOyx1hNQm+pVQhGRDGAs7sYKwd0CfpuqbouirgAPApcAHYB5
wN2quijC+rX+wcZ9+9w7qkCSWbzYTeBeGP7pmGNq7zcP7JI+yGLh1FYcdu6Er75yb7aWLHFvwhYv
ht273RW9P3kceWTdXHnYMRFUb8ZQRKQxMBNoCozyih8EZovISaoa/sbwoBeAq4C7gdXAb4ACEemr
qkvj1OwqadQomDCuucaVqbpvIg0klzlz3Hf/LFvmrlwC6x99tHtBHXlkcvy4jkktu3e7N1P+xLFk
ibtN/6ij3Buo7t3dJ867d4dOneyqPdnF9QpFRK4C/gEcrarLvbKuwDLgV6r6jwrqdga+AW5V1Re8
ssbAUmC2ql4bpk5Cf/XK/v3uJz8DiWb5cjd9/TVkZkK3bi65dOsWnLKzq/YirOi7ioypqtJSd8PK
ypWwYkX5v0VFcPjhLnEEpu7doUsX+yBxfVJvurxEZDKQqaonh5R/ChSr6tkV1L0bGA20UdXtvvLH
gduAdFXdH1InoRNKJPv3w9q17oUaSDKB/4uLXZI54gj3Qs3NDf7Nzi7/wg13n/29ubkMTPH77E3F
SkvdFfXq1W5auTKYOFatgowM99O1Xbu6YzHwNyfHXaGb+q0+JZSVwEeq+quQ8r8Dp6vq4RXU/Stw
lqp2CSkPXPV0VNV1IcvqZUKpyPbtLrF8842bVq8O/r9li7t1MpBktk0dyD9XTAHcQFWet437Bw7k
kcmT62gP6p71l8O2bfDWWwVkZuaxZo37NonVq93fb791n7k67DB3HPmTxxFHJOddjHZMBNWbMRSg
HbAlTPkWoH0lddtXUBfcIP26MMuTSsuWwU/0h/r55+CJ4ZtvYN6/wg9JLZm7m+uuc33YHTu6KfC/
3U1T/+3Y4bqlIk3ffeeugtu0cWN3Xbq47tRzz3VJJCcHmjev670wySDR7+y2IbwKNG3qBvaPPtrN
3/d+Yyhy/+f51mub24QTT3XdarNmuRPM2rXuZNOkibtRIHRq3778fFYWNKhn303tH0+aWs/Gk/bt
g02b3AC3f/rhB/d3wwZ3y+3337suq44d4dBDg9OJJ8KFFwbnW7cGkby63q2EYVcn8RHvhLIeyAxT
nknZqa/CusdEqEuk+vn5+eTk5ACQkZFBjx49yg6ewNd3J+t8m7w8rlyyhH8WudAUAC926MBNDw/n
tEEHrj9jRgHFxXD44Xls2ADTpxfw44+wZUseS5fC0qVufufOPLZtg7S0Alq0gE6d8sjMhL17C0hP
hxNOcPPr17vlZ52VR0YGLFpUQNOm0L9/7cdj1qRJ/PXGG7m+qKgsuV65ZAkLb72V20eNqrX2qMJJ
J+Xx44/w4YcF7Njh4rd1K8yf7+Kfnu6Wr1pVwNatLt47dkB6egGtWkFubh6HHOLi3aqVi2+7dlBU
VECbNjBoUB4i4R9/61Y4/vjaj7/NJ+584P/CwkJira4G5ecC21V1QAV1RwEPA1mqusNX/gRwK9Ai
WQblYyle31W0bx9s3oyXcCqftm1zNxTs2uW61Vq0cFN6+oH/p6W5K6WmTd1f//+hfw8+2H1u4aCD
glO4+d9fMpDHpx04nvQ/ZwzkjjcmU1pKuamkxH1wNTDt3l1+3l++e7f7rEVxsfvr/z/c38aNoVUr
d5XQunXw/3Blbdu6KTMz9ndKFdi4QRmLRVB9GkN5FfiHiBypqiug7Lbhk4BfVVgTXgMeAYYCf/Hq
NsZ9yPGt0GRinHh9V1GjRq4brH1lI18h9u8Pnlh37HBT4P/A35073Ul682Y3LhQ4aQf+9//du9dt
s6TE/Q1MofMnFocfT/p89m6OOcZ13/mngw5yJ/7A1KRJ+fnQZenpbkzisMNcQkxPL//X/3/jxjF4
AoypB+J9hdIYmA80AR7yih8E9gEnBj7Y6PvMycOq+oiv/ovAFbgPRa4BbgFOBfqp6pIwj5fyVyjG
uW/gQB6dMuWA8lS/482YUPXmJ4C9hHEa8AnwOPAEMBeXEPxvIcVrS+hO3Qj8L3AD8LJXlhcumRjj
N+C227g3N7dc2T25uZw9fHgdtciY5GdfDpmkrI/YfvsilB0TQRaLoPo0hmJMnbHfvjCmdtkVijHG
pLB6M4ZijDEmdVhCSVL+DzGlOouFY3EIsljEhyUUY4wxMWFjKMYYk8JsDMUYY0zCsYSSpKyPOMhi
4VgcgiwW8WEJxRhjTEzYGIoxxqQwG0MxxhiTcCyhJCnrIw6yWDgWhyCLRXxYQjHGGBMTNoZijDEp
zMZQjDHGJBxLKEnK+oiDLBaOxSHIYhEfllCMMcbEhI2hGGNMCrMxFGOMMQnHEkqSsj7iIIuFY3EI
sljEhyUUY4wxMWFjKMYYk8JsDMUYY0zCsYSSpKyPOMhi4VgcgiwW8WEJxRhjTEzYGIoxxqQwG0Mx
xhiTcCyhJCnrIw6yWDgWhyCLRXxYQjHGGBMTVR5DEZEGwG+BQUA3oCnwNfAs8P9CBzFEpCPwZ6A3
sBOYDPxWVfdE8ViNgT8A5wAtgY+BEaq6NsL6NoZijDFVEMsxlOoklDRgI/AKMAv4CRgKXAY8qKqP
+NY9BFgArAeeAFoBjwFfqurZUTzWZKAncDewDbgLyAZOUtWNYda3hGKMMVVQ14Pyu4BOqnqzqr6m
qv9W1ctxyeWukHVvAjKA81T1XVX9O3AlcKaInF7Rg4hIP2AAcLWqvqSq7wLnAS2Am6vR7pRifcRB
FgvH4hBksYiPKicUVS1V1S1hFk0EmotIG1/ZMOCDkPWnARtwiaUiw4AfVHWy77F/BP4TRV1jjDG1
LGafQxGRfwG9VbWtr2w38Jiqjg5ZdyqAqp5VwfamAA1VtX9I+f3A/ap6cJg61uVljDFVUNddXgcQ
kcHAhcCjvrJM4GAg3NXMj0CHSjbbPkLdLUDDkCshY4wxdazShCIiDf1TmOXdgZdwXVnPVOGxK7uU
sEuNGrA+4iCLhWNxCLJYxMcBCcJPRPKA6b4iBQ7yLc8FPgS+AS7y9zep6hYR2Qtkhtl0JlBUSdvW
A1kR6pao6qZwlfLz88nJyQEgIyODHj16kJeXBwQPIptPrfmARGlPXc1/8cUXCdUem6+b+cD/hYWF
xFqFYyjeLcJd/WWq+rm3LBv4CHfXVz9vwDy0/nJgsape6isTXDKZoKo3VvDYLwCDVbVdSPmbwAmq
2jVMHRtDMcaYKqi1MRRV3amqn/snrwFtgKlAKXB2uGTieRUY6I2nBJwJtPWWVeRV4BARGRgoEJHW
wLlR1DXGGFPLqjwoLyJNcZ92zwHuAzqJyKm+Kd23+l+B7cD7InKxiFyHSwYzVHWmb5uni0iJiFwV
KFPV2bikNU5EfiUiFwPvAzuAv1R5T1NMaHdPKrNYOBaHIItFfFQ4hhJBW+AE3HhK6JWCAmfgPuSI
qm4Ukd64r155DvfVK28Dd4TUE9/kdz4wBhiF+0DjHOAyVd1QjXYbY4yJI/s9FGOMSWEJ9zkUY4wx
xhJKkrI+4iCLhWNxCLJYxIclFGOMMTFhYyjGGJPCbAzFGGNMwrGEkqSsjzjIYuFYHIIsFvFhCcUY
Y0xM2BiKMcakMBtDMcYYk3AsoSQp6yMOslg4Focgi0V8WEIxxhgTEzaGYowxKczGUIwxxiQcSyhJ
yvqIgywWjsUhyGIRH5ZQjDHGxISNoRhjTAqzMRRjjDEJxxJKkrI+4iCLhWNxCLJYxIclFGOMMTFh
YyjGGJPCbAzFGGNMwrGEkqSsjzjIYuFYHIIsFvFhCcUYY0xM2BiKMcakMBtDMcYYk3AsoSQp6yMO
slg4Focgi0V8WEIxxhgTEzaGYowxKSyhxlBEJENE1otIqYicGWZ5RxH5P2+dr0XkaRFpHOW2G4vI
WBFZISIbRORdEelU0zYbY4yJvVh0eT0BqG8qIyKHAHOAQ4HfAI8DlwETo9z2v4Gh3mPcAnQA5ohI
2xi0O6lZH3GQxcKxOARZLOKjYU0qi0gfYBgwHPh7mFVuAjKAE1R1i1dnLfCBiJyuqjMr2HY/YABw
nqpO9soKgDXAzcDDNWm7McaY2Kr2GIqINAIWAq8DHwEzgLNUdbpvneXAYlW91FfWAPgemKSqN1Sw
/ReAwaraLqT8DeBEVT0iTB0bQzHGmCpIlDGUu3BXOH8AIjUmB1jsL1DVUuAr4LBKtt/FWy/UUqBz
VRpqjDEm/qqVUETkcOBe4BZV3RdhnUzgYGBLmMU/4sZDKtI+Qt0tQEMRaRN9i1OP9REHWSwci0OQ
xSI+Kh1DEZFy66hqCfA88J6/e6saKuubsr4rY4ypRypMKCKSB0wPKRsC/AI4WUQyvOK0wF8Raamq
21V1i4jsBTLDbDoTKKqkbeuBrAh1S1R1U7hK+fn55OTkAJCRkUGPHj3Iy8sDgu9KUmE+Ly8vodpj
83U/HyhLlPbY66Nu5gP/FxYWEmsVDsqLSBrQNaT4AuDBCra5XVVbefXDDcoLLplMUNUbK3jsSIPy
b+LuGgttlw3KG2NMFdXaoLyq7lTVz/0T8DKQFzKN9KrcAQzybeJVYKA3nhJwJtDWW1aRV4FDRGRg
oEBEWgPnRlE35fnfjaQ6i4VjcQiyWMRHlT+HoqrfAt/6y7xbgQEWqerHvkV/BW4E3heRJ4BWwGPA
DP9nUETkdGAacK2qvuI9zmwRmQqME5FRwDbcnWU7gL9Utd3GGGPiKybf5eWNtUwDzg4dqBeRjsCf
gT7ATmAycIeq7glT/1pVHecrPxgYg7sqaYH71P0IVV0boR3W5WWMMVUQyy4v+3JIY4xJYYnywUaT
wKyPOMhi4VgcgiwW8WEJxRhjTExYl5cxxqQw6/IyxhiTcCyhJCnrIw6yWDgWhyCLRXxYQjHGGBMT
NoZijDEpzMZQjDHGJBxLKEnK+oiDLBaOxSHIYhEfllCMMcbEhI2hGGNMCrMxFGOMMQnHEkqSsj7i
IIuFY3EIsljEhyWUJPXFF1/UdRMShsXCsTgEWSziwxJKktq2bVtdNyFhWCwci0OQxSI+LKEYY4yJ
CUsoSaqwsLCum5AwLBaOxSHIYhEfSXfbcF23wRhj6hv7CWBjjDEJxbq8jDHGxIQlFGOMMTFRLxKK
iDQQkbtEZKaIbBSRHSLymYj8SkSi6vsTkQwR+YeIfCsia0VknIhkxLvt8SAifUXkZRFZIiIlIrKm
ivXrfSxqsg/iPCQii0Vki4j8R0SOj3eb40FEDhWRp0XkExHZJSKlItIpyrpJEwcAEfmliLznHQ+7
RGS5iDwmImlR1E22WAwUkekisl5EdovIdyLypoh0i6JutWNRLxIK0Ax4EFgGjASuAr4G/gbcV1ll
EWkMzAR+AYwC7gZ6AbO9ZfVNf6AvsBj4Coh6ICwZYhGDfXgBuAt4EbjGKysQke5xaG68HQ5cCmwB
ZlWxbjLFAeBO3DntEWAw8AHwG+DdKN54JlssWgHzcft/LvA8cCIwU0Q6VFK3+rFQ1YSfcAdJZpjy
AqA4ivpXAaVAN19ZV2A/cE1d71814iG+//8JrKlC3Xofi5rsA9AZKAFu9pU1BlYB/6+u962Gx8L1
Xlw6RVEvqeLgtf+QMGUPeTE5JZViEWE/z/FicWO8YlEvrlBUtVRVt4RZNBFoLiJtKtnEMOAzVV3u
2+ZKXAa/MnYtrR3qPcvVlAyxqMk+DMW9qF731d0DvAMMEZGDYt/c+KnBsZBUcQBQ1R/CFE/0/nau
oGrSxSKCdd7fHRWsU6NY1IuEUoE+wCZV3VTJel1w3UOhlgKHxbxViS0ZYlGTfegCfK+q28PUbQK0
q3nz6oVUiUMf7++SCtZJ2liIyEEi0lRE+gNPAoXA+Aqq1CgW9TahiMhg4ELg0ShWb4frYw61BWgf
y3bVA8kQi5rsQ/sK6gJU1r+cLJI+DiLSGXgY+JeqLqtg1WSOxVzgJ2AqkAkcp6q7Kli/RrFIyIQi
Ig39U5jl3YGXgGnAM7XewFpUWSxMtcTkU8FJIGnjICLpwP8BO3ED05VWiW+L6syVuKu0B4BGuBtX
KnvTVe1YJFxCEZE8YK9v2hOyPBf4EPgGuCjKPuT1uOwcKhMoqkl746myWFRTvYxFiJrsQ0V1iaJ+
skjaOIhIU2ACkAMMVNUNlVRJ2lio6nJV/URVH8UllhzcGGQkNYpFIr7jXQCcFG6BiGTjLt224g6U
nVFucw1wbJjyY7xliSpiLEJUZWC2vsbCryb7sAbIFpEWquofnDwG+Bmo7OSTLJIyDiLSCDeAfAJw
tqoujaJaUsYilKpuF5FvgH7AmAir1SgWCXeFoqo7VfVz/wTg3ck1FXcHwtmq+mMVNvsqcKKIHBko
EJGuuJP1qzFsfkxFikUN1ctYhKjJPryGO+6H+uo2Bi4B3lLV/bFvbkJKujiISAPcbfR5wGBVnRdl
1aSLRTgi0hboBqysYLWaxaKu742O8v7ppsBnuAw5FDg1ZEr3rXs17j7q00Luo/7SC+QV3rQCd+dH
47rev2rEIwv4pTfNAjZ6T/gvgaOSPRbR7gPBe+rvD6n/Im6g8jbgAuA/uKveY+p636oZj8Cx8Dzu
DdfN3vxpKRaH57z9fyTMOSI7xWLxL9yHvi8EzgBuApbjrjA6xCsWdb7jUQYnxztQ9nt//dP+kBPm
NaFlXnkG8A9gLfAdMA5oVdf7Vs145IXs/37f/w+kQiyi2QffcfNASLngPvC2GHf3yn+A4+t6n2oQ
i9DXQ+D/6SkWhzURzhFl+55CsbgL12W+1UsOy3FvODr51ol5LOzr640xxsREwo2hGGOMqZ8soRhj
jIkJSyjGGGNiwhKKMcaYmLCEYowxJiYsoRhjjIkJSyjGGGNiwhKKMcaYmLCEYowxJib+P1lYWp58
PuDNAAAAAElFTkSuQmCC
">
</div>
</div>
</div>
</div>
</div>
<div class="text_cell_render border-box-sizing rendered_html">
<h3 id="rewrite-as-a-function-for-quadratic-interpolation">Rewrite as a Function for Quadratic Interpolation</h3>
</div>
<div class="cell border-box-sizing code_cell vbox">
<div class="input hbox">
<div class="prompt input_prompt">
In [96]:
</div>
<div class="input_area box-flex1">
<div class="highlight-ipynb"><pre class="ipynb"><span class="sd">"""</span>
<span class="sd">Demonstration module for quadratic interpolation.</span>
<span class="sd">"""</span>
<span class="kn">import</span> <span class="nn">numpy</span> <span class="kn">as</span> <span class="nn">np</span>
<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="kn">as</span> <span class="nn">plt</span>
<span class="kn">from</span> <span class="nn">numpy.linalg</span> <span class="kn">import</span> <span class="n">solve</span>
<span class="k">def</span> <span class="nf">quad_interp</span><span class="p">(</span><span class="n">xi</span><span class="p">,</span><span class="n">yi</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Quadratic interpolation. Compute the coefficients of the polynomial</span>
<span class="sd"> interpolating the points (xi[i],yi[i]) for i = 0,1,2.</span>
<span class="sd"> Returns c, an array containing the coefficients of</span>
<span class="sd"> p(x) = c[0] + c[1]*x + c[2]*x**2.</span>
<span class="sd"> """</span>
<span class="c"># check inputs and print error message if not valid:</span>
<span class="n">error_message</span> <span class="o">=</span> <span class="s">"xi and yi should have type numpy.ndarray"</span>
<span class="k">assert</span> <span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">xi</span><span class="p">)</span> <span class="ow">is</span> <span class="n">np</span><span class="o">.</span><span class="n">ndarray</span><span class="p">)</span> <span class="ow">and</span> <span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">yi</span><span class="p">)</span> <span class="ow">is</span> <span class="n">np</span><span class="o">.</span><span class="n">ndarray</span><span class="p">),</span> <span class="n">error_message</span>
<span class="n">error_message</span> <span class="o">=</span> <span class="s">"xi and yi should have length 3"</span>
<span class="k">assert</span> <span class="nb">len</span><span class="p">(</span><span class="n">xi</span><span class="p">)</span><span class="o">==</span><span class="mi">3</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">yi</span><span class="p">)</span><span class="o">==</span><span class="mi">3</span><span class="p">,</span> <span class="n">error_message</span>
<span class="c"># The linear system to interpolate through data points</span>
<span class="n">A</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">vstack</span><span class="p">([</span><span class="n">xi</span><span class="o">**</span><span class="mi">0</span><span class="p">,</span> <span class="n">xi</span><span class="o">**</span><span class="mi">1</span><span class="p">,</span> <span class="n">xi</span><span class="o">**</span><span class="mi">2</span><span class="p">])</span><span class="o">.</span><span class="n">T</span><span class="p">;</span>
<span class="n">c</span> <span class="o">=</span> <span class="n">solve</span><span class="p">(</span><span class="n">A</span><span class="p">,</span><span class="n">yi</span><span class="p">)</span>
<span class="k">return</span> <span class="n">c</span>
</pre></div>
</div>
</div>
</div>
<div class="text_cell_render border-box-sizing rendered_html">
<p>For testing the function with varying inputs, a loop is defined for producing inputs and calling the interpolation function and plotting function.</p>
</div>
<div class="cell border-box-sizing code_cell vbox">
<div class="input hbox">
<div class="prompt input_prompt">
In [97]:
</div>
<div class="input_area box-flex1">
<div class="highlight-ipynb"><pre class="ipynb"><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">3</span><span class="p">):</span>
<span class="n">xi</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="o">-</span><span class="mf">1.</span><span class="p">,</span> <span class="mf">0.</span><span class="p">,</span> <span class="mi">2</span><span class="p">])</span>
<span class="n">yi</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="mf">1.</span><span class="o">+</span><span class="mi">100</span><span class="o">*</span><span class="n">i</span><span class="p">,</span> <span class="o">-</span><span class="mf">1.</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">i</span><span class="p">,</span> <span class="mf">7.</span><span class="o">+</span><span class="mi">15</span><span class="o">*</span><span class="n">i</span><span class="p">])</span>
<span class="n">c</span> <span class="o">=</span> <span class="n">quad_interp</span><span class="p">(</span><span class="n">xi</span><span class="p">,</span><span class="n">yi</span><span class="p">);</span>
<span class="n">plot_quad</span><span class="p">(</span><span class="n">xi</span><span class="p">,</span><span class="n">yi</span><span class="p">,</span><span class="n">c</span><span class="p">)</span>
<span class="k">print</span> <span class="s">"The Solution is :</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="s">"c = "</span><span class="p">,</span><span class="n">c</span><span class="p">,</span> <span class="s">"</span><span class="se">\n</span><span class="s">y = "</span><span class="p">,</span> <span class="n">yi</span>
</pre></div>
</div>
</div>
<div class="vbox output_wrapper">
<div class="output vbox">
<div class="hbox output_area"><div class="prompt"></div>
<div class="box-flex1 output_subarea output_display_data">
<pre>
<matplotlib.figure.Figure at 0x112552850>
</pre>
</div>
</div>
<div class="hbox output_area"><div class="prompt"></div>
<div class="box-flex1 output_subarea output_display_data">
<img src="data:image/png;base64,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
3XXXAfC73/2Ofv368eyzz1JcXMxTTz3FTz/9xFlnnUX//v1ZvXo1f/zjH7nuuutYtmxZ2fZefPFF
LrroIjZu3Ejfvn0B+Nvf/sbIkSMpKiri2GOPZdiwYQD8+OOPDBo0iOHDh/Pjjz9y++23M2jQILZu
3Rq2rffeey/r169n2rRpLFu2jIceegiAV155hU6dOjFx4kSKi4v57W9/G7b+c889x1133cWSJUvY
unUrY8aMAeCrr77i5ptv5vXXX2flypUUFhZSVFQU1RXa2rVrGTduHD179qSkpIQLLriAs88+m02b
NvH0008zZMgQVq5ceUC9a665hn/+859l8++//z7Z2dkcf/zxZWVvvfUWU6ZM4dVXX+X+++8v61b7
3e9+x5w5c1i0aBGLFi3ik08+4dFHHy2r98MPP/DVV1+xYMECrrjiCoYNG8bYsWN54403ePvtt3nk
kUfYt28fcOBV6KBBg1i1ahUrVqygc+fOZc+VSRyWUJJUMvQRN2/enPvuu49WrVpx0003sX79en74
4Yey5f4ujokTJ5KWlsaoUaPIyMhg0KBB9O/fv9xVSq9evRg6dCgNGzakcePGAPTs2ZO+ffty8MEH
M3z4cObMmcP333/PpEmTaNasGVdffTUNGjRg2LBhNGvW7IB39QC5ubmceeaZNGrUiOOOO45f//rX
zJw5M+r9FBEGDx7MmWeeSXZ2NhdffDFffPEFAO+88w4nnXQSvXv3plGjRtx6662UlJRE3JaqMmbM
GFq1akWvXr1o3LgxL7/8Mp988glr165lxIgRNGzYkDPOOIOePXvy+uuvHxDPYcOGMWnSJHbu3Am4
pOi/UgC466676NixIwMGDOCII45g0aJFALz66qvccMMNZGVlkZWVxfXXX88rr7xSVq+0tJQHH3yQ
zMxMrr32WjZu3Eh+fj65ubmcccYZdOjQgY8//rhcewLy8/Np3rw57dq144EHHmDRokUUFxdHHWe/
ZHh9JCL7pLwp8+c/13ULyuvevTsNGrj3PO3btwdg586dHHLIIUD5d7Dffvsta9asoVWrVmVl+/fv
Jzs7u2zdXr16ldu+iJR71921a1eaN29OUVERRUVFnHDCCeXWP+mkk1i3bt0B7dy4cSO33347H330
EcXFxZSWltK6desq7WuPHj3K/m/Xrl3ZybyoqKjcsi5dutCyZcuI2xER7rzzTkaPHl2ufN68eWX7
59+foqKiA7bRoUMH+vTpwzvvvMPgwYOZPHkyTz/9dMT2tm/fvqy969ev58QTTyxbduKJJ5Z7jPbt
25OZmQlA27ZtAco9B23btg0b4/3793PvvffyzjvvsGnTprLjYvPmzaSnp0eMh6lddoWSpJK9j1hE
yg2sd+rUidzcXLZu3Vo27dixg2effbZsnYMOOqjcNlS17EoAYMWKFfz0009kZ2fToUMHPv/883Lr
L1iwoCxB+d1zzz1s376dJUuWsH37dp588slybavJoHyHDh3KtXH16tVl4zORhHusDh06sHLlSn76
6aeysvnz54fdHwh2e7399tv07t27LKFH094FCxaUzUeKWVW99tprjBs3jg8//JDt27eXdYdWN67J
/vqoK5ZQTL3Utm1bFi5cWHZCOf/889m5cydjxoxhw4YN7Nu3j/nz57N8+XIg8oln4cKFzJkzh717
9/LMM8/Qp08fsrOzOe+88/j555955ZVXKCkp4bXXXmPXrl2cf/75B2wjLS2NjIwMGjVqxLx583jm
mWcOaOtnn31W4f5Eat8ll1zCggULeP3111m/fj2jR4+mYcPIHQuRtnPqqafSsWNHxo4dy759+ygo
KGDhwoVcfvnlYetddNFFfP755zz11FNcffXVFbbdb+jQobz00kts3ryZzZs389JLL3HllVdGXT+S
tLQ0mjdvTrNmzSgsLOSBBx4ot9zu8EoMllCSVH3vIw53C7F//vbbb2fq1KlkZGQwYsQI0tLSmDp1
KgUFBRx77LG0b9+eUaNGld1hFGl7N9xwA3/84x9p3749ixcvLhuMzszMZOLEiYwdO5asrCyefPJJ
Jk6cGLYra+TIkfz888907tyZO+64g1tuuaXcY40aNYpnn32Wli1b8qc//emAfQmd97e1e/fuPP/8
89x999384he/oGfPnmRkZJSNAUUTN4BGjRoxYcIEpkyZQps2bbj11lt5/fXX6dq1a9h6TZo04eKL
L6awsJCLL744YltD3XfffZx66qkcd9xxHHfccfTq1Yv77rsvYt2KtuVv04UXXkj//v3p0aMHF1xw
AUOGDIkYs2jU99dHorIvh0wx9mV5Qddeey2HHnoojzzySF03JWpLly7l2GOPZc2aNXTu3DmujzV6
9GhWrVrFuHHj4vo48WTHe+XsyyFNpayPuHL15UQzYcIEdu3axcqVK3nwwQc54YQT4p5MtmzZwvPP
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
PuDNAAAAAElFTkSuQmCC
">
</div>
</div>
<div class="hbox output_area"><div class="prompt"></div>
<div class="box-flex1 output_subarea output_stream output_stdout">
<pre>
The Solution is :
c = [-1. 0. 2.]
y = [ 1. -1. 7.]
</pre>
</div>
</div>
<div class="hbox output_area"><div class="prompt"></div>
<div class="box-flex1 output_subarea output_display_data">
<pre>
<matplotlib.figure.Figure at 0x11252cf90>
</pre>
</div>
</div>
<div class="hbox output_area"><div class="prompt"></div>
<div class="box-flex1 output_subarea output_display_data">
<img src="data:image/png;base64,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
fftaX2xxt759gyPP4sWLAVi5ciW33347d911FwAvvPACl19+OW+88QaHDh1i+PDh/Pnnn/z973+n
TZs2bNy4kVdffZW77rqL1atX59T37rvv0rFjR3bu3EmrVq0AeO+99+jXrx/bt2/nvPPOo1u3bgDs
3buX9u3b07t3b/bu3UufPn1o3749+/bt8ynrk08+yY4dO/j2229ZvXo1gwcPBuDDDz+kfv36pKWl
cejQIR599FGf5d98800ee+wxVq5cyb59+xgyZAgAv/zyC/fffz8ff/wx69atY/PmzWzfvj2gltuW
LVsYN24czZo1IyMjgw4dOnDVVVexa9cuRowYQefOnVm3bt1J5Xr27MlHH32Us//ll19Sp04dLrjg
gpy0SZMmMWPGDMaPH8+gQYNyXG8vvPAC8+fPZ/ny5SxfvpyFCxfy/PPP55T7448/+OWXX1iyZAld
u3alW7duDBs2jIkTJ/Lpp5/y3HPP8ddffwEnt07bt2/P+vXrWbt2LQ0aNMj5rZTAGD0a7gzxxFlq
XCKcFi2gdGmYP7/odcSCP7l8+fIMHDiQKlWqcN9997Fjxw7++OOPnOOebpC0tDQqVKjAgAEDSEhI
oH379rRp0yZP66VFixZ06dKFUqVKUaZMGQCaNWtGq1atOOWUU+jduzfz589n69atTJs2jXLlynH7
7bdTokQJunXrRrly5U762gdITk6mbdu2lC5dmvPPP59//vOfzJkzJ+DrFBFuvPFG2rZtS506dejU
qRM//fQTAJMnT+aiiy6iZcuWlC5dmgcffJCMjIx86zLGMGTIEKpUqUKLFi0oU6YMY8aMYeHChWzZ
soW+fftSqlQprrzySpo1a8bHH3+cpyxAt27dmDZtGocPHwasgezhNfHdY489Rr169bj66qs544wz
WL7czuY0fvx47rnnHqpVq0a1atW4++67+fDD3JXKs7KyePrpp0lMTOSOO+5g586dpKamkpyczJVX
Xknt2rVZsGBBHnmySU1NpXz58tSsWZOnnnqK5cuXc+jQoYD17E0sPCOBsnWrdbff5G/h6WKiI/Qj
HJHc1ovzgR0Whg4N37kCoXHjxpRwIo+1atmFSQ8fPsxpp50G5P2y/e2339i0aRNVqlTJScvMzKSO
M1mbiNCiRYs89YtInq/xM888k/Lly7N9+3a2b99O06ZN8+S/6KKL2OYjGLZz50769OnDd999x6FD
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
">
</div>
</div>
<div class="hbox output_area"><div class="prompt"></div>
<div class="box-flex1 output_subarea output_stream output_stdout">
<pre>
The Solution is :
c = [ -3. -65.16666667 38.83333333]
y = [ 101. -3. 22.]
</pre>
</div>
</div>
<div class="hbox output_area"><div class="prompt"></div>
<div class="box-flex1 output_subarea output_display_data">
<pre>
<matplotlib.figure.Figure at 0x11339f490>
</pre>
</div>
</div>
<div class="hbox output_area"><div class="prompt"></div>
<div class="box-flex1 output_subarea output_display_data">
<img src="data:image/png;base64,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
CLaZu4igsQryW+KXwsRhsrOz/aaLiD3skVJHYb4fycTkydC2bXDjEmnCngdjiT+aNoVffjFH7dpF
ryeZe3kWizeBDEwqMGUK9OkT2zatiyzBueEGuOAC6NmzaOVFxBoYS8qQqs/79u1Qpw789huUKRM8
r6Mj6yKzFH64ssViST0++wwuuii0cYk01sAkOG3awIIFsNt35x0fUsHHbLEUlWT/fnzyCfzrX7Fv
1xqYBKdCBeMimzHDbUlSm8zMTF599dUild24cSPly5ePK9dNVlYWjzzyiNtiHMGTTz7JbbeFsyFo
fMrvFrm5MG2aNTCWIhKOmywzMzMmskSSjIwMZs2aFTojx/aCjwTBRij5kpGRwezZBTv31qlTh127
dkUlAJ2VlUXp0qUpX748lStXpnXr1qxevTpkucLcT6zo378/Y8eODStvYeVPxO9HuGRnw2mnQbVg
G6JECWtgkoB27WDqVDgccLGdxKQwL4ljfRnm5eWFzhQhYhloFhEeeOABdu3axffff0/JkiXJysoK
q2w89aiKQqLLHyk+/hjat3enbWtgkoCMDKheHb78MnCeRPcxv/766zRv3pzBgwdTs2ZN6tevz2ef
fQbAww8/zPz58+nVqxfly5fnnnvuAeDHH3/ksssuo3Llypx66qm8//77+fVlZWXRp08fOnXqRHp6
OnPmzCErK4vevXtzzTXXUKVKFTIzM9m4cWN+mYULF3L++eeTlpbGP//5T74MoPD169fTqlUrqlSp
wgknnED37t3ZscPss9ejRw82btxIu3btKF++PEOHDiUnJ4dixYrlG7nMzEyeeuop2rRpQ6VKlWjT
pg3btm3Lr//NN9+kbt261KtXj5EjR4bs6XletDVr1qR79+6sWGH2Cvzhhx/IzMykUqVKnHHGGUz2
6QZ7jPYZZ5zBlClT8tMPHjxIlSpVWL58eb7sH374IaeddhonnHACTzzxRH7eAwcO0Lt3b2rWrEnN
mjXp06cPubm5gHkma9WqxZgxY6hXrx6nn346s2fPZt68eZx//vlUqVKFp59+Or+uQYMG0aNHj/zz
6667jurVq1OxYkVatmzJqlVF3zAz0b8fgcjLswbGEgE6dID//S+ydfbubWb+HuvRu3dk5Fm82OxH
t2LFCm644QZuueUWAIYMGUKLFi14/vnn2bVrFyNHjmTPnj1ceumltGrVip9++olnn32WW265hR9+
+CG/vrFjx9KhQwd+//13mjdvDsArr7xCnz592Lx5M2eeeSbdunUD4K+//qJt27bcfffd/PXXX9x7
7720bduWv//+26+sDz/8MFu2bGHWrFn88MMPDBo0CIC33nqLOnXqMGXKFHbt2sX999/vt/wLL7xA
v379WLFiBX///TdDhw4FYNWqVdxxxx1MmDCBNWvWkJOTw+bNm8PqwW3cuJE333yTxo0bc+jQIdq1
a8dll13G1q1bGTVqFJ07d2bNmjVHlbvxxht5++23888//fRTatasydlnn52fNnHiRGbMmMH48eN5
5JFH8t1wQ4YMYcGCBSxfvpzly5fz5Zdf8p///Ce/3B9//MGqVatYsmQJ119/Pd26dWPEiBG8++67
vP/++zz++OMcPHgQOLqX2rZtW9atW8fq1aupW7du/mdlKeCbb6B8efjHP9xp3xqYJMFjYAJ5BZLB
x1y2bFkGDBhApUqV+L//+z+2bNnCH3/8kX/d2yUyZcoUypUrR//+/UlLS6Nt27a0atXqiF5MkyZN
6Nq1KyVKlKB06dIANG7cmObNm1OqVCnuvvtuFixYwK+//srUqVMpU6YMN9xwA8WKFaNbt26UKVPm
qF/9AA0aNOCSSy6hZMmSnHXWWdx5553MnTs37PsUEdq3b88ll1xCzZo16dixI8uWLQNg0qRJnHfe
eTRr1oySJUvSq1cvDh06FLAuVWXo0KFUqlSJJk2aULp0aV5//XW+/PJLNm7cSO/evSlRogQXX3wx
jRs3ZsKECUfps1u3bkydOpXdzlDFt95664ieBEC/fv2oXbs2rVu35uSTT2b58uUAjB8/nttuu40q
VapQpUoVbr31Vt566638cnl5eQwcOJD09HRuuukmfv/9d7KysmjQoAEXX3wxNWrUYOHChUfI4yEr
K4uyZctSrVo1Hn30UZYvX86uXbvC1rM3yfD98MdHH7nXewE7kz9pOOssY1y+/978HwmGD49MPZGi
YcOGFHOWjq5evToAu3fv5sQTTwSO/IX7888/s2HDBipVqpSfdvjwYWrWrJmft0mTJkfULyJH/Cr/
xz/+QdmyZdm8eTObN2/mnHPOOSL/eeedx6ZNm46S8/fff+fee+/liy++YNeuXeTl5VG5cuVC3Wuj
Ro3y/69WrVr+y33z5s1HXKtfvz4VK1YMWI+I0LdvXwb7LFj39ddf59+f9/1s3nz03n01atTgwgsv
ZNKkSbRv357PPvuMUaNGBZS3evXq+fJu2bKFc88t2Hfw3HPPPaKN6tWrk55u9g2sWrUqwBGfQdWq
Vf3q+PDhwzz88MNMmjSJrVu35j8Xf/75J+XLlw+oj1Tjo49g3Dj32rc9mCRBJLibLFl9zB5E5IhA
fZ06dWjQoAF///13/rFz506ef/75/DzFixc/og5Vze8pAKxevZo9e/ZQs2ZNatSowbfffntE/iVL
luQbLG8eeughduzYwYoVK9ixYwfDhg07QrZjCfLXqFHjCBl/+umn/PhOIPy1VaNGDdasWcOePQUb
xC5evNjv/UCBm+z999+nWbNm+QY+HHmXLFmSfx5IZ4XlnXfe4c033+Tzzz9nx44d+e7Touo1Gb8f
a9bA33/D+ee7J4M1MElENOIwiULVqlVZunRp/gvmqquuYvfu3QwdOpTffvuNgwcPsnjxYn788Ucg
8Ito6dKlLFiwgNzcXEaPHs2FF15IzZo1ufLKK9m3bx9vvfUWhw4d4p133mHv3r1c5WdzjXLlypGW
lkbJkiX5+uuvGT169FGyfvPNN0eV8yaQfNdccw1LlixhwoQJbNmyhcGDB1OiRGBHRKB6LrjgAmrX
rs2IESM4ePAg2dnZLF26lC5duvgt16FDB7799ltGjhzJDTfcEFR2b7p27cq4ceP4888/+fPPPxk3
bhzdu/vuG1h4ypUrR9myZSlTpgw5OTk8+uijR1y3I8hMcP/qq93dL8oamCSiWTPYvBk2+NlAOtF9
zP6GLHuf33vvvcycOZO0tDR69+5NuXLlmDlzJtnZ2Zx55plUr16d/v37549gClTfbbfdxrPPPkv1
6tX5/vvv84Pb6enpTJkyhREjRlClShWGDRvGlClT/Lq++vTpw759+6hbty733XcfPXv2PKKt/v37
8/zzz1OxYkWee+65o+7F99xb1oYNG/Liiy/y4IMP0rRpUxo3bkxaWlp+DCkcvQGULFmSyZMnM2PG
DE444QR69erFhAkT+IcTDfYtd9xxx9GxY0dycnLo2LFjQFl9GTBgABdccAFnnXUWZ511Fk2aNGHA
gAEBywary1umq6++mlatWtGoUSPatWtH586dA+osHBL9++EPt+MvYBe7TDpuvRUaNgx/1dRUXfzP
HzfddBO1atXi8ccfd1uUsFm5ciVnnnkmGzZsoG7dulFta/Dgwaxbt44333wzqu1Ek1R53n//HU49
1fwtVapwZe1il5aABHKTJaOPOdIkyotn8uTJ7N27lzVr1jBw4EDOOeecqBuXbdu28eKLL3L77bdH
tR23SLbvx+TJZp3CwhqXSGMNTJJxySXw3XfgNXrXEibxuDyKPz755BNq1qzJ+eefz44dO3j33Xej
2t7YsWM55ZRT6NatW/58IUt8Ew/uMbAusqSkUydo3dq4y0KRKi4DiwVS43nftQtq1jQbEQYZwR4Q
6yKzBKVDB/MLxmKxpB7Tp5sBP0UxLpHGGpgk5MorYd4880vGQ7L5mC2WSJJM3494cY+BNTBJScWK
5hfMtGluS2KxWGJJbi58+qk7e7/4wxqYJMV3NFkyjvO3WCJFsnw/Zs0ye7/UqOG2JAZrYJKUq682
+3AfOOC2JBaLJVZ88AFce63bUhQQ1MCIyLUi8pGIbBSRvSLyo4g8ISLlfPKVFpERIrJaRH4TkQ9F
pI6f+kREBonI9yKyTUSmicjZvvmCyNNJRBaIyHbnb5fwbzW1qFYNTj8d5swx58nkY04EypcvT05O
jttiWMIkGb4fhw6Z5WF8FlpwlVA9mL5OnseB9sB04C7gQzlywsDHQFfgaaAnUANYICJVfeobA/QD
xgI3OmnZItIwlKAi0g2YACwBugCLgfEi0iNowRSmffvEXpssIyODMmXKULFiRTIyMmjVqhWTJk0K
u7zvRl5FoVixYpQrV45y5cpRq1Yt7rvvvrDq27VrFxkZGWG38dNPPxVZRosFYO5cs/lglOfcFg5V
DXgAJ/pJGwTkAf90zls455d75akM7AAGeqXVBQ4Bd3illQbWAa+FkEOAtcC7PunjnfISoJymMuvW
qZ54ouqhQ4HzBNLR3ClT9OHWrXVgy5b6cOvWOnfKlEK3f6x1ZGRk6KxZs1RVdefOnfrJJ59ovXr1
9L777gur/IYNG1RE9FAwBYRARHT9+vWqqrpgwQItW7asjhkzpsj1BWpj3bp1Ea3T4p9kfifceafq
U08dez2OjoLahnCPwheA8xyDcp1zPgb4zU++d4G1XucPArlARZ98TwF7geJB2rzAabOtT/rlTnqz
AOWOXdsJzln1p+id5wV+yfvT0dwpU/ShBg3M4+EcDzVoUCgDEYk6vA2Mh6+//lpLlCiha9euVVXV
KVOmaKNGjbR8+fJau3ZtHTRoUH7e2rVrq4houXLltFy5cvrVV1/punXr9OKLL9b09HStUqWKduvW
Tbdv3x5QBm8Do6rapk0bvfvuu1VV9eWXX9aTTjpJK1eurP/617908+bNfsvdeOON2qdPH+3cubNW
qlRJmzRpkn+tRYsWKiJatmxZLVeunE6cOFH37t2rt9xyi9atW1crV66sLVq00Ly8vLD1ZglMsr4T
Dh1SrVpV1flaHBNuG5h7nZf6ac75DGC2n3yPALle5y8DP/nJ18Opr2aQNq938tTxSa/tpHcLUO7Y
tZ3AzJ0yRe+sbF7ycwK85P3p6OHWrY8wDJ5jQJs2YbcdiTr8GRhV1Tp16ui7776rqqrZ2dm6YsUK
PXTokH722Wdavnx5/eijj1RVNScnR0VEDx8+nF923bp1OnPmTM3NzdXly5dr48aNtXfv3gFl8PQu
Dh8+rPPnz9cyZcrouHHjdNasWZqWlqZLly7VAwcOaM+ePfWiiy46opy3galQoYJ++OGHunXrVr3q
qqu0S5cufvOqqo4ePVqvv/563bFjhx46dEi/+OKLsHVmCU6gd8KcOXNiK0iEmTdP9ayzIlNXJA1M
oUaRiUhd4DHgf6rq2dy8OrDNT/ZtQAkROSGMfGDiNoHw7G7kWz6csinLjJEjeeGv9UekDVm/ns99
diP0pUSAoWfF9+8Pu+1I1BGIGjVq8MsvvwDQsmVLGjZsSPHixWnTpg1XX311/vbE5rtyJEXZzrhx
48akp6eTlZXFfffdR1ZWFuPHj+eKK66gUaNGlCpVij59+jB//nw2btzot46WLVvSoUMHqlSpQrdu
3Y7YNMyXvLw8/vzzTzZt2kTx4sW58MILw1WNJUWJt9FjHsLeMllEygMfALsxgX4PhVnYJ/5XEkwi
vF/ymV7poV7yhwLsLXL4uOPCbjsSdQRi06ZN1K5dG4BFixbx4IMPsnLlSnJzczlw4ACdOnUKWLYo
2xkvXbqU+vXrH5G2ZcsWLrnkkvzzk046iQoVKrBp0ybq1DlyAKWIBNwC2R+33HILu3fvpl27dqgq
d9xxB3379g0qo+XYSOR5MHl5xsBMn+62JEcTloERkeOByUAG0FJVf/O6vAWo4qdYOnBIVbd65Tsj
QD6AozcDP7INT949Xukhy2ZlZeWP5klLS6NRo0b5D5NnaGKynq/fs4dsCoxLtvPX85IPNDSz9T33
8PD69QxZX9D7eahBAy6/+26/+aNVhz8WL17Mli1baNy4MQDXX3893bt3Z/r06ZQqVYru3bvn91w8
Ax29ezLe2xmnpaXxyiuv8NhjjxVaDt+tgNeuXcvOnTsDbgfsrzcV6HqZMmXo378//fv3Z+XKlTRr
1owrr7y4CkfKAAAgAElEQVSShg1DDra0FAK3v5+ROj/++EzKlYM//sjmjz8KX97zf1SG1YfyoQEl
gamYUWH/9HM9UJD/PWCN13l/TJC/gk++pzFGI1iQvyn+g/xXYIP8AfEOtHtiMP3DiMF4yg5o00YH
tmypA9q0KfIosmOpIyMjQ2fOnKmqqjt27NDJkydrgwYNtE+fPvl5zjrrLB0+fLju3btXP/74Yy1f
vrz26NFDVVX37NmjxYsX16+++io//z333KNdunTR3bt366JFi/Tss8/WWrVqBZTBNz7iYebMmVqp
UiVdtmyZ7t+/X++66y5t0aKF33I33nijDhgwIP/anDlzjmizWrVq+TElVTNwYe3atXr48GFduXKl
pqWlaXZ2dth6swQm0POeyDGYvn1VvR6vY4ZYBfkxc2DecwzAxQHyeIYpt/FKqwzsxP8w5f/zSgtr
mLKTdy0wwSftbWBdkDKR03qC4nnJNyl9tt7V5OiXfDzrKCMjQ48//nitUKGC1q5dWzMzM/W99947
Is/nn3+uzZo10ypVqmiXLl20b9+++QZGVfXRRx/V9PR0rVSpki5atEg3bNigV199taanp2vz5s31
pZde0tq1aweUoVixYn4NjKrqmDFjtEGDBlq5cmVt166dbtq0yW+5rKwsfeSRR/KvzZkz54g2x4wZ
o1WrVtWKFSvqxIkTddiwYZqRkaHlypXTZs2a6bBhwwqnOEtAks3A5OWp1qununRp5OqMpIEJuh+M
iLwA3AEMcXox3vyiqpucfDOAs51eynbMZMpawHnq5U4TkbGYEWH9gQ2YSZkXAC1UdYVXvnVAjqpe
6pXWHXgDGIWZ8NkauAe4WVXfCCC/Bru/VGLQINixA4YNOzI9FfbHsFg8JNvzvnSpCe6vWweR2isv
kvvBhDIwG4A6+A/OD1LVwU6+UsBQjMuqArAA6K2qRwypcWb/DwSuwYz8+hp4UFWX+2l3g6q28knv
hBkm3RBYBYxU1YDb+VkDU8DKlXD55fDzz1DMa+xgsn3hLJZgJNvz/vDDZomYp5+OXJ0xMzCJjjUw
BcyZk03Pnpm8/jo0aVKQnmxfOIslGIGe9+zs7IQbSaZqVk5+80345z8jV6/d0dJSaERMV/r9992W
xGKxRIJVq2DvXjj/fLclCYztwaQQ331nNiLasKHAX2t7MJZUIpme90cfhT174NlnI1uv7cFYisSZ
Z0KpUuA1fcNisSQgqvDee9C5s9uSBMcamBQhOzs7301WiBXvLZaUINH2g1m+HA4ejG/3GBRiqRhL
cnDddcbIPPXUkW4yi8WSOLz7LnTqFLmhydHCxmBSDFU4+WTzgJ53ntvSWCyWwqIK9evDhx/COedE
vn4bg7EUGRHo0sX4by0WS+KxeDGULAle66fGLdbApAjePuYuXUwP5hh2Ek5oEs3fHi2sHgpIJF14
gvvx7h4Da2BSkjPOgIoVYeFCtyWxWCyFIS8PJk6M/9FjHmwMJkUZMgS2bIHRo92WxGKxhMuCBXD7
7Wbpp2hhYzCWY6ZzZzOr/9AhtyWxWCzhkghzX7yxBiZF8PUxn3QS1KkDCeR6jhiJ5G+PJlYPBSSC
Lg4fNj8KrYGxJARdusCECW5LYbFYwmH+fKhWDU45xW1JwsfGYFKYX36Bs882sZjSpd2WxmKxBOPO
O6FuXXjwwei2Y2MwlohQuzY0bAgzZrgticViCcahQ/DBB2b2fiJhDUyKEMjH3LWrmROTSiSCvz0W
WD0UEO+6mDMHMjLMDP5EwhqYFOfaa2HqVLOvhMViiU/efTexgvsebAzGQuvWcNttZiFMi8USX+zf
DzVqwPffQ82a0W/PxmAsEcWOJrNY4pepU826Y7EwLpHGGpgUIZiPuUMHmDULduyInTxuEu/+9lhh
9VBAPOti/Hjo1s1tKYqGNTAWKlWCzEz46CO3JbFYLN78/bf58XfNNW5LUjRsDMYCmCUoXn3VDlm2
WOKJV16BadPMEOVYYWMwlojzr3+ZfSY2b3ZbEovF4iGR3WMQhoERkVoiMkpEvhSRvSKSJyJ1fPJk
OOn+jgo+eUVEBonI9yKyTUSmicjZ4QosIp1EZIGIbHf+dgn/dlOXUD7m4483sZhUCPbHs789llg9
FBCPuvj1V1i+HK680m1Jik44PZiTgOuAbcC8EHmfAC7wOXb75BkD9APGAjc6adki0jCUICLSDZgA
LAG6AIuB8SLSI4z7sISge3d4+223pbBYLGB+7HXsCMcd57YkRSdkDEa8AhkicivwMpChqhu98mQA
PwG3quq4IHXVBdYDvVR1jJNWGlgJzFfVm4LJAawBvlHVLl7p44EmwMm+ARcbgykceXlmraNp08ym
ZBaLxT0aNYJhw+Dii2PbbkxjMIV8Q4cSqiuQh+mFeOo/AEwCOotI8SBlmwANgLd80t8C6gNNCyGn
xQ/FisH119tejMXiNitXwp9/QsuWbktybEQ6yP+kiOSKyK8iMlFE6vlcrw/8qqq+My5WAscB1YLU
7VmF53s/ZQF827J4Ea6PuXt3E1jMy4uuPG4Sj/52N7B6KCDedDF+vFknsFiCD8OKlPj7gZeA24GL
gUHAecC3IuI9/7Q6JpbjiyetRpA2qvvkLUxZS5iceSakp8O8UNE2i8USFfLy4J13Env0mIeIGBhV
/U1V71TVj1R1gaq+Alzk1D/QJ3tEfHuWwpGZmRl23u7d4S1fR2QSURhdJDNWDwXEky4WLoSyZc1e
TYlOiWhVrKq/isgXwLleyVsAf+HjdOdvsFkYW7zy7gm3bFZWFhkZGQCkpaXRqFGj/IfJ0y2250ee
d+2ayZlnQqdO2ZQu7b489tyep9L5u+9m0q0bzJ0bm/Y8/+fk5BBxVDXsA7gVE6SvE2b+T4HFXuf9
gVyggk++pzFGo3iQupo6bbf1Sb/CSW/mp4xaDHPmzClU/ksvVZ04MTqyuE1hdZGsWD0UEC+62LdP
tXJl1Z9/dk8G571ZKNsQ6IhaCMmZjNkc+MYr+R2M26yrV77SwDXARFU9HKg+Vf0SM8S5u8+lbsBP
qrowQqJbSH43mcUSj3zyCZxzDtSpEzpvIhDWWmQicq3z7yXA/wE9gT+BP1R1nog8CxwGFgF/Aadg
eitlgDNV9TevusYC1zvXNzh1XQC0UNUVXvnWATmqeqlXWnfgDWAUMB1oDdwD3Kyqb/iRW8O5P8vR
7NpltlRetw6qVHFbGoslNWjb1myf0cPFqeORnAcTroHxHrSqFATqs1W1lYjcBNyJmfV/PLARM+t/
kKpu8qlLMIH/azAjv74GHlTV5T75NgAbVLWVT3on4F6gIbAKGKmqfjf9tQbm2Lj+emjeHHr2dFsS
iyX52bIFTj/dLBFTtqx7csTcwCQq1sAUkJ2dnR/cC5dPP4XBg+Grr6Ijk1sURRfJiNVDAfGgi6FD
YdUqGBdwLZTYYFdTtsSE1q3h55/hhx/clsRiSW5U4Y034MYbQ+dNJGwPxhKUfv1ABJ5+2m1JLJbk
5dtvzaZi69e7P3vf9mAsMeOmm8xoskOH3JbEYkle3ngDbrjBfeMSaZLsdiyB8J5UVRhOO80MmUym
nS6Lqotkw+qhADd1kZtrlua/4QbXRIga1sBYQnLTTfDaa25LYbEkJ59+CqeeCg0auC1J5LExGEtI
tm+HjAzjH05PD5ndYrEUgg4d4Kqr4JZb3JbEYGMwlpiSlma2bX3nHbclsViSiz//hDlz4Lrr3JYk
OlgDkyIcq485mdxkNvZgsHoowC1dTJhgei8VKrjSfNSxBsYSFq1amV9by5eHzmuxWEKjCq++CllZ
bksSPWwMxhI2jzwCu3ebfcItFsux8c03cO218TH3xRu7VEyYWAMTWdavh6ZNzVpJpUq5LY3Fktjc
eSfUrAkDBrgtyZHYIL+l0ETCx9yggZkXM3XqscvjJjb2YLB6KCDWuti7F957L7ndY2ANjKWQZGUl
T7DfYnGLSZOMN6BWLbcliS7WRWYpFLt3m5n9339vuvcWi6XwXHQR9Olj5sDEG9ZFZnGNcuWgUyfb
i7FYisrq1bBmjRmenOxYA5MiRNLHfPvt8MorkJcXOm88YmMPBquHAmKpi3HjzLpjJUvGrEnXsAbG
UmgaNzZLxnz+uduSWCyJxcGDZuXkeFkWJtrYGIylSLz0kllh+YMP3JbEYkkc/vc/M49s3jy3JQmM
nQcTJtbARI+dO6FuXbPbZbVqbktjsSQGbdtC587xvTS/DfJbCk2kfcwVKpgd+F5/PaLVxgQbezBY
PRQQC138+it8+aWZvZ8qWANjKTK33w5jxyZusN9iiSWvv256L2XKuC1J7LAuMkuRUYVzzoFnn4VL
LnFbGoslfjl8GOrXNzGYxo3dliY41kVmiQtE4Lbb4OWX3ZbEYolvPv3UxCrj3bhEGmtgUoRo+Zi7
dTOjybZujUr1UcHGHgxWDwVEWxdjxpjFLVONkAZGRGqJyCgR+VJE9opInojU8ZOvtIiMEJHVIvKb
iHwYIJ+IyCAR+V5EtonINBE5O1yBRaSTiCwQke3O3y7hlrVEnrQ0uPpqM7bfYrEczYYNsGiRWQEj
1QgZgxGRTOBdYAlQAmgNZKjqRp98nwGNgQeB7UA/oCZwnqr+7pXvJaCHk+8n4C7gAqC5qq4MIUs3
4E1gNDANuBy4G8hS1bf85LcxmBiwcKFZBPPHH+NrXwuLJR546CHYty9x9lGK6TwY8XpLi8itwMv4
GBgRaQHMBa5U1c+ctMrABuA5VX3MSasLrAd6qeoYJ600sBKYr6o3BZMDWAN8o6pdvNLHA02Ak32t
iTUwscET7H/mGbjsMrelsVjih9xcszjs3LlwyiluSxMeMQ3yh/mG7gb84TEuTrm/ML2M7l75ugJ5
wASvfAeASUBnESkepI0mQAPAt6fyFlAfaBqGnClLNH3MItCzJzz/fNSaiCg29mCweiggWrr48EM4
/fTEMS6RJlIOjfrAKj/pK4G6Pvl+VdUdfvIdBwSbE17f+fu9n7IA9cIT1RINunWD+fNh48bQeS2W
VCFVg/seImVgqgPb/KRvA0qIyAlh5AOoEaIN77yFKZvyZGZmRrX+smWhRw/zhYp3oq2LRMHqoYBo
6GLVKrMsf/v2Ea86YYiUgSlMoCMivj1L/HHnnfDqq3DggNuSWCzuM2aMWTU5FZblD0SJCNWzBaji
Jz0dOKSqW73ynREgH8DmEG148u4Jt2xWVhYZGRkApKWl0ahRo/xfKx6/ayqce/uYo9Xeli3Z1KoF
77+fSffu8XX/3ueetHiRx63z4cOHp+z3wfc80t+PPXvg9dezGTsWwP37C3bu+T8nJ4eIo6phH8Ct
mCB9HZ/0McBvfvK/B6zxOu8P5AIVfPI9jTEaxYO03dRpu61P+hVOejM/ZdRimDNnTkza+d//VJs2
jUlTRSZWuoh3rB4KiLQuxo5VbdcuolXGDOe9WSjbEOgo1FpkYQxTvkJVpztplYEc4Fk9epjyXar6
kpMW1jBlJ+9aYImqdvVKexu4QFVP8pNfC3N/lmPn0CGz5tLHH5uhyxZLqqEKZ59t1uhLxGH7kRym
HJaLTEQ8C0yf6/y9UkT+xAxNnqeq80VkJvCmiPSnYKLlTuAlTz2q+rOIvAY85xiWDUBPjJvrWZ82
1wE5qnqpV/JjwBsi8jswHTPpsytwc2Fu2hI9SpSAO+4wQ5ZfecVtaSyW2DN3rvmhdemlofMmO+EG
+Sc6x/9hAvovOOeDvPJchXGJ9QdexMREmqnqbz513Q48A9wGvO6kZarqCp98xX3lU9W3MQblfMxc
miZAN1W1C5WEwNvfGm1uvdXsdPn33zFrslDEUhfxjNVDAZHUxciRcPfdZn5YqhNWD0ZVw5mQmQvc
E0Y+xRimQSHy+Z3XoqoeY2eJU048Ea68El57Df79b7elsVhix88/mx7Mm2+6LUl8YPeDsUSFhQvN
trCrV0PxYOszWCxJxAMPGPfYs8+Gzhuv2P1gLHFP06ZQqRJMneq2JBZLbNi7F8aNg7vucluS+MEa
mBQh1v52EejTB4YPj2mzYWFjDwarhwIioYvx46FZMzOK0mKwBsYSNa691iyVsWyZ25JYLNFF1QT3
7wkZhU4tbAzGElWefNIYmddec1sSiyV6zJkDvXrBihWJP3ospvvBJDLWwLjPtm1w0klmM7KqVd2W
xmKJDh06QJs2Zg5YomOD/JZC45a/PT3dbBX74ouuNO8XG3swWD0UcCy6+Okns1VFjx6RkydZsAbG
EnXuvdesLLt/v9uSWCyRZ/hwuO02s2WF5Uisi8wSEy6/HDp3hpuCrjZnsSQWf/1lXMArVkCNJNmR
yrrILAmHZ8iytfeWZOKll+Bf/0oe4xJprIFJEdz2t7duDQcPmtE2buO2LuIFq4cCiqKLAwdg1Ci4
777Iy5MsWANjiQki0Lt3Yi+hYbF48847cNZZcOaZbksSv9gYjCVm7N8P9erBjBn2S2lJbFTNMzxs
WGLu+RIMG4OxJCTHHWdmOg8d6rYkFsuxMX26WcTV7vkSHGtgUoR48bffcQdMngwbN4bOGy3iRRdu
Y/VQQGF18eyzJvaS6LP2o401MJaYUqmSGaocj4tgWizhsGwZ/PADdOnitiTxj43BWGLOr7+a4Oi6
dVC5stvSWCyFo0cPOOMMs/dLMmLXIgsTa2Dil6wsOPlkePhhtyWxWMJnwwY4/3xYvx4qVnRbmuhg
g/yWQhNv/va+fc0cgn37Yt92vOnCLaweCghXF888A7ffnrzGJdJYA2NxhYYNzS/BN95wWxKLJTy2
bIF33zXzuSzhYV1kFtf44gvjKlu92gz5tFjimX79zFyukSPdliS62BhMmFgDE9+oQvPmZm5M585u
S2OxBMazqOWyZVCnjtvSRBcbg7EUmnj0t4uYIP9//gN5ebFrNx514QZWDwWE0sXo0dC+ffIbl0gT
EQMjIpkikufn+MsnX2kRGSEiq0XkNxH5UETC/shE5C4RWSIif4vIbBG5JBLyW9zjiiugdGn4+GO3
JbFY/LN7txmQkqzDkqNJRFxkIpIJzAbuBhZ7XTqkqt965fsMaAw8CGwH+gE1gfNU9fcQbfQHHgcG
A18D3YFrgStVdXaAMtZFlgB8/DE89hh8842dGW2JP557Dr76CiZOdFuS2BB3MRgvA3NpkJd9C2Au
xiB85qRVBjYAz6nqY0HqLwtsBl5U1QedNAHmYYzYxQHKWQOTAKhCo0bwxBPQtq3b0lgsBRw4APXr
w5QpcM45bksTG+I5BhNMqG7AHx7jAqCqfwHTML2RYLQDygNveZVVYDzQUkTsdj8hiGd/uwgMGACD
B8dmQ7J41kUssXooIJAuXn/drDqRKsYl0kTawIwXkVwR2SAir4jICV7X6gOr/JRZCdQNUW99IE9V
V/opC1CvaOJa4oVrroFdu+Dzz92WxGIxHDgAQ4bAwIFuS5K4RMrAbAeGArcAlwDDMb2Or0WknJOn
OrDNT9ltQAkfY+RLdacNf2UBbA8mBJmZmW6LEJRixcyIsscfj34vJt51ESusHgrwp4vXXjMTgi+4
IPbyJAsRMTCqukxV+6nqVFWdr6ojgMuBWsA9kWjDkvx07gy//QZz57otiSXVOXDAxAQHDXJbksSm
RLQqVtWlIrIGM2oMYAtQxU/WdEygfmuQ6rYAaQHKghkA4JesrCwyMjIASEtLo1GjRvm/Vjx+11Q4
9/Yxx4M8/s6/+CKbjh1h8OBMMjOj154nze37dft8+PDhKft98D33fTZefRWqV8921spzX75onnv+
z8nJIeKoatQOTMzlfef/l4Df/OR5D1gTop6uQB7Q0Cf9Tie9ZoByajHMmTPHbRHCIjdXtX591WiK
myi6iDZWDwV462LfPtVatVQXLXJPHjdx3psRsQFRWypGRM4DvgIGqOpTXsOUr1DV6U6eykAO8KyG
N0z5BVXt76SJU99htcOUk4q33oKXXoL58+28GEvsef55mDbNDE1OReJxHszbwDpgGbATOAfojwnC
N1LVfU6+GcDZzjXPRMtamImWv3nVdwh4XVVv9Up7GHjMOb7B9GquA9qq6qwAclkDk4AcPgxnnmkm
uF1+udvSWFKJ/fvNmmP/+59Z7TsVicd5MCuADsDrwGTgJuANoInHuDhchXGJ9QdexPRKmnkbFy+5
jpBNVYcAvYGrgXcwhimgcbEcibe/Nd4pXtzMiRkwIDojyhJJF9HE6qEAjy7GjjVzXlLVuESaiAT5
VfUp4Kkw8uUSxqgyVfVr+FR1NDC60AJaEo6OHc0chI8+gg4d3JbGkgrs2QNPPgmTJ7stSfJgl+u3
xC1Tp5oFBpcvt/vFWKLPk0/C0qWps+ZYIOLRRWaxRJwrr4Ty5eG999yWxJKszJs6lQFt2vDwhZlM
GdiG9pdMdVukpMIamBQhEf3tImavmIED4dChyNWbiLqIBqmuh3lTpzL93nv5z4wZXLZwLgsOzmDl
M/cyb6o1MpHCGhhLXHPJJVC7Nowb57YklmRjxsiRDFm//oi0IevX8/moUS5JlHxYA5MieGbvJiJP
P232i9mzJzL1JbIuIkmq66HEgQP5/2d6pRffvz/msiQr1sBY4p7zz4eLLjLzYiyWSHGodGm/6YeP
Oy7GkiQv1sCkCInubx8yBIYPh9+D7nsaHomui0iR6npofc893FK2AQDZTtpDDRpw2d13uyZTshG1
xS4tlkhSvz7ccIOZgPn8825LY0kGjj+xLbNKQ/+mo9iy9TdmVavG5XffzUV2W9WIYefBWBKGbdvg
lFNgwQLz12IpKqrQogXcfLM5LAXYeTCWlCQ9Hfr2hYceclsSS6LzwQdm0MiNN7otSXJjDUyKkCz+
9nvugcWLYeHCoteRLLo4VlJVDwcOQL9+8OyzBStEpKouoo01MJaE4vjjzeTLf/8b8vLclsaSiIwc
aVbrbtXKbUmSHxuDsSQceXnQtCncdZcJ/Fss4bJ1K5x+uonj/eMfbksTn8TdfjDxijUwycuiRWbF
5R9/NOuVWSzh0LMnlCplhrxb/GOD/JZCk2w+5iZN4NJL4YknCl822XRRVFJND6tWwfvvw6OPHn0t
1XQRK6yBsSQsTz1lNohat85tSSzxjqoZIDJgAFSu7LY0qYN1kVkSmqeegi+/hI8/dlsSSzzz/vvw
+OPw7bdQwk4vD4qNwYSJNTDJz4ED0LAhvPACtG7ttjSWeGT3bhPYf/tts6adJTg2BmMpNMnqYy5d
2iyCee+9kJsbXplk1UVhSRU9DBkCLVsGNy6pootYYw2MJeFp186sVWZXW7b4sno1vPIK/Pe/bkuS
mlgXmSUp2LDBLOu/eDHUq+e2NJZ4QBXatIErroA+fdyWJnGwLjKLxYd69eD++83kS/ubwgJmvbHN
m6FXL7clSV2sgUkRUsHHfN99sHGjebEEIxV0EQ7JrIft26F3b3jxRShZMnT+ZNaFm1gDY0kaSpaE
MWPMi2XnTrelsbjJgw/CVVeZJfkt7hHzGIyIpAEjMNtgC2YzuXtUdXsYZQUYCFwD1AC+Bh5U1eUB
8tsYTApy661QtiyMGOG2JBY3+OIL6NwZVq6EtDS3pUk8EnYejIiUxhiF44FBTvJAIBc4T1UPhCj/
EtADeBD4CbgLuABorqor/eS3BiYF2bbNzI2ZMgXOO89taSyx5MABaNTIrLh9zTVuS5OYJHKQvxNw
JvAvVX1HVd8B2gGnA12CFRSRusAtwL9VdaSqTgHaA9uA+6MrduKTSj7m9HQzZPmmm/zPjUklXQQj
GfXw5JNmt9OOHQtXLhl1EQ/E2sB0A75R1R89Caq6BlgMdA9RtiuQB0zwKnsAmAR0FpHikRfXkqh0
7WrmxvznP25LYokVq1bB88/D6NEgEfn9bTlWYu0iWwN8oao3+6S/CrRU1ZOClH0ZuFRV6/uk9wDe
AGqr6iafa9ZFlsJs2QJnnw3Tp8M557gtjSWaHDoEF15otkDu2dNtaRKbRHaRVcO4tHzZBlQPUbZ6
kLJggv4WSz7Vq8PQoYFdZZbk4b//hQoV4I473JbE4k2iDVO2Hd8ikqo+5h49oFYt45v3kKq68CVZ
9PDddzBsGLz6KhQr4hstWXQRb8R64eotQLqf9HRgcxhlzwhQlkDls7KyyMjIACAtLY1GjRqRmZkJ
FDxU9jy5z196KZNzzoG9255k85cfUvzgQWZWrcoJmZmc3bSp6/K5db5s2bK4kqco5wcPQt++mTzz
DPz0UzY//RRf8iXCuef/nJwcIk2sYzCfAemqer5P+iJgh6oGXHBdRPoDjwFVVHWnV/rTQC+ggqoe
9iljYzAWAAbdN5X1o+7lrYPr89MebtCANiNGcFHbti5KZjkWHnkEli2DTz6xgf1IkcgxmPHAuSJy
iidBRP4BnOdcC8Y7GHm7epUtjZl0OdHXuFgs3hxcMfII4wIwZP16Ph81yiWJLMfK4sXw8svmsMYl
Pom1gZkIrAAmi8j1InI9MBn4AXjXk0lE6orIIRF5xJOmqj8DrwHPicg9ItIO+AjjIns2ljeRiHh3
h1ORkgcK5vBme6UX378/5rLEC4n8TOzaBddfb4YkVw81PCgMElkX8UxMYzCqekBELsIsFfMUJmg/
B7jXZxa/YIyf7++S24FNwG0ULBWTqaoroi27JbE5VLq03/TDxx0XY0kskaBXL8jMhOuuc1sSSzDs
fjCWlGDe1KlMv/dehqwvcJP1b9CAK2wMJuF4+22zS+WSJWbNOUtkiWQMJtajyCwWV/AYkUdGjUL2
7mfBsuM497K7rXFJMNatM5uHzZxpjUsiYHswKUJ2dnb+8MRUJzs7m1q1MmnWDKZONTthpiKJ9kzk
5hbM1o/0JmKJpotoksijyCyWuOCkk8zeMZ06wV9/uS2NJRwefNAE9O+6y21JLOFiezCWlKZPH+N2
+fjjos8Ct0SfiRONgVmyBCpXdlua5CZh94OJNdbAWEKRmwstW0L79vDAA25LY/HHqlXmM5oxwy5a
GpfjE+gAAAx7SURBVAusi8xSaOw4/wK8dVGqlPl1PGwYpJqKEuGZ2LnT7O0ydGh0jUsi6CIRsQbG
kvLUrm2GvnbpAhs2uC2NxYOqWQn74otNYN+SeFgXmcXiMHIkvPIKLFwI5cq5LY3l8cfNKL+5cyHA
PFlLFLAxmDCxBsZSGFThttvMqLJJk2zQ300mToS+fWHRIqhWzW1pUgsbg7EUGutjLiCQLkTMlrt/
/AGPPRZbmdwgXp+Jr782Q5E/+SR2xiVedZHo2Jn8FosXpUvDBx9AkyZmrkyPHm5LlFr88osJ6r/6
qtnu2pLYWBeZxeKHVatMcPntt+Gyy9yWJjXYscMMR+7eHe6/321pUhcbgwkTa2Asx8L8+XDNNWb+
RaNGbkuT3OzfD1dcAaefbpbgt/u7uIeNwVgKjfUxFxCuLlq0gBdegKuugp9/jq5MbhAvz8Thw9Ct
G5xwghnJ54ZxiRddJBs2BmOxBOHaa2HTJmjdGubNg6pV3ZYouVA1Af0dO8yQ5OLF3ZbIEkmsi8xi
CYPHHjNDl+fMgSpV3JYmOVCFAQNg+nSj1/Ll3ZbIAnY/GIsl5jz6KOzbZ3oys2dDWprbEiU+jz1m
hiLPnm2NS7JiYzApgvUxF1AUXYjAk0+auMzll5s94RMdN58JT49w1iwTe3Eb+/2IDtbAWCxhIgLD
h5sRZa1bw99/uy1RYjJ4sJmpP3s2nHii29JYoomNwVgshUQV/v1v84KcMcMG/sNFFR55BD780MRc
rN7iEztM2WJxERF47jno0AEuusjMPrcE5/BhuPNOE9CfO9cal1TBGpgUwfqYC4iELkRg0CC4/XYT
l/nhh2OuMubE6pk4cMBshbB2ren1xUPMxRf7/YgO1sBYLMfAffeZgHVmpnH7WI7kr7/MDP28PPj0
UztaLNWISAxGRAYBj/q59JGqdvTJWxsYDjQDdgOfAfer6oEw2ikN/Be4HKgILAR6q+rGAPltDMYS
E2bPhq5d4b//tZtjeVi92qyC0L49PPWUnUSZKMTzPJgLgcNe5395XxSRE4EFwBbgLqAS8ARwKhDO
koIfA42BB4HtQD9ggYicp6q/H7P0FksRadXKbLnctq1ZKHPIECiRwrPMZs40y7888QTccovb0ljc
ItIuskWq+rXXsc7n+v8BacCVqvqhqr4KdAcuEZGWwSoWkRZAa+AGVR2nqh8CVwIVgDsifB9Jh/Ux
FxAtXZx2mtnLZOlSM4z5jz+i0kzEiIYe8vJMb6V7dzMUOVGMi/1+RIdIG5hQ3apuwHRV3eaVNgv4
DWNoQpX9Q1U/8ySo6l/AtDDKWiwxoUoVmDYNLrwQzj0XvvzSbYlix7Zt0K4dTJ4MixebpfctqU2k
DcwvIrJfRFaKyEMiUtLnegbwvXeCquYBq4B6Iequ7+TzZSVQt4jypgyZmZluixA3RFsXxYub/eRf
fNHEHwYNgoMHo9pkkYikHubNg8aNzXL72dlQu3bEqo4J9vsRHSJlYNYCDwA3AG2BqcBAYIIng4ik
A6WAbX7K/wXUCNFG9QBltwElRCQOBz9aUpmrrjLusq++Mj2a1avdlijy7N0LvXubAQ4vvADPPAMl
fX9WWlKWQhsYESnhfQCo6nhVfUZVZ6rqLFXtB/QFOopIszCrDjXcyw4HOwasj7mAWOqiRg3jMsvK
gubN4emnITc3Zs0H5Vj18MUXZtmcrVvhu+/MAIdExX4/okOhxrmISCYw2ytJgUCDD9/FDEduDCxU
1W0ikguk+8mbDmwO0fwWwN9C6enAIVXd6q9QVlYWGRkZAKSlpdGoUaP87rDnoUqF82XLluEhHuRx
83zZsmVkZmbGtP2ePSEtLZsRI+DNNzN54QVQdVcfkyZNKlL5U07J5IEHYNq0bHr1goED3ZHffj8i
c+75Pycnh4ijqmEfQDmMwcg/guQ9EcgD7vJK+xF43yefYIzHyyHaHgP85if9PWBNgDJqMQwcONBt
EeIGN3WRl6c6aZJqrVqqXbqorl3rmiiF1sO+farPPKOanq76wAOqO3dGRy43sN+PApz3ZqFsQ6Cj
UC4yVd2tqt96H0Gyd3P+fuOVNh5o48RjPFwCVHWuBWM8cKKItPEkiEhl4IowyloscYEIXHONWVqm
YUO44AK44w7YHKr/7iK5uTBmDJx8MsyfDwsXmqHIdla+JRQRCfKLyDcicreIXC4iV4jIc8DTwARV
/cor68vADuBTEekoIrdgjMMcVZ3rVV9LETkkIj08aao6H5gJvCkiN4tIR+BTYCfwUiTuI5mJSvc3
QYkHXZQrZ3ZzXL3avKgbNoTbbovtmmah9LBzJwwbBv/4B3z0EXzwAXz8sTlPNuLhmUhKItENwowW
WwfsAf4GvgZ6AcX85K0NfICZ+7IOGA2U9smTiVkR4Aaf9FLASMyotd+BD4E6QeRSe9jDHvawR+GO
SLnIkno/GIvFYrG4h11N2WKxWCxRwRoYi8VisUSFhDQwIlJMRPqJyFwR+V1EdjoDDW4WkbCWmRaR
NBF5Q0R+FpGNIvKmiKRFW/ZoICLNReR1EVnhDI7YUMjyCa+LY7kHMfx/e2cXYlUVxfHf34jJykiK
sgwVC5vQkjD6wBITxHoIJzTCynyJ8inoJQhqMJSegh6KDIyiqKCQjBKGSETtQfp6yaxJkIksFKLE
EqVoXD3sPXo63I8z98yZO2ff9YPDvbPPXpe9/rPv2efcs85amyQdkPS7pCFJi6secxVIukbSy5L2
Szol6YykOQVtk9EBQNJaSR/F+XBK0rCkFyRdXMA2NS1WSdot6WhM53VE0vuS+gvYdqxFLRcY4EJC
KpofgKeA9YQb/68Dz7YzVqgrsxe4A3iGkP7/NuDzuK9urADuJOR5+55wo64QKWgxAT68Rij9sA3Y
ENv2SFpYwXCr5jrgAUIKpX3jtE1JBwjZRKYBm4EB4FNCmZAPC5yIpqbFTOArgv/3AluBJcBeSe3S
dHWuxURFC0zmRpg0lzVo3wP8VcB+PeEh0P5M2wJC5NqGbvvXgR7KvH8HGBmHbe21KOMDIVHqv8DG
TFsfIcLxzW77VnIuPBZ1aRppmaoOcfxXNGjbFDW5tZe0aOLnPVGLx6vSopZXMGZ2xv6f8n+MncBF
ap/48mHgGzMbznzmIcIKX7vU/xb/6x2SghZlfFhH+JKdTcxqobrqduBBSbWqw1hiLiSlA4CZNarI
szO+zm1hmpwWTfg1vv7Zok8pLWq5wLRgKfCbNclLlmE+ubIBkYO0LxuQGiloUcaH+cAvZnaige0F
wKzyw6sFvaLD0vj6XYs+yWoh6TxJ0yWtAF4CfgI+bmFSSotkFhhJA8BqYEuB7rNonvr/qokcVw1I
QYsyPrQqAwHty0ikQvI6SJoLPA/sMLNWORNS1uILwgPxuwiJgm8ys1Mt+pfSohYLjBqUCMjtXwi8
QaiO+cqkD3ASaaeF0xGFIg97gGR1kDSDkEHkJOFGd1uTakfUNR4hXMUNAucTAmHanYR1rMWUX2AU
SgT8k9n+zu2/FvgMOAzcX/A36KN0Xjaga7TTokNqqUWOMj60sqWAfSokq4Ok6cAnhIq6q8zsWBuT
ZLUws2Ez229mWwgLzTzOJSZuRCkt6nAG/DVwS6MdkmYTLvWOEybOyYKfOQLc2KB9Udw3VWmqRY7x
3OitqxZZyvgwAsyWdImZZW92LgJOE3Lm9QJJ6qBQtn07cDOw0swOFjBLUos8ZnZC0mHgLuDFJt1K
aTHlr2CsSYmAGCm2ixDhsNLM/hjHx74LLJF0/ViDpAWEg/eUTf3fTIuS1FKLHGV8eI/wPViXse0D
1gAfmNnoxA93SpKcDpKmEcL2lwMDZvZlQdPktGiEpCuBfuBQi27ltOh2LHaH8dvTCXVmTkfHb89t
MzJ9HyXEcS/LxXF/G4V9KG4/EiJL+ibbnwnQ43Jgbdz2ETJNr4l/35C6FkV94FxM/3M5+22EG59P
AvcBQ4Sr4kXd9q1DPcbmwlbCCdjG+PeyHtPh1ej/5gbHiNk9psUOwkPoq4G7gScIBSCPAVdXpUXX
He9QrHlx4ozG1+w2mjuAbsi3xfZLgbeAn4EjwNvAzG771qEey3P+j2beD/aCFkV8yMybwVy7CA/g
HSBExwwBi7vtUwkt8t+Hsfe7e0yHkSbHiLO+95AWTxN+Yj8eF4thwgnInEyfCdfC0/U7juM4lTDl
78E4juM49cQXGMdxHKcSfIFxHMdxKsEXGMdxHKcSfIFxHMdxKsEXGMdxHKcSfIFxHMdxKsEXGMdx
HKcSfIFxHMdxKuE/GP+kb/s2ABgAAAAASUVORK5CYII=
">
</div>
</div>
<div class="hbox output_area"><div class="prompt"></div>
<div class="box-flex1 output_subarea output_stream output_stdout">
<pre>
The Solution is :
c = [ -5. -130.33333333 75.66666667]
y = [ 201. -5. 37.]
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="text_cell_render border-box-sizing rendered_html">
<h2 id="generalizing-the-functions-for-varying-orders-of-polynomial-interpolation">Generalizing the functions for varying orders of polynomial interpolation</h2>
<p>As it is seen in the plots the result is correct for these three inputs. Finally, a generalized solution is written where higher order systems can be solved. For doing so Python has the ability of using a list comprehension which is quite useful for producing vectors on the fly.</p>
</div>
<div class="cell border-box-sizing code_cell vbox">
<div class="input hbox">
<div class="prompt input_prompt">
In [98]:
</div>
<div class="input_area box-flex1">
<div class="highlight-ipynb"><pre class="ipynb"><span class="k">def</span> <span class="nf">poly_interp</span><span class="p">(</span><span class="n">xi_multi</span><span class="p">,</span><span class="n">yi_multi</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> General polynomial interpolation. </span>
<span class="sd"> Compute the coefficients of the polynomial</span>
<span class="sd"> interpolating the points (xi[i],yi[i]) for i = 0,1,2,...,n-1</span>
<span class="sd"> where n = len(xi) = len(yi).</span>
<span class="sd"> Returns c, an array containing the coefficients of</span>
<span class="sd"> p(x) = c[0] + c[1]*x + c[2]*x**2 + ... + c[N-1]*x**(N-1).</span>
<span class="sd"> """</span>
<span class="c"># check inputs and print error message if not valid:</span>
<span class="n">error_message</span> <span class="o">=</span> <span class="s">"xi and yi should have type numpy.ndarray"</span>
<span class="k">assert</span> <span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">xi_multi</span><span class="p">)</span> <span class="ow">is</span> <span class="n">np</span><span class="o">.</span><span class="n">ndarray</span><span class="p">)</span> <span class="ow">and</span> <span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">yi_multi</span><span class="p">)</span> <span class="ow">is</span> <span class="n">np</span><span class="o">.</span><span class="n">ndarray</span><span class="p">),</span> <span class="n">error_message</span>
<span class="n">error_message</span> <span class="o">=</span> <span class="s">"xi and yi should have the same length "</span>
<span class="k">assert</span> <span class="nb">len</span><span class="p">(</span><span class="n">xi_multi</span><span class="p">)</span><span class="o">==</span><span class="nb">len</span><span class="p">(</span><span class="n">yi_multi</span><span class="p">),</span> <span class="n">error_message</span>
<span class="c"># The linear system to interpolate through data points:</span>
<span class="c"># Uses a list comprehension</span>
<span class="n">n</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">xi_multi</span><span class="p">)</span>
<span class="n">A</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">vstack</span><span class="p">([</span><span class="n">xi_multi</span><span class="o">**</span><span class="n">j</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">)])</span><span class="o">.</span><span class="n">T</span>
<span class="n">c</span> <span class="o">=</span> <span class="n">solve</span><span class="p">(</span><span class="n">A</span><span class="p">,</span><span class="n">yi_multi</span><span class="p">)</span>
<span class="k">return</span> <span class="n">c</span>
</pre></div>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell vbox">
<div class="input hbox">
<div class="prompt input_prompt">
In [99]:
</div>
<div class="input_area box-flex1">
<div class="highlight-ipynb"><pre class="ipynb"><span class="k">def</span> <span class="nf">plot_poly</span><span class="p">(</span><span class="n">xi_multi</span><span class="p">,</span> <span class="n">yi_multi</span><span class="p">,</span> <span class="n">c</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Plot the resulting function along with the data points.</span>
<span class="sd"> """</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linspace</span><span class="p">(</span><span class="n">xi_multi</span><span class="o">.</span><span class="n">min</span><span class="p">()</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">xi_multi</span><span class="o">.</span><span class="n">max</span><span class="p">()</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1000</span><span class="p">)</span>
<span class="c"># Using Horner's rule for defining interpolating polynomial:</span>
<span class="n">n</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">xi_multi</span><span class="p">)</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">c</span><span class="p">[</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">):</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">y</span><span class="o">*</span><span class="n">x</span> <span class="o">+</span> <span class="n">c</span><span class="p">[</span><span class="n">j</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="c">## Plotting</span>
<span class="n">plt</span><span class="o">.</span><span class="n">figure</span><span class="p">()</span>
<span class="n">plt</span><span class="o">.</span><span class="n">clf</span><span class="p">()</span>
<span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">,</span><span class="s">'b-'</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">xi_multi</span><span class="p">,</span><span class="n">yi_multi</span><span class="p">,</span><span class="s">'ro'</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">ylim</span><span class="p">(</span><span class="n">yi_multi</span><span class="o">.</span><span class="n">min</span><span class="p">()</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="n">yi_multi</span><span class="o">.</span><span class="n">max</span><span class="p">()</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s">"Data points and interpolating polynomial"</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">savefig</span><span class="p">(</span><span class="s">'poly.png'</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell vbox">
<div class="input hbox">
<div class="prompt input_prompt">
In [100]:
</div>
<div class="input_area box-flex1">
<div class="highlight-ipynb"><pre class="ipynb"><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">2</span><span class="p">):</span>
<span class="n">xi_multi</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="o">-</span><span class="mf">1.</span><span class="p">,</span> <span class="mf">0.</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="o">-</span><span class="mi">3</span><span class="p">,</span> <span class="o">-</span><span class="mi">23</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">8</span><span class="p">])</span>
<span class="n">yi_multi</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="mf">1.</span><span class="o">+</span><span class="mi">100</span><span class="o">*</span><span class="n">i</span><span class="p">,</span> <span class="o">-</span><span class="mf">1.</span><span class="o">-</span><span class="mi">3</span><span class="o">*</span><span class="n">i</span><span class="p">,</span> <span class="mf">7.</span><span class="o">+</span><span class="mi">34</span><span class="o">*</span><span class="n">i</span><span class="p">,</span> <span class="mi">3</span><span class="o">-</span><span class="mi">3</span><span class="o">*</span><span class="n">i</span><span class="p">,</span> <span class="o">-</span><span class="mi">34</span><span class="o">+</span><span class="mi">8</span><span class="o">*</span><span class="n">i</span><span class="p">,</span> <span class="o">-</span><span class="mi">5</span><span class="o">-</span><span class="mi">23</span><span class="o">*</span><span class="n">i</span><span class="p">,</span> <span class="o">-</span><span class="mi">56</span><span class="o">+</span><span class="mi">56</span><span class="o">*</span><span class="n">i</span><span class="p">])</span>
<span class="n">c</span> <span class="o">=</span> <span class="n">poly_interp</span><span class="p">(</span><span class="n">xi_multi</span><span class="p">,</span> <span class="n">yi_multi</span><span class="p">)</span>
<span class="n">plot_poly</span><span class="p">(</span><span class="n">xi_multi</span><span class="p">,</span> <span class="n">yi_multi</span><span class="p">,</span> <span class="n">c</span><span class="p">)</span>
</pre></div>
</div>
</div>
<div class="vbox output_wrapper">
<div class="output vbox">
<div class="hbox output_area"><div class="prompt"></div>
<div class="box-flex1 output_subarea output_display_data">
<img src="data:image/png;base64,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
HVOSFxGpY/8fBaI/trDf2hcAAAAASUVORK5CYII=
">
</div>
</div>
<div class="hbox output_area"><div class="prompt"></div>
<div class="box-flex1 output_subarea output_display_data">
<img src="data:image/png;base64,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
RK5CYII=
">
</div>
</div>
</div>
</div>
</div>
<div class="text_cell_render border-box-sizing rendered_html">
<p>This was a short note of how to solve equations and do some simple plotting.</p>
</div></p><script type= "text/javascript">
if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https:' == document.location.protocol
? 'https://c328740.ssl.cf1.rackcdn.com/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'
: 'http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML';
mathjaxscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'AMS' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: 'center'," +
" displayIndent: '0em'," +
" showMathMenu: true," +
" tex2jax: { " +
" inlineMath: [ ['$','$'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'black ! important'} }" +
" } " +
"}); ";
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>
Test of uploading posts2014-08-08T09:42:00-03:00junilydtag:junilyd.github.io,2014-08-08:blog/2014/08/08/test-of-uploading-posts/<p>
<div class="text_cell_render border-box-sizing rendered_html">
<p><em>Note: This Post is copied from</em> <a href="http://jakevdp.github.io/blog/2012/10/04/blogging-with-ipython/"><em>this blogger</em></a>, <em>and is the first test of this new web pages functionalty.</em></p>
</div>
<div class="text_cell_render border-box-sizing rendered_html">
<p>A few weeks ago, Fernando Perez, the creator of IPython, wrote a <a href="http://blog.fperez.org/2012/09/blogging-with-ipython-notebook.html">post</a> about blogging with IPython notebooks. I decided to take a stab at making this work in Octopress.</p>
<p>I started by following Fernando's outline: I first went to <a href="http://github.com/ipython/nbconvert">http://github.com/ipython/nbconvert</a> and obtained the current version of the notebook converter. Running <code>nbconvert.py -f blogger-html filename.ipynb</code> produces a separate html and header file with the notebook content. I inserted the stylesheet info into my header (in octopress, the default location is <code>source/_includes/custom/head.html</code>) and copied the html directly into my post.</p>
<p>I immediately encountered a problem. <code>nbconvert</code> uses global CSS classes and style markups, and some of these (notably the "hightlight" class and the <code><pre></code> tag formatting) conflict with styles defined in my octopress theme. The result was that every post in my blog ended up looking like an ugly hybrid of octopress and an ipython notebook. Not very nice.</p>
<p>So I did some surgery. Admittedly, this is a terrible hack, but the following code takes the files output by nbconvert, slices them up, and creates a specific set of CSS classes for the notebook markup, such that there's no longer a conflict with the native octopress styles (you can download this script <a href="http://jakevdp.github.com/downloads/code/convert_notebook.py">here</a>): </p>
</div>
<div class="cell border-box-sizing code_cell vbox">
<div class="input hbox">
<div class="prompt input_prompt">
In []:
</div>
<div class="input_area box-flex1">
<div class="highlight-ipynb"><pre class="ipynb"><span class="c">#!/usr/bin/python</span>
<span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">nbconvert</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="n">notebook</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span>
<span class="k">except</span><span class="p">:</span>
<span class="k">print</span> <span class="s">"usage: python octopress_notebook.py /path/to/nbconvert.py /path/to/notebook_file.ipynb"</span>
<span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
<span class="c"># convert notebook</span>
<span class="n">os</span><span class="o">.</span><span class="n">system</span><span class="p">(</span><span class="s">'</span><span class="si">%s</span><span class="s"> -f blogger-html </span><span class="si">%s</span><span class="s">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">nbconvert</span><span class="p">,</span> <span class="n">notebook</span><span class="p">))</span>
<span class="c"># get out filenames</span>
<span class="n">outfile_root</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">splitext</span><span class="p">(</span><span class="n">notebook</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">body_file</span> <span class="o">=</span> <span class="n">outfile_root</span> <span class="o">+</span> <span class="s">'.html'</span>
<span class="n">header_file</span> <span class="o">=</span> <span class="n">outfile_root</span> <span class="o">+</span> <span class="s">'_header.html'</span>
<span class="c"># read the files</span>
<span class="n">body</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">body_file</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
<span class="n">header</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">header_file</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
<span class="c"># replace the highlight tags</span>
<span class="n">body</span> <span class="o">=</span> <span class="n">body</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">'class="highlight"'</span><span class="p">,</span> <span class="s">'class="highlight-ipynb"'</span><span class="p">)</span>
<span class="n">header</span> <span class="o">=</span> <span class="n">header</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">'highlight'</span><span class="p">,</span> <span class="s">'highlight-ipynb'</span><span class="p">)</span>
<span class="c"># specify <pre> tags</span>
<span class="n">body</span> <span class="o">=</span> <span class="n">body</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">'<pre'</span><span class="p">,</span> <span class="s">'<pre class="ipynb"'</span><span class="p">)</span>
<span class="n">header</span> <span class="o">=</span> <span class="n">header</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">'html, body'</span><span class="p">,</span> <span class="s">'</span><span class="se">\n</span><span class="s">'</span><span class="o">.</span><span class="n">join</span><span class="p">((</span><span class="s">'pre.ipynb {'</span><span class="p">,</span>
<span class="s">' color: black;'</span><span class="p">,</span>
<span class="s">' background: #f7f7f7;'</span><span class="p">,</span>
<span class="s">' border: 0;'</span><span class="p">,</span>
<span class="s">' box-shadow: none;'</span><span class="p">,</span>
<span class="s">' margin-bottom: 0;'</span><span class="p">,</span>
<span class="s">' padding: 0;'</span>
<span class="s">'}</span><span class="se">\n</span><span class="s">'</span><span class="p">,</span>
<span class="s">'html, body'</span><span class="p">)))</span>
<span class="c"># create a special div for notebook</span>
<span class="n">body</span> <span class="o">=</span> <span class="s">'<div class="ipynb"></span><span class="se">\n\n</span><span class="s">'</span> <span class="o">+</span> <span class="n">body</span> <span class="o">+</span> <span class="s">"</span><span class="se">\n\n</span><span class="s"></div>"</span>
<span class="n">header</span> <span class="o">=</span> <span class="n">header</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">'body {'</span><span class="p">,</span> <span class="s">'div.ipynb {'</span><span class="p">)</span>
<span class="c"># specialize headers</span>
<span class="n">header</span> <span class="o">=</span> <span class="n">header</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">'html, body,'</span><span class="p">,</span>
<span class="s">'</span><span class="se">\n</span><span class="s">'</span><span class="o">.</span><span class="n">join</span><span class="p">(((</span><span class="s">'h1.ipynb h2.ipynb h3.ipynb '</span>
<span class="s">'h4.ipynb h5.ipynb h6.ipynb {'</span><span class="p">),</span>
<span class="s">'h1.ipynb h2.ipynb ... {'</span><span class="p">,</span>
<span class="s">' margin: 0;'</span><span class="p">,</span>
<span class="s">' padding: 0;'</span><span class="p">,</span>
<span class="s">' border: 0;'</span><span class="p">,</span>
<span class="s">' font-size: 100%;'</span><span class="p">,</span>
<span class="s">' font: inherit;'</span><span class="p">,</span>
<span class="s">' vertical-align: baseline;'</span><span class="p">,</span>
<span class="s">'}</span><span class="se">\n</span><span class="s">'</span><span class="p">,</span>
<span class="s">'html, body,'</span><span class="p">)))</span>
<span class="k">for</span> <span class="n">h</span> <span class="ow">in</span> <span class="s">'123456'</span><span class="p">:</span>
<span class="n">body</span> <span class="o">=</span> <span class="n">body</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">'<h</span><span class="si">%s</span><span class="s">'</span> <span class="o">%</span> <span class="n">h</span><span class="p">,</span> <span class="s">'<h</span><span class="si">%s</span><span class="s"> class="ipynb"'</span> <span class="o">%</span> <span class="n">h</span><span class="p">)</span>
<span class="c"># comment out document-level formatting</span>
<span class="n">header</span> <span class="o">=</span> <span class="n">header</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">'html, body,'</span><span class="p">,</span>
<span class="s">'/*html, body,*/'</span><span class="p">)</span>
<span class="n">header</span> <span class="o">=</span> <span class="n">header</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">'h1, h2, h3, h4, h5, h6,'</span><span class="p">,</span>
<span class="s">'/*h1, h2, h3, h4, h5, h6,*/'</span><span class="p">)</span>
<span class="c">#----------------------------------------------------------------------</span>
<span class="c"># Write the results to file</span>
<span class="nb">open</span><span class="p">(</span><span class="n">body_file</span><span class="p">,</span> <span class="s">'w'</span><span class="p">)</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">body</span><span class="p">)</span>
<span class="nb">open</span><span class="p">(</span><span class="n">header_file</span><span class="p">,</span> <span class="s">'w'</span><span class="p">)</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">header</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
<div class="text_cell_render border-box-sizing rendered_html">
<p>This code should be run with two arguments: first the file to be converted, then the path to <code>nbconvert.py</code>. Like the native <code>nbconvert.py</code> this produces a separate file of header code (which is inserted once into the master blog header) and body code which can be copied verbatim into the post.</p>
</div>
<div class="text_cell_render border-box-sizing rendered_html">
<h2 id="Trying-it-out">Trying it out<a class="anchor-link" href="#Trying-it-out">¶</a></h2>
</div>
<div class="text_cell_render border-box-sizing rendered_html">
<p>If you haven't noticed already, this post is written entirely in an IPython notebook. So let's see how some things look.</p>
</div>
<div class="text_cell_render border-box-sizing rendered_html">
<p>First of all, we can write some math, which is rendered using mathjax:</p>
<p><span class="math">\(f(x) = \int_0^\infty \left(\frac{\sin(x)}{x^2}\right)dx\)</span></p>
<p>As we see, it renders nicely.</p>
<p>Or we can do some inline plotting:</p>
</div>
<div class="cell border-box-sizing code_cell vbox">
<div class="input hbox">
<div class="prompt input_prompt">
In [1]:
</div>
<div class="input_area box-flex1">
<div class="highlight-ipynb"><pre class="ipynb"><span class="o">%</span><span class="k">pylab</span> <span class="n">inline</span>
</pre></div>
</div>
</div>
<div class="vbox output_wrapper">
<div class="output vbox">
<div class="hbox output_area"><div class="prompt"></div>
<div class="box-flex1 output_subarea output_stream output_stdout">
<pre>
Welcome to pylab, a matplotlib-based Python environment [backend: module://IPython.zmq.pylab.backend_inline].
For more information, type 'help(pylab)'.
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell vbox">
<div class="input hbox">
<div class="prompt input_prompt">
In [2]:
</div>
<div class="input_area box-flex1">
<div class="highlight-ipynb"><pre class="ipynb"><span class="kn">import</span> <span class="nn">numpy</span> <span class="kn">as</span> <span class="nn">np</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linspace</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
<span class="n">pylab</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">np</span><span class="o">.</span><span class="n">sin</span><span class="p">(</span><span class="n">x</span><span class="p">))</span>
</pre></div>
</div>
</div>
<div class="vbox output_wrapper">
<div class="output vbox">
<div class="hbox output_area"><div class="prompt output_prompt">
Out[2]:</div>
<div class="box-flex1 output_subarea output_pyout">
<pre>
[<matplotlib.lines.Line2D at 0x2cdba90>]
</pre>
</div>
</div>
<div class="hbox output_area"><div class="prompt"></div>
<div class="box-flex1 output_subarea output_display_data">
<img src="data:image/png;base64,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
oAAAAABJRU5ErkJggg==
">
</div>
</div>
</div>
</div>
</div>
<div class="text_cell_render border-box-sizing rendered_html">
<p>You can do pretty much anything else a notebook does as well. The IPython team did the hard part.</p>
</div>
<div class="text_cell_render border-box-sizing rendered_html">
<h2 id="Where-to-go-from-here?">Where to go from here?<a class="anchor-link" href="#Where-to-go-from-here?">¶</a></h2>
</div>
<div class="text_cell_render border-box-sizing rendered_html">
<p>There's clearly a cleaner way to do this. If the IPython team would be open to the idea, I think their HTML stylesheets should be modified so that notebooks can be embedded within any CSS framework with as few conflicts as possible. This means getting rid of all top-level formatting in the style-sheets, and removing potentially common class names like "highlight". Once this is done, <code>nbconvert.py</code> could output this directly, obviating the need for my unforgivable hack shown above.</p>
<p>Second, I'd love to build notebook support directly into octopress. If <code>nbconvert.py</code> is available on the user's system, it could be called directly from the Ruby script that generates Octopress HTML. I have about as much experience with Ruby as I do with Swahili (read: None) so this would take some work for me. I'd be happy to pass the baton to any Octopress gurus out there...</p>
<p>Either of those options will smooth out the notebook/blogging combo considerably, and give me the potential to prognosticate Python in perpetuum. By the way, the notebook used to generate this page can be downloaded <a href="http://jakevdp.github.com/downloads/notebooks/nb_in_octopress.ipynb">here</a>. Happy coding!</p>
</div></p>