All Downloads are FREE. Search and download functionalities are using the official Maven repository.

jscl.math.operator.Integral Maven / Gradle / Ivy

The newest version!
package jscl.math.operator;

import jscl.AngleUnit;
import jscl.JsclMathEngine;
import jscl.math.Generic;
import jscl.math.NotIntegrableException;
import jscl.math.Variable;
import jscl.mathml.MathML;
import jscl.text.msg.JsclMessage;
import jscl.text.msg.Messages;
import org.solovyev.common.msg.MessageType;

import javax.annotation.Nonnull;

public class Integral extends Operator {

	public static final String NAME = "∫ab";

	public Integral(Generic expression, Generic variable, Generic n1, Generic n2) {
		super(NAME, new Generic[]{expression, variable, n1, n2});
	}

	protected Integral(@Nonnull Generic[] parameters) {
		super(NAME, parameters);
	}

	@Override
	public int getMinParameters() {
		return 4;
	}

	public Generic selfExpand() {
		if (JsclMathEngine.getInstance().getAngleUnits() != AngleUnit.rad) {
			JsclMathEngine.getInstance().getMessageRegistry().addMessage(new JsclMessage(Messages.msg_24, MessageType.warning));
		}

		Variable variable = parameters[1].variableValue();
		try {
			Generic a = parameters[0].antiDerivative(variable);
			return a.substitute(variable, parameters[3]).subtract(a.substitute(variable, parameters[2]));
		} catch (NotIntegrableException e) {
		}
		return expressionValue();
	}

	@Nonnull
	@Override
	protected String formatUndefinedParameter(int i) {
		switch (i) {
			case 0:
				return "f(x)";
			case 1:
				return "x";
			case 2:
				return "a";
			case 3:
				return "b";
			default:
				return super.formatUndefinedParameter(i);
		}
	}

	public void toMathML(MathML element, Object data) {
		int exponent = data instanceof Integer ? (Integer) data : 1;
		if (exponent == 1) bodyToMathML(element);
		else {
			MathML e1 = element.element("msup");
			MathML e2 = element.element("mfenced");
			bodyToMathML(e2);
			e1.appendChild(e2);
			e2 = element.element("mn");
			e2.appendChild(element.text(String.valueOf(exponent)));
			e1.appendChild(e2);
			element.appendChild(e1);
		}
	}

	@Nonnull
	@Override
	public Operator newInstance(@Nonnull Generic[] parameters) {
		return new Integral(parameters);
	}

	void bodyToMathML(MathML element) {
		Variable v = parameters[1].variableValue();
		MathML e1 = element.element("mrow");
		MathML e2 = element.element("msubsup");
		MathML e3 = element.element("mo");
		e3.appendChild(element.text("\u222B"));
		e2.appendChild(e3);
		parameters[2].toMathML(e2, null);
		parameters[3].toMathML(e2, null);
		e1.appendChild(e2);
		parameters[0].toMathML(e1, null);
		e2 = element.element("mo");
		e2.appendChild(element.text(/*"\u2146"*/"d"));
		e1.appendChild(e2);
		v.toMathML(e1, null);
		element.appendChild(e1);
	}

	@Nonnull
	public Variable newInstance() {
		return new Integral(null, null, null, null);
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy