From 3f9e0da725963bb27aeccf852bf342a9cce2a34b Mon Sep 17 00:00:00 2001 From: HombreLaser Date: Sun, 17 Apr 2022 11:14:38 -0500 Subject: Añadido código de las reglas, solucionado errores. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- differentiator.cpp | 56 ++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 46 insertions(+), 10 deletions(-) (limited to 'differentiator.cpp') diff --git a/differentiator.cpp b/differentiator.cpp index 739c19a..d25366d 100644 --- a/differentiator.cpp +++ b/differentiator.cpp @@ -11,17 +11,17 @@ Differentiator::Differentiator() { } // Regla del constante. f(x)=c, f'(x)=0. -Expression *Differentiator::visit(Literal *expr) { +Expression *Differentiator::visit(Literal *expr) const { return new Literal(0); } // Regla de la variable. f(x)=x, f'(x)=1 -Expression *Differentiator::visit(Variable *expr) { +Expression *Differentiator::visit(Variable *expr) const { return new Literal(1); } // Reglas de funciones trigonométricas. -Expression *Differentiator::visit(Function *expr) { +Expression *Differentiator::visit(Function *expr) const { Expression *diff; switch (expr->getFunctionName()) { @@ -56,22 +56,58 @@ Expression *Differentiator::visit(Function *expr) { } } -Expression *Differentiator::visit(NegationExpression *expr) { - return new NegationExpression(expr->diff(this)); +// Regla de la negación. (La derivada del lado derecho.) +Expression *Differentiator::visit(NegationExpression *expr) const { + return new NegationExpression(expr->getRight()->diff(this)); } -Expression *Differentiator::visit(AddExpression *expr) { +// Regla de la suma (las derivadas del lado izquierdo y derecho). +Expression *Differentiator::visit(AddExpression *expr) const { return new AddExpression(expr->getLeft()->diff(this), expr->getRight()->diff(this)); } -Expression *Differentiator::visit(SubExpression *expr) { +/* Regla de la resta. Igual que la de la suma, pero restando los derivandos + en vez de sumarlos. */ +Expression *Differentiator::visit(SubExpression *expr) const { return new SubExpression(expr->getLeft()->diff(this), expr->getRight()->diff(this)); } // Regla de la potencia. f(x)=x^c, f'(x)=c*x^(c-1)}*f'(x). -Expression *Differentiator::visit(PowerExpression *expr) { +Expression *Differentiator::visit(PowerExpression *expr) const { Literal *c = dynamic_cast(expr->getRight()); - - return new MultiplicationExpression(new MultiplicationExpression(c->copy(), new PowerExpression(expr->getLeft()->copy(), new Literal(c->getValue() - 1))), + Variable *x = dynamic_cast(expr->getLeft()); + + /* Si el valor izquierdo no es un número, entonces el derecho + lo es. */ + if(c == NULL) { + c = dynamic_cast(expr->getLeft()); + x = dynamic_cast(expr->getRight()); + } + + return new MultiplicationExpression(new MultiplicationExpression(c->copy(), new PowerExpression(x->copy(), new Literal(c->getValue() - 1))), expr->getLeft()->diff(this)); } + +// Regla del producto. +Expression *Differentiator::visit(MultiplicationExpression *expr) const { + Expression *u = expr->getLeft(); + Expression *v = expr->getRight(); + + return new AddExpression(new MultiplicationExpression(u->copy(), v->diff(this)), new MultiplicationExpression(v->copy(), u->diff(this))); +} + +// Regla de la división. +Expression *Differentiator::visit(DivisionExpression *expr) const { + Expression *u = expr->getLeft(); + Expression *v = expr->getRight(); + + return new DivisionExpression(new SubExpression(new MultiplicationExpression(v->copy(), u->diff(this)), + new MultiplicationExpression(u->copy(), v->diff(this))), new PowerExpression(v->copy(), new Literal(2))); +} + +// Función wrapper. +Expression *deriv(Expression *to_deriv) { + Differentiator d; + + return to_deriv->diff(&d); +} -- cgit v1.2.3