add transformation function

This commit is contained in:
2019-11-04 15:40:58 +01:00
parent b7887db0ac
commit 92375a91e6
6 changed files with 123 additions and 4 deletions

View File

@@ -37,7 +37,7 @@
<span class="c1"># -*- coding: utf-8 -*-</span> <span class="c1"># -*- coding: utf-8 -*-</span>
<span class="sd">&quot;&quot;&quot;Mathematical equations.</span> <span class="sd">&quot;&quot;&quot;Mathematical equations.</span>
<span class="sd">:Date: 2019-11-02</span> <span class="sd">:Date: 2019-11-04</span>
<span class="sd">.. module:: function</span> <span class="sd">.. module:: function</span>
<span class="sd"> :platform: *nix, Windows</span> <span class="sd"> :platform: *nix, Windows</span>
@@ -48,6 +48,50 @@
<span class="kn">import</span> <span class="nn">math</span> <span class="kn">import</span> <span class="nn">math</span>
<span class="kn">from</span> <span class="nn">pylib.mathematics</span> <span class="k">import</span> <span class="n">lcm</span> <span class="kn">from</span> <span class="nn">pylib.mathematics</span> <span class="k">import</span> <span class="n">lcm</span>
<div class="viewcode-block" id="transformation"><a class="viewcode-back" href="../function.html#function.transformation">[docs]</a><span class="k">def</span> <span class="nf">transformation</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">scale_vertical</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">scale_horizontal</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
<span class="n">shift_horizontal</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">shift_vertical</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;Transform functions.</span>
<span class="sd"> :param f: function or list of functions</span>
<span class="sd"> :type f: function or list</span>
<span class="sd"> :param scale_vertical: &quot;a&quot; scale factor in vertical direction (default</span>
<span class="sd"> = 1)</span>
<span class="sd"> :type height: float</span>
<span class="sd"> :param scale_horizontal: &quot;b&quot; scale factor in horizontal direction</span>
<span class="sd"> (default = 1)</span>
<span class="sd"> :type height: float</span>
<span class="sd"> :param shift_horizontal: &quot;c&quot; shift factor in horizontal direction</span>
<span class="sd"> (default = 0)</span>
<span class="sd"> :type height: float</span>
<span class="sd"> :param shift_vertical: &quot;d&quot; shift factor in vertical direction (default</span>
<span class="sd"> = 0)</span>
<span class="sd"> :type height: float</span>
<span class="sd"> :returns: transformed function or list of transformed functions</span>
<span class="sd"> :rtype: function or list</span>
<span class="sd"> .. math::</span>
<span class="sd"> y = a \, f(b\,(x-c)) + d</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># shorter variables</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">scale_vertical</span>
<span class="n">b</span> <span class="o">=</span> <span class="n">scale_horizontal</span>
<span class="n">c</span> <span class="o">=</span> <span class="n">shift_horizontal</span>
<span class="n">d</span> <span class="o">=</span> <span class="n">shift_vertical</span>
<span class="c1"># check if f is a function than put it in a list and return only</span>
<span class="c1"># the function, not the one element list</span>
<span class="k">if</span> <span class="n">callable</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
<span class="k">return</span> <span class="n">function_transformation</span><span class="p">(</span>
<span class="p">[</span><span class="n">f</span><span class="p">],</span> <span class="n">scale_vertical</span><span class="o">=</span><span class="n">a</span><span class="p">,</span> <span class="n">scale_horizontal</span><span class="o">=</span><span class="n">b</span><span class="p">,</span> <span class="n">shift_horizontal</span><span class="o">=</span><span class="n">c</span><span class="p">,</span> <span class="n">shift_vertical</span><span class="o">=</span><span class="n">d</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
<span class="c1"># otherwise assume list of functions</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">f</span><span class="p">:</span> <span class="c1"># if f is empty. End of the recursive fucntion</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="k">return</span> <span class="p">[</span><span class="k">lambda</span> <span class="n">x</span><span class="p">,</span> <span class="n">t</span><span class="p">:</span> <span class="n">a</span><span class="o">*</span><span class="n">f</span><span class="p">[</span><span class="mi">0</span><span class="p">](</span><span class="n">b</span><span class="o">*</span><span class="p">(</span><span class="n">x</span><span class="o">-</span><span class="n">c</span><span class="p">),</span> <span class="n">t</span><span class="p">)</span><span class="o">+</span><span class="n">d</span><span class="p">]</span> <span class="o">+</span>\
<span class="n">function_transformation</span><span class="p">(</span>
<span class="n">f</span><span class="p">[</span><span class="mi">1</span><span class="p">:],</span> <span class="n">scale_vertical</span><span class="o">=</span><span class="n">a</span><span class="p">,</span> <span class="n">scale_horizontal</span><span class="o">=</span><span class="n">b</span><span class="p">,</span> <span class="n">shift_horizontal</span><span class="o">=</span><span class="n">c</span><span class="p">,</span> <span class="n">shift_vertical</span><span class="o">=</span><span class="n">d</span><span class="p">)</span></div>
<div class="viewcode-block" id="sine_wave"><a class="viewcode-back" href="../function.html#function.sine_wave">[docs]</a><span class="k">def</span> <span class="nf">sine_wave</span><span class="p">(</span><span class="n">A</span><span class="o">=</span><span class="mi">1</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">f</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">phi</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">D</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">degree</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span> <div class="viewcode-block" id="sine_wave"><a class="viewcode-back" href="../function.html#function.sine_wave">[docs]</a><span class="k">def</span> <span class="nf">sine_wave</span><span class="p">(</span><span class="n">A</span><span class="o">=</span><span class="mi">1</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">f</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">phi</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">D</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">degree</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;A sine wave or sinusoid is a mathematical curve that describes a</span> <span class="sa">r</span><span class="sd">&quot;&quot;&quot;A sine wave or sinusoid is a mathematical curve that describes a</span>
<span class="sd"> smooth periodic oscillation.</span> <span class="sd"> smooth periodic oscillation.</span>

View File

@@ -37,7 +37,7 @@
<p>Mathematical equations.</p> <p>Mathematical equations.</p>
<dl class="field-list simple"> <dl class="field-list simple">
<dt class="field-odd">Date</dt> <dt class="field-odd">Date</dt>
<dd class="field-odd"><p>2019-11-02</p> <dd class="field-odd"><p>2019-11-04</p>
</dd> </dd>
</dl> </dl>
<span class="target" id="module-function"></span><dl class="function"> <span class="target" id="module-function"></span><dl class="function">
@@ -232,6 +232,35 @@ linear speed.</p>
</div> </div>
</dd></dl> </dd></dl>
<dl class="function">
<dt id="function.transformation">
<code class="sig-name descname">transformation</code><span class="sig-paren">(</span><em class="sig-param">f</em>, <em class="sig-param">scale_vertical=1</em>, <em class="sig-param">scale_horizontal=1</em>, <em class="sig-param">shift_horizontal=0</em>, <em class="sig-param">shift_vertical=0</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/function.html#transformation"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#function.transformation" title="Permalink to this definition"></a></dt>
<dd><p>Transform functions.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>f</strong> (<em>function</em><em> or </em><em>list</em>) function or list of functions</p></li>
<li><p><strong>scale_vertical</strong> “a” scale factor in vertical direction (default
= 1)</p></li>
<li><p><strong>scale_horizontal</strong> “b” scale factor in horizontal direction
(default = 1)</p></li>
<li><p><strong>shift_horizontal</strong> “c” shift factor in horizontal direction
(default = 0)</p></li>
<li><p><strong>shift_vertical</strong> “d” shift factor in vertical direction (default
= 0)</p></li>
</ul>
</dd>
<dt class="field-even">Returns</dt>
<dd class="field-even"><p>transformed function or list of transformed functions</p>
</dd>
<dt class="field-odd">Return type</dt>
<dd class="field-odd"><p>function or list</p>
</dd>
</dl>
<div class="math notranslate nohighlight">
\[y = a \, f(b\,(x-c)) + d\]</div>
</dd></dl>
</div> </div>

View File

@@ -319,6 +319,8 @@
<li><a href="time_of_day.html#module-time_of_day">time_of_day (module)</a>, <a href="time_of_day.html#module-time_of_day">[1]</a> <li><a href="time_of_day.html#module-time_of_day">time_of_day (module)</a>, <a href="time_of_day.html#module-time_of_day">[1]</a>
</li> </li>
<li><a href="time_of_day.html#time_of_day.transform">transform() (in module time_of_day)</a> <li><a href="time_of_day.html#time_of_day.transform">transform() (in module time_of_day)</a>
</li>
<li><a href="function.html#function.transformation">transformation() (in module function)</a>
</li> </li>
</ul></td> </ul></td>
<td style="width: 33%; vertical-align: top;"><ul> <td style="width: 33%; vertical-align: top;"><ul>

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@@ -2,7 +2,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
"""Mathematical equations. """Mathematical equations.
:Date: 2019-11-02 :Date: 2019-11-04
.. module:: function .. module:: function
:platform: *nix, Windows :platform: *nix, Windows
@@ -13,6 +13,50 @@
import math import math
from pylib.mathematics import lcm from pylib.mathematics import lcm
def transformation(f, scale_vertical=1, scale_horizontal=1,
shift_horizontal=0, shift_vertical=0):
r"""Transform functions.
:param f: function or list of functions
:type f: function or list
:param scale_vertical: "a" scale factor in vertical direction (default
= 1)
:type height: float
:param scale_horizontal: "b" scale factor in horizontal direction
(default = 1)
:type height: float
:param shift_horizontal: "c" shift factor in horizontal direction
(default = 0)
:type height: float
:param shift_vertical: "d" shift factor in vertical direction (default
= 0)
:type height: float
:returns: transformed function or list of transformed functions
:rtype: function or list
.. math::
y = a \, f(b\,(x-c)) + d
"""
# shorter variables
a = scale_vertical
b = scale_horizontal
c = shift_horizontal
d = shift_vertical
# check if f is a function than put it in a list and return only
# the function, not the one element list
if callable(f):
return function_transformation(
[f], scale_vertical=a, scale_horizontal=b, shift_horizontal=c, shift_vertical=d)[0]
# otherwise assume list of functions
if not f: # if f is empty. End of the recursive fucntion
return []
return [lambda x, t: a*f[0](b*(x-c), t)+d] +\
function_transformation(
f[1:], scale_vertical=a, scale_horizontal=b, shift_horizontal=c, shift_vertical=d)
def sine_wave(A=1, k=1, f=1, phi=0, D=0, degree=False): def sine_wave(A=1, k=1, f=1, phi=0, D=0, degree=False):
r"""A sine wave or sinusoid is a mathematical curve that describes a r"""A sine wave or sinusoid is a mathematical curve that describes a
smooth periodic oscillation. smooth periodic oscillation.