Meta mathematic
metamath is a tiny header-only library. It can be used for symbolic computations on single-variable functions, such as dynamic computations of derivatives. The operator precedence rules are naturally handled by the compiler. The library could be useful for building custom DSL's in C++.
func.h contains definitions for some of the cmath functions: Sin/Cos, Ln, Pow, Abs, Sqrt, Exp, more to come... Arithmetic operations with functions are supported:
auto f1 = 3 * x;
auto f2 = Ln(x);
auto f = f1 + f2;
auto y1 = f(2);
auto y2 = f(4);
as well as function composition:
auto f = Ln(x);
auto g = 3 * x;
auto h = f(g);
auto y1 = h(2);
Example:
using namespace metamath;
auto f = 3 * x * x;
std::cout << "f(x) = " << f << std::endl;
std::cout << "f(4) = " << f(4.f) << std::endl;
std::cout << "------" << std::endl;
// take derivative
auto df = derivative(f);
std::cout << "f`(x) = " << df << std::endl;
std::cout << "f`(4) = " << df(4.f) << std::endl;
This will produce the following output:
f(x) = 3 * x * x
f(4) = 48
------
f`(x) = ((0 * x + 3) * x + 3 * x)
f`(4) = 24
Example:
auto f = 4 * Sin(2 * x);
std::cout << "f(x) = " << f << std::endl;
std::cout << "f(pi) = " << f(M_PI) << std::endl;
std::cout << "f(pi/4) = " << f(M_PI/4.f) << std::endl;
std::cout << "------" << std::endl;
//take derivative
auto df = derivative(f);
std::cout << "f`(x) = " << df << std::endl;
std::cout << "f`(pi) = " << df(M_PI) << std::endl;
std::cout << "f`(pi/4) = " << df(M_PI/4.f) << std::endl;
This will produce the following output:
f(x) = 4 * sin(2 * x)
f(pi) = 6.99382e-07
f(pi/4) = 4
------
f`(x) = (0 * sin(2 * x) + 4 * cos(2 * x) * (0 * x + 2))
f`(pi) = 8
f`(pi/4) = -3.49691e-07
C++14 or later
-
Suppose you cloned to [HOME]/work/metamath
-
For out-of-source, create a build folder in [HOME]/work, and go there.
$mkdir build $cd build
-
Run cmake
$cmake ../metamath
-
Build it
$make
-
You can now run a sample (the sample source is in metamath/sample/)
$./sample/mms
-
The sample output:
Metamath sample ====== f(x) = 3 * x * x f(4) = 48 ------ f`(x) = ((0 * x + 3) * x + 3 * x) f`(4) = 24 ====== ====== f(x) = 3 * x f(2) = 6 f(3) = 9 ------ f`(x) = (0 * x + 3) f`(2) = 3 ====== ====== f(x) = ((1) / (x)) f(2) = 0.5 f(3) = 0.333333 ------ f`(x) = (((0 * x - 1)) / (x * x)) f`(2.f) = -0.25 ====== ====== f(x) = ((2 * (x + 1)) / (x)) f(2) = 3 f(3) = 2.66667 ------ f`(x) = ((((0 * (x + 1) + 2 * 1) * x - 2 * (x + 1))) / (x * x)) f`(2) = -0.5 ====== ====== f(x) = 4 * sin(2 * x) f(pi) = 6.99382e-07 f(pi/4) = 4 ------ f`(x) = (0 * sin(2 * x) + 4 * cos(2 * x) * (0 * x + 2)) f`(pi) = 8 f`(pi/4) = -3.49691e-07 ====== ====== f(x) = sqrt(x) f(4) = 2 f(6) = 2.44949 ------ f`(x) = ((1) / (2 * sqrt(x))) f`(4) = 0.25 f`(6) = 0.204124 ====== ====== f(x) = (3 * x^2) f(4) = 144 f(6) = 324 ------ f`(x) = 2 * (3 * x^1) * (0 * x + 3) f`(4) = 72 f`(6) = 108 ====== ====== f(x) = e^(3 * x) f(4) = 162755 f(6) = 6.566e+07 ------ f`(x) = e^(3 * x) * (0 * x + 3) f`(4) = 488264 f`(6) = 1.9698e+08 ====== ====== f(x) = ln(3 * x) f(4) = 2.48491 f(6) = 2.89037 ------ f`(x) = ((1) / (3 * x)) * (0 * x + 3) f`(4) = 0.25 f`(6) = 0.166667 ====== ====== f(x) = |3 * x| f(-4) = 12 f(6) = 18 ------ f`(x) = ((3 * x) / (|3 * x|)) * (0 * x + 3) f`(-4) = -3 f`(6) = 3 ====== ====== f(x) = ln(x) g(x) = 3 * x h(x) = f(g(x)) = ln(3 * x) h(4) = 2.48491 ------ h`(x) = ((1) / (3 * x)) * (0 * x + 3) h`(4) = 0.25 ======