Estoy tratando de implementar una infraestructura en C# que me permita hacer expresiones matemáticas arbitrarias. Por ejemplo, quiero ser capaz de tomar una expresión comoConfirmando la 10ma ley de Greenspun en C#
asin (sqrt (z - sen (x + y)^2))
y convertirlo en un objeto que me permita evaluarlo en términos de x, y y z, obtenga derivados, y posiblemente haga algún tipo de álgebra simbólica en él. ¿Cuáles son las ideas de las personas sobre un buen modelo para esto en C#?
Tengo mi propia toma, que me temo que se dirige a la arquitectura astronáutica, así que quiero asegurarme de que no sea el caso.
Básicamente, las funciones como el pecado, +, sqrt, etc. tienen clases basado en una clase base:
Function
Function<TOut> : Function
TOut Value
Function<Tin, TOut> : Function
TOut Evaluate(TIn value)
Function Derivative
Function<TOut, TIn> INverse
Function<TInA, TInB, TOut> : Function
TOut Evaluate(TInA valueA, TInB valueB)
Function PartialDerivativeA
Function PartialDerivativeB
Hasta ahora, tan simple. El truco es cómo componer las funciones. Aquí creo que quiero algo así como un enfoque currying para que pueda evaluar la función de un solo parámetro, y tener los otros permanecen. Así que estoy pensando en tener una clase de fábrica como esta:
Function<TInA, TInB, TOut> ->
Function<TInA, Function<TInB, TOut>>
(Function<TInA, TInB, TOut>, Function<TInX, TInA>, null) ->
Function<TInX, Function<TInB, TOut>>
(Function<TInA, TInB, TOut>, Function<TInA>, Function<TInX, TInY, TInB>) ->
Function<TInX, Function<TInY, TInB>>
y así sucesivamente. Mi principal preocupación es que los tipos genéricos pueden inutilizar el sistema (si se requiere que el usuario conozca los tipos genéricos completos solo para evaluar), y que quizás no pueda construir todos los tipos genéricos a partir de los argumentos de entrada.
¡Gracias por su contribución!
Sugiero usar algo como Matlab o Mathematica o lo que sea, en lugar de tratar de reinventar la rueda. – davr
¿Por qué crees que debes hacer esto con genéricos? Parece perfectamente factible (y un poco más simple) usando una jerarquía de clases normal. – RBarryYoung