summaryrefslogtreecommitdiff
path: root/differentiator.cpp
diff options
context:
space:
mode:
authorHombreLaser <sebastian-440@live.com>2022-04-17 11:14:38 -0500
committerHombreLaser <sebastian-440@live.com>2022-04-17 11:14:38 -0500
commit3f9e0da725963bb27aeccf852bf342a9cce2a34b (patch)
tree9bd646536d93f9f357a4e99eca3b9fff4ae340b6 /differentiator.cpp
parent4a2d657cc5bf8ea685a0daaec803363bc2c7822c (diff)
Añadido código de las reglas, solucionado errores.
Diffstat (limited to 'differentiator.cpp')
-rw-r--r--differentiator.cpp56
1 files changed, 46 insertions, 10 deletions
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<Literal *>(expr->getRight());
-
- return new MultiplicationExpression(new MultiplicationExpression(c->copy(), new PowerExpression(expr->getLeft()->copy(), new Literal(c->getValue() - 1))),
+ Variable *x = dynamic_cast<Variable *>(expr->getLeft());
+
+ /* Si el valor izquierdo no es un número, entonces el derecho
+ lo es. */
+ if(c == NULL) {
+ c = dynamic_cast<Literal *>(expr->getLeft());
+ x = dynamic_cast<Variable *>(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);
+}