From 9d9224fcba36e9407f761814bb2db1dfcdda4afa Mon Sep 17 00:00:00 2001 From: Bertrand Benjamin Date: Mon, 15 Jul 2019 17:48:59 +0200 Subject: [PATCH] Feat: Polynoms can be differentiate!!!! --- mapytex/calculus/API/tokens/polynomial.py | 22 +++++++++++++ mapytex/calculus/core/MO/atoms.py | 20 ++++++++++++ mapytex/calculus/core/MO/fraction.py | 17 ++++++++++ mapytex/calculus/core/MO/mo.py | 4 +++ mapytex/calculus/core/MO/monomial.py | 38 +++++++++++++++++++++++ mapytex/calculus/core/MO/polynomial.py | 22 +++++++++++++ 6 files changed, 123 insertions(+) diff --git a/mapytex/calculus/API/tokens/polynomial.py b/mapytex/calculus/API/tokens/polynomial.py index 30a75de..3b09f8a 100644 --- a/mapytex/calculus/API/tokens/polynomial.py +++ b/mapytex/calculus/API/tokens/polynomial.py @@ -101,6 +101,24 @@ class Polynomial(Token): tree = tree.map_on_leaf(replace_var) return Expression(tree).simplify() + + def differentiate(self): + """ Differentiate a polynome + + :example: + >>> from ...core.MO.polynomial import MOpolynomial + >>> P = Polynomial(MOpolynomial('x', [1, 2, 3])) + >>> P + + >>> P.differentiate() + + >>> for s in P.differentiate().explain(): + ... print(s) + 0 + 2 + 3 * 2x + 2 + 3 * 2 * x + 2 + 6x + """ + return Expression(self._mo.differentiate()).simplify() @property def roots(self): """ Get roots of the Polynomial """ @@ -120,6 +138,8 @@ class Linear(Polynomial): >>> P.b + >>> P.differentiate() + >>> P.roots [] @@ -194,6 +214,8 @@ class Quadratic(Polynomial): 4 - 12 * 1 4 - 12 - 8 + >>> P.differentiate() + >>> P.roots [] diff --git a/mapytex/calculus/core/MO/atoms.py b/mapytex/calculus/core/MO/atoms.py index 6f8df1d..6f5eba8 100644 --- a/mapytex/calculus/core/MO/atoms.py +++ b/mapytex/calculus/core/MO/atoms.py @@ -166,6 +166,16 @@ class MOnumber(Atom): except AttributeError: return self.value < other + def differentiate(self): + """ differentiate a number and get 0 + + :example: + >>> a = MOnumber(3) + >>> a.differentiate() + + """ + return MOnumber(0) + class MOstr(Atom): @@ -260,6 +270,16 @@ class MOstr(Atom): def degree(self): return 1 + def differentiate(self): + """ differentiate a variable and get 1 + + :example: + >>> a = MOstr("x") + >>> a.differentiate() + + """ + return MOnumber(1) + # ----------------------------- # Reglages pour 'vim' diff --git a/mapytex/calculus/core/MO/fraction.py b/mapytex/calculus/core/MO/fraction.py index eb338b2..16ee737 100644 --- a/mapytex/calculus/core/MO/fraction.py +++ b/mapytex/calculus/core/MO/fraction.py @@ -8,6 +8,7 @@ from mapytex.calculus.core.tree import Tree from .mo import Molecule, MO +from .atoms import MOnumber __all__ = ["MOFraction"] @@ -71,6 +72,22 @@ class MOFraction(Molecule): """ return the inverse fraction """ return MOFraction(self._denominator, self._numerator, self.negative) + def differentiate(self): + """ differentiate a fraction and get something! + + :example: + >>> a = MOFraction(2, 3) + >>> a.differentiate() + + """ + d_num = self.numerator.differentiate() + d_denom = self.denominator.differentiate() + + if d_num == 0 and d_denom == 0: + return MOnumber(0) + else: + raise NotImplementedError + # ----------------------------- # Reglages pour 'vim' diff --git a/mapytex/calculus/core/MO/mo.py b/mapytex/calculus/core/MO/mo.py index 91c043c..1729498 100644 --- a/mapytex/calculus/core/MO/mo.py +++ b/mapytex/calculus/core/MO/mo.py @@ -97,6 +97,10 @@ class MO(ABC): """ return self._signature + def differentiate(self): + raise NotImplementedError + + class Atom(MO): diff --git a/mapytex/calculus/core/MO/monomial.py b/mapytex/calculus/core/MO/monomial.py index f9d7017..41eaeed 100644 --- a/mapytex/calculus/core/MO/monomial.py +++ b/mapytex/calculus/core/MO/monomial.py @@ -110,6 +110,19 @@ class MOstrPower(Molecule): 'monome2' """ return f"monome{self.power}" + def differentiate(self): + """ differentiate a MOstrPower and get a tree + + :example: + >>> a = MOstrPower('x', 3) + >>> print(a.differentiate()) + * + > 3 + > x^2 + """ + if self._power > 2: + return Tree('*', self.power, MOstrPower(self.variable, self._power._value-1)) + return Tree('*', self.power, MOstr(self.variable)) class MOMonomial(Molecule): @@ -258,6 +271,31 @@ class MOMonomial(Molecule): """ return f"monome{self.power}" + def differentiate(self): + """ Differentiate a MOMonomial and get a tree + + :example: + >>> x = MOstr('x') + >>> m = MOMonomial(4, x) + >>> m + + >>> print(m.differentiate()) + 4 + >>> m = MOMonomial(4, 'x', 2) + >>> m + + >>> print(m.differentiate()) + * + > 4 + > * + | > 2 + | > x + + """ + if self.power == 1: + return self.coefficient + return Tree("*", self.coefficient, self.strpower.differentiate()) + # ----------------------------- # Reglages pour 'vim' diff --git a/mapytex/calculus/core/MO/polynomial.py b/mapytex/calculus/core/MO/polynomial.py index bb286df..dd74b92 100644 --- a/mapytex/calculus/core/MO/polynomial.py +++ b/mapytex/calculus/core/MO/polynomial.py @@ -126,6 +126,28 @@ class MOpolynomial(Molecule): """ return self._monomials + def differentiate(self): + """ Differentiate a MOMonomial and get a tree + + :example: + >>> p = MOpolynomial('x', [1, 2, 3]) + >>> print(p) + 3x^2 + 2x + 1 + >>> print(p.differentiate()) + + + > 0 + > + + | > 2 + | > * + | | > 3 + | | > * + | | | > 2 + | | | > x + + """ + monomials_d = [m.differentiate() for m in self.monomials.values()] + return Tree.from_list("+", monomials_d) + # ----------------------------- # Reglages pour 'vim'