我正在尝试在 C# 中实现一个基础结构,它允许我进行任意数学表达式。例如,我希望能够采取类似的表达方式
asin(sqrt(z - sin(x+y)^2))
并把它变成一个对象,让我可以根据 x、y 和 z 来评估它,得到导数,并可能对其进行某种符号代数。人们对 C# 中的一个好的模型有什么想法?
我有我自己的看法,恐怕这会进入建筑航天领域,所以我想确保情况并非如此。
基本上,像 sin、+、sqrt 等函数都有基于基类的类:
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
到目前为止,如此简单。诀窍是如何组合函数。在这里,我相信我想要一种类似柯里化的方法,以便我可以评估单个参数的函数,并保留其他参数。所以我正在考虑有一个这样的工厂类:
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>>
等等。我主要担心的是泛型类型可能会使系统无法使用(如果用户需要知道完整的泛型类型只是为了评估),并且我可能无法从输入参数构造所有泛型类型。
感谢您的输入!