Skip to content

A simple library that uses Maxima to do symbolic math in C# using lambda functions and expressions.

Notifications You must be signed in to change notification settings

sgbj/MaximaSharp

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

18 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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:

Plot of x + 5 * cos(x) Plot of cos(u)(cos(v)+3), sin(u)(cos(v)+3), sin(v)

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.



About

A simple library that uses Maxima to do symbolic math in C# using lambda functions and expressions.

Resources

Stars

Watchers

Forks

Packages

No packages published