from term import Term
from symbols_table import *
import numbers
def calculate_derivative(term1: Term, rules: dict) -> Term:
if isinstance(term1.label, numbers.Number):
return Term(0)
elif term1.label == VAR:
return Term(1)
else:
return rules[term1.label](term1, rules)
def mul_derivative(term1: Term, rules) -> Term:
child1, child2 = term1.children
return Term(ADD, [Term(MUL, [calculate_derivative(child1, rules), child2]), Term(MUL, [child1, calculate_derivative(child2, rules)])])
def div_derivative(term1: Term, rules) -> Term:
child1, child2 = term1.children
return Term(DIV, [Term(SUB, [Term(MUL, [calculate_derivative(child1, rules), child2]), Term(MUL, [child1, calculate_derivative(child2, rules)])]),
Term(POW, [child2, Term(2)])])
def sum_derivative(term1: Term, rules) -> Term:
child1, child2 = term1.children
return Term(term1.label, [calculate_derivative(child1, rules), calculate_derivative(child2, rules)])
def power_derivative(term1: Term, rules) -> Term:
child1, child2 = term1.children
return Term(ADD,
[Term(MUL, [calculate_derivative(child2, rules), Term(LOG, [child1]), Term(POW, [child1, child2])]),
Term(MUL, [calculate_derivative(child1, rules), child2, Term(POW, [child1, Term(SUB, [child2, Term(1)])])])])
def sin_derivative(term1: Term, rules) -> Term:
return Term(MUL, [Term(COS, [term1.children[0]]), calculate_derivative(term1.children[0], rules)])
def cos_derivative(term1: Term, rules) -> Term:
return Term(MUL, [Term(-1), Term(SIN, [term1.children[0]]), calculate_derivative(term1.children[0], rules)])
def tan_derivative(term1: Term, rules) -> Term:
arg = Term.copy(term1.children[0])
return Term(ADD, [calculate_derivative(arg, rules), Term(MUL, [calculate_derivative(arg, rules), Term(POW, [term1, Term(2)])])])
def log_derivative(term1: Term, rules) -> Term:
return Term(DIV, [calculate_derivative(term1.children[0], rules), term1.children[0]])
rules_for_differentiation = {MUL: mul_derivative, ADD: sum_derivative, SUB: sum_derivative,
COS: cos_derivative, SIN: sin_derivative, TAN: tan_derivative,
POW: power_derivative, DIV: div_derivative, LOG: log_derivative}
def derivative(term1):
return calculate_derivative(term1, rules_for_differentiation)