任意の数式を作成できるインフラストラクチャを 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>>
等々。私の主な懸念は、ジェネリック型によってシステムが使用できなくなる可能性があること (ユーザーが評価のために完全なジェネリック型を知る必要がある場合) と、入力引数からすべてのジェネリック型を構築できない可能性があることです。
ご意見ありがとうございます。