package org.matheclipse.core.reflection.system;
import org.matheclipse.core.eval.exception.Validate;
import org.matheclipse.core.eval.interfaces.AbstractFunctionEvaluator;
import org.matheclipse.core.expression.F;
import org.matheclipse.core.interfaces.IAST;
import org.matheclipse.core.interfaces.IExpr;
/**
* Power series expansion with Taylor formula
*/
public class Taylor extends AbstractFunctionEvaluator {
public Taylor() {
}
@Override
public IExpr evaluate(final IAST ast) {
if (ast.size() == 3 && (ast.arg2().isVector() == 3)) {
IAST list = (IAST) ast.arg2();
final int lowerLimit = Validate.checkIntType(list, 2, Integer.MIN_VALUE);
if (lowerLimit != 0) {
// TODO support other cases than 0
return null;
}
final int upperLimit = Validate.checkIntType(list, 3, Integer.MIN_VALUE);
if (upperLimit < 0) {
return null;
}
IAST fadd = F.Plus();
fadd.add(F.ReplaceAll(ast.arg1(), F.Rule(list.arg1(), list.arg2())));
IExpr temp = ast.arg1();
IExpr factor = null;
for (int i = 1; i <= upperLimit; i++) {
temp = F.D(temp, list.arg1());
factor = F.Times(F.Power(F.Factorial(F.integer(i)), F.CN1), F.Power(F.Plus(list.arg1(), F.Times(F.CN1, list.arg2())), F
.integer(i)));
fadd.add(F.Times(F.ReplaceAll(temp, F.Rule(list.arg1(), list.arg2())), factor));
}
return fadd;
}
return null;
}
}
Ads help maintain this website.