MaximaSharp
MaximaSharp copied to clipboard
A simple library that uses Maxima to do symbolic math in C# using lambda functions and expressions.
MaximaSharp
MaximaSharp is a simple library that uses Maxima to perform symbolic algebra, plot functions, and do basic operations with C#'s lambda functions, expressions, and strings. Both examples and Maxima are included.
What is Maxima?
Maxima is a system for the manipulation of symbolic and numerical expressions, including differentiation, integration, Taylor series, Laplace transforms, ordinary differential equations, systems of linear equations, polynomials, and sets, lists, vectors, matrices, and tensors. Maxima yields high precision numeric results by using exact fractions, arbitrary precision integers, and variable precision floating point numbers. Maxima can plot functions and data in two and three dimensions.
Using MaximaSharp
Given the following lambda expressions declared in C#:
Expression<Func<double, double>> f = x => 3 * Math.Pow(x, 2) + 2 * x
+ Math.Pow(Math.Cos(x), 2) + Math.Pow(Math.Sin(x), 2);
Expression<Func<double, double>> g = x => 2 * x + 5 * 2;
Expression<Func<double, double, double>> h = (y, z) => 3 * y + z;
Simplifying
Simplifying functions is easy:
Console.WriteLine(f.Simplify());
Console.WriteLine(g.Simplify());
Console.WriteLine(h.Simplify());
// Output:
// x => (((3 * (x ^ 2)) + (2 * x)) + 1)
// x => (2 * (x + 5))
// (y, z) => (z + (3 * y))
Differentiating
It's also possible to take the derivative of functions:
Console.WriteLine(f.Differentiate());
Console.WriteLine(g.Differentiate());
Console.WriteLine(h.Differentiate("y"));
// Output:
// x => ((6 * x) + 2)
// x => 2
// (y, z) => 3
Integrating
Definite and indefinite integrals can also be found:
Console.WriteLine(f.Integrate().Simplify());
Console.WriteLine(f.Integrate(0, 2));
Console.WriteLine(g.Integrate());
Console.WriteLine(h.Integrate("y"));
// Output:
// x => (x * (((x ^ 2) + x) + 1))
// x => 14
// x => ((x ^ 2) + (10 * x))
// (y, z) => ((y * z) + ((3 * (y ^ 2)) / 2))
Plotting
Plot functions easily with gnuplot:
Maxima.GnuPlot(@"plot x+5*cos(x)");
Maxima.GnuPlot(@"
set parametric
set pm3d depthorder hidden3d
set isosamples 30, 20
splot [-pi:pi][-pi:pi] cos(u)*(cos(v)+3), sin(u)*(cos(v)+3), sin(v) w pm
");
Console.ReadLine();
Produces the following graphs:

More stuff
Evaluate functions:
Console.WriteLine(f.At(5));
Console.WriteLine(g.At(10));
// Output:
// 86
// 30
Perform basic operations on functions:
Console.WriteLine(g.Plus(h));
Console.WriteLine(g.Minus(h));
Console.WriteLine(f.Times(g).Simplify());
Console.WriteLine(f.Over(g).Simplify());
// Output:
// (x, y, z) => (((2 * x) + 10) + ((3 * y) + z))
// (x, y, z) => (((2 * x) + 10) - ((3 * y) + z))
// x => ((2 * (x + 5)) * (((3 * (x ^ 2)) + (2 * x)) + 1))
// x => ((((3 * (x ^ 2)) + (2 * x)) + 1) / (2 * (x + 5)))
***
Note: evaluating functions and basic operations are performed without the use of Maxima.
Evaluate strings with Maxima: ```csharp Console.WriteLine(Maxima.Eval("x + 2 + 2 * x + 3 * 5")); // Output: // 3*x+17 ```
Convert strings back into expressions:
var expr = Maxima.ToExpression("double, double", "x", "10 * x + 5 * cos(x)");
Console.WriteLine(expr);
Console.WriteLine(expr.Differentiate().Simplify().At(0));
// Output:
// x => ((10 * x) + (5 * Cos(x)))
// 10
***
Example: converting user input to an expression that can be differentiated, integrated, plotted, or evaluated.