Popularity
1.6
Stable
Activity
0.0
Stable
29
4
3

Description

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... Function composition is supported.

Programming language: C++
License: MIT License
Latest version: v1.0

metamath alternatives and similar libraries

Based on the "Math" category.
Alternatively, view metamath alternatives based on common mentions on social networks and blogs.

Do you think we are missing an alternative of metamath or a related project?

Add another 'Math' Library

README

metamath

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);

Examples of Functions and Derivatives

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

Build

Requirements

C++14 or later

Steps to build the sample

  • 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
    ======