# math_expressions

A library for parsing and evaluating mathematical expressions.

• Performs evaluations in real, vector, and interval contexts.
• Supports expression simplification and differentiation.

## Features

• Evaluation of expressions in various modes: Real, Vector and Interval.
• Parsing, simplification and differentiation of mathematical expressions.
• Supporting most basic math functions out of the box.
• Extensible through custom function definitions in code.
• Well documented and tested.

This package contains a very simple command-line interpreter for real numbers:

``````pub run math_expressions:interpreter
``````

### What's not working yet?

• Some evaluations in vector and interval space (especially functions).
• N-dimensional vectors. Curently no more than four dimensions are supported.
• The parser only works for real numbers.
• Complex numbers.

Suggestions and pull requests are always welcome!

## Usage

Below are two basic examples of how to use this library. There also is some additional example code available.

### 1. Expression creation and evaluation

This example shows how to evaluate

$(x^2+cos(y))/3$

for $x=2,y=\pi$

#### Build the expression

You can either create an mathematical expression programmatically or parse a string.

• Create the expression programmatically:
``````  Variable x = new Variable('x'), y = new Variable('y');
Power xSquare = new Power(x, 2);
Cos yCos = new Cos(y);
Number three = new Number(3.0);
Expression exp = (xSquare + yCos) / three;
``````
• Create the expression via the parser:
``````  Parser p = new Parser();
Expression exp = p.parse("(x^2 + cos(y)) / 3");
``````

#### Evaluate the expression

• Bind variables and evaluate the expression as real number:
``````  // Bind variables:
ContextModel cm = new ContextModel();
cm.bindVariable(x, new Number(2.0));
cm.bindVariable(y, new Number(Math.PI));

// Evaluate expression:
double eval = exp.evaluate(EvaluationType.REAL, cm);

print(eval) // = 1.0
``````

### 2. Expression simplification and differentiation

This example shows how to simplify and differentiate

$x*1-(-5)$

• Expressions can be simplified and differentiated with respect to a given variable:
``````  Expression exp = p.parse("x*1 - (-5)");

print(exp);            // = ((x * 1.0) - -(5.0))
print(exp.simplify()); // = (x + 5.0)

Expression expDerived = exp.derive('x');

print(expDerived);            // = (((x * 0.0) + (1.0 * 1.0)) - -(0.0))
print(expDerived.simplify()); // = 1.0
``````

## Alternatives

Here are some other Dart libraries that implement similar functionality to math_expression: parsing and evaluating mathematical expressions.

• expressions: an elegant and small library to parse and evaluate simple expressions.
• function_tree: a library for parsing, evaluating and plotting single- and multi-variables numerical functions.

To the author's knowledge math_expressions is currently the only library supporting interval arithmetics.

## Libraries

math_expressions
A math library for parsing and evaluating expressions in real, interval and vector contexts. It also supports simplification and differentiation of expressions. [...]