java基于Expression4j操作和实现数学公式

import java.util.List;

import com.graphbuilder.math.ExpressionTree;

import fr.expression4j.basic.MathematicalElement;
import fr.expression4j.basic.OperatorManager;
import fr.expression4j.core.Catalog;
import fr.expression4j.core.Expression;
import fr.expression4j.core.ExpressionModel;
import fr.expression4j.core.Parameters;
import fr.expression4j.core.exception.EvalException;
import fr.expression4j.core.exception.ParametersException;
import fr.expression4j.core.exception.ParsingException;
import fr.expression4j.core.predefine.AbstractFunction;
import fr.expression4j.factory.ExpressionFactory;
import fr.expression4j.factory.NumberFactory;
import fr.expression4j.util.ParameterUtil;

//java基于Expression4j操作和实现数学公式
//http://sourceforge.net/projects/expression4j/files/
public class Expression4j {
	
	static class Factoriel extends AbstractFunction {
		 /**
		  * compute the factoriel of a number
		  * @param x number to compute
		  * @return factoriel of the number.
		  */
		 private double fact(double x) {
			 if (x == 0) {
				 return 1;
			 }
			 return x * fact(x-1);
		 }

		 /**
		  * evaluation method called by the Expression4j when needed.
		  * 
		  * @param parameters parameter given to the function for the evaluation.
		  */
		 public MathematicalElement evaluate(Parameters parameters) 
			throws EvalException {
			try {
				MathematicalElement me = parameters.getParameter("x");
				double tmpValue = me.getRealValue(); 
				if (tmpValue < 0) {
					throw new EvalException(
						"Cannot evaluate fact of " + 
						"negativ number.");
				}
				double result = fact(tmpValue);
				return NumberFactory.createReal(result);
			}
			catch (ParametersException pe) {
				throw new EvalException("Cannot evaluate fact(x). " + pe);
			}
		}

		public MathematicalElement evaluate(OperatorManager operatorManager,
					Parameters parameters) throws EvalException {
			return evaluate(parameters);
		}

		public Catalog getCatalog() {
			return ExpressionFactory.getCatalog();
		}

		/**
		 * get the function name
		 */
		public String getName() {
			return "fact";
		}

		/**
		 * get parameter list of the function.
		 */
		public List getParameters() {
			//this util method get one parameter "x".
			return ParameterUtil.generateXParameters();
		}

		public ExpressionModel getExpressionModel() {
			// TODO Auto-generated method stub
			return  null;
		}
	}
	public static void main(String[] args) {
		//test001();
		//test002();
		//test003();
		//test004();
		//test005();
		test006();
	}

	private static void test006() {
		try {
			//y=ax2+bx+c 一元二次方程
			Expression expression = ExpressionFactory.createExpression("y(a,b,c,x)=a*x^2+b*x+c");
			System.out.println("Expression name: " + expression.getName());
			
			System.out.println("Expression parameters: " + expression.getParameters());
			
			MathematicalElement element_a=NumberFactory.createReal(1);
			MathematicalElement element_b=NumberFactory.createReal(4);
			MathematicalElement element_c=NumberFactory.createReal(4);
			MathematicalElement element_x=NumberFactory.createReal(1);
			Parameters parameters=ExpressionFactory.createParameters();
			parameters.addParameter("a", element_a);
			parameters.addParameter("b", element_b);
			parameters.addParameter("c", element_c);
			parameters.addParameter("x", element_x);
			System.out.println("Value of expression:  y for x=1 a=1 b=4 c=4 :" +expression.evaluate(parameters).getRealValue());
			
			//y=x^2+6x+9=(x+3)^2
			element_a=NumberFactory.createReal(1);
			element_b=NumberFactory.createReal(6);
			element_c=NumberFactory.createReal(9);
			element_x=NumberFactory.createReal(1);
			parameters=ExpressionFactory.createParameters();
			parameters.addParameter("a", element_a);
			parameters.addParameter("b", element_b);
			parameters.addParameter("c", element_c);
			parameters.addParameter("x", element_x);
			System.out.println("Value of expression:  y for x=1 a=1 b=6 c=9 :" +expression.evaluate(parameters).getRealValue());
			
			
		} catch (Exception e) {
			e.printStackTrace();
		} 
	}

	private static void test005() {
		try {
			//define a specific catalog (not necessary,
			//we can use the default catalog instead)
			Catalog catalog = ExpressionFactory.createCatalog("catalog");
			//add the user define function to the catalog
			catalog.addExpression(new Factoriel());

			//create the expression who use the user define function
			//dont forget to put the catalog of the user define function
			//if default catalog is not used.
			Expression expression1 = 
				ExpressionFactory.createExpression("f(x)=fact(x+1)",catalog);
			System.out.println("Expression name: " + expression1.getName());
			System.out.println("Expression : " + expression1);
			System.out.println("Expression parameters: " + 
				expression1.getParameters());

			//compute a value
			MathematicalElement me1 = NumberFactory.createReal(5);
			Parameters parameters = ExpressionFactory.createParameters();
			parameters.addParameter("x",me1);
			System.out.println("Value of expression h :" + 
				expression1.evaluate(parameters));
		}
		catch (Exception e) {
			System.out.println("Error: " + e);
		}
		
	}

	private static void test004() {
		try {
			Expression expression = ExpressionFactory
				.createExpression("k()=abs(-3)");
			System.out.println("Expression name: " + expression.getName());
			System.out.println("Value of expression:" + 
				expression.evaluate(null).getRealValue());
		}
		catch (Exception e) {
			System.out.println("Error: " + e);
		}
	}

	private static void test003() {
		try {
			Expression expression1 = ExpressionFactory
				.createExpression("f(x,y)=2.4e-2*x-3.2*y");
			Expression expression2 = ExpressionFactory
				.createExpression("g(x,y)=4*f(x+3,f(y*2,x/2))+3");
			System.out.println("Expression name: " + expression2.getName());
			System.out.println("Expression : " + expression2);
			System.out.println("Expression parameters: " + 
				expression2.getParameters());

			MathematicalElement me1 = NumberFactory.createReal(2);
			MathematicalElement me2 = NumberFactory.createReal(4);
			Parameters parameters = ExpressionFactory.createParameters();
			parameters.addParameter("x",me1);
			parameters.addParameter("y",me2);
			System.out.println("Value of expression g for x=2 and y = 4:" + 
				expression2.evaluate(parameters).getRealValue());

			me1 = NumberFactory.createReal(3);
			me2 = NumberFactory.createReal(2);
			parameters.addParameter("x",me1);
			parameters.addParameter("y",me2);
			System.out.println("Value of expression g for x=3 and y = 2:" + 
				expression2.evaluate(parameters).getRealValue());
		}
		catch (Exception e) {
			System.out.println("Error: " + e);
		}
	}

	private static void test002() {
		try {
			Expression expression = ExpressionFactory.createExpression("f()=2.4e-2");
			
			System.out.println("Expression name: " + expression.getName());
			
			System.out.println("Value of expression:" + expression.evaluate(null).getRealValue());
			}
		catch (Exception e) {
			System.out.println("Error: " + e);
			}
	}

	private static void test001() {
		try {
			
			Expression expression1 = ExpressionFactory.createExpression("f(x,y)=2*x-3*y");
			Expression expression2 = ExpressionFactory.createExpression("g(x,y)=4*f(x,y)+3");

			System.out.println("Expression name: " + expression2.getName());
			System.out.println("Expression : " + expression2);
			System.out.println("Expression parameters: " + expression2.getParameters());

			MathematicalElement me1 = NumberFactory.createReal(2);
			MathematicalElement me2 = NumberFactory.createReal(4);
			Parameters parameters = ExpressionFactory.createParameters();
			parameters.addParameter("x",me1);
			parameters.addParameter("y",me2);

			System.out.println("Value of expression g for x=2 and y = 4:" + 
			expression2.evaluate(parameters).getRealValue());

			me1 = NumberFactory.createReal(3);
			me2 = NumberFactory.createReal(2);
			parameters.addParameter("x",me1);
			parameters.addParameter("y",me2);
			System.out.println("Value of expression g for x=3 and y = 2:" + 
			expression2.evaluate(parameters).getRealValue());
		}
		catch (Exception e) {
			System.out.println("Error: " + e);
		}
	}
	

}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值