2010-11-01 33 views
28

Estoy buscando una buena fuente abierta Math Library que puede hacer cosas como:OpenSouce C/C++ analizador de expresiones matemáticas Biblioteca

  • Analizar matemáticas. expresiones "1 + 1 * (3/5)"
  • Integración

¿Alguien sabe algo como esto?

+1

el análisis y la integración son bastante diferentes, dependiendo de la complejidad de la integración necesita –

+0

Algunos libre Las implementaciones Java y C++ del algoritmo de yarda de derivación para convertir expresiones a nomenclatura polaca inversa y luego evaluarlas se pueden encontrar aquí: http://www.technical-recipes.com/2011/a-mathematical-expression-parser-in-java -and-cpp/ – AndyUK

+1

ejemplo de análisis de expresiones matemáticas: https: // stack overflow.com/a/32853177 –

Respuesta

5

Octave puede hacer esto y se puede llamar desde within a C++ program. Incluso puede llamar al código de C++ desde la octava fácilmente usando SWIG para generar la interfaz.

1

Otro enfoque es incrustar un lenguaje interpretado en su aplicación y usar el analizador matemático de ese lenguaje.

LUA se está convirtiendo en popular para esto - ver How to embed lua in c++ via SWIG

3

Siempre he usado muParser, escrito en C++, para el análisis. No vas a obtener una biblioteca que pueda hacer integración; simplemente demasiado difícil sin una biblioteca seria de peso pesado. Los integradores simbólicos de código abierto como Maxima, Octave, etc. existen, pero son difíciles de interactuar, y esa funcionalidad no se puede separar fácilmente del resto del proyecto.

7

También hay GNU libmatheval, que hace la evaluación y la diferenciación. La integración es un problema mucho harder, incluso para integrandos de aspecto inocente.

+0

+1, no me había encontrado antes y parece bastante interesante. – Flexo

0

Hay una biblioteca MathPresso que es un analizador y también un compilador JIT de expresiones matemáticas, lo uso cuando el rendimiento es importante.

Algunas pruebas: evaluando la expresión "x/y + (x * x * y + 18.243 * y)/z" - donde las variables son números de coma flotante de doble precisión.

  • función de C++: 144,1 millones de evaluaciones por segundo
  • MathPresso: 133,8 millones de evaluaciones por segundo expresión
Cuestiones relacionadas