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;

/**
 * Create a Jacobian matrix.
 * 
 * See: Jacobian
 * 
 */
public class JacobiMatrix extends AbstractFunctionEvaluator {
	public JacobiMatrix() {
	}

	@Override
	public IExpr evaluate(final IAST ast) {
		Validate.checkSize(ast, 3);
		
		if (ast.arg1().isVector() >= 0) {
			IAST variables = null;
			if (ast.arg2().isSymbol()) {
				variables = F.List();
			} else if (ast.arg2().isVector() >= 0) {
				variables = (IAST) ast.get(2);
			}
			if (variables != null) {
				IAST vector = (IAST) ast.arg1();
				IAST jacobiMatrix = F.List();
				IAST jacobiRow = null;
				for (int i = 1; i < vector.size(); i++) {
					jacobiRow = F.List();
					for (int j = 1; j < variables.size(); j++) {
						jacobiRow.add(F.D(vector.get(i), variables.get(j)));
					}
					jacobiMatrix.add(jacobiRow);
				}
				return jacobiMatrix;
			}
		}

		return null;
	}

}

 

Ads help maintain this website.