if (f.size() == 2) { ASTNode arg1Derived = derivative(f.getNode(1), var); if (isSymbol(head, "Exp")) { FunctionNode fun = new FunctionNode(fASTFactory.createSymbol("Exp")); fun.add(f.getNode(1)); return getDerivativeResult(arg1Derived, fun); if (isSymbol(head, "Cos")) { FunctionNode fun = new FunctionNode(fASTFactory.createSymbol("Times")); fun.add(new DoubleNode(-1.0)); if (isSymbol(head, "Sin")) { FunctionNode fun = new FunctionNode(fASTFactory.createSymbol("Cos")); fun.add(f.getNode(1)); return getDerivativeResult(arg1Derived, fun); } else if (f.size() == 3 && isSymbol(head, "Power")) { if (f.get(2).isFree(var)) {// derive x^r ASTNode arg1Derived = derivative(f.getNode(1), var); if (isSymbol(head, "Plus")) { FunctionNode result = new FunctionNode(f.getNode(0)); for (int i = 1; i < f.size(); i++) { if (isSymbol(head, "Times")) { FunctionNode plusResult = new FunctionNode(fASTFactory.createSymbol("Plus")); for (int i = 1; i < f.size(); i++) { if (isSymbol((SymbolNode) node, var)) {