動的に生成される方程式を解きたい。ニュートンラプソン法を使用して近似根を計算できる優れたライブラリをHackageDBで見つけました。ただし、ニュートン関数は、方程式として関数(型アノテーションNum a => a-> a)を取ります。私の質問は、関数を一緒に追加することは可能ですか?例:(適切な構文ではありません)
join :: (a->a) ->(a->a)->(a->a)
join func1 func2 = func1+func2
For instance:
if func1 = 1+2*X+5*X^2 , func2 = 5 + 4*x + 2*x^3
then func3 = join func1 func2
func3 is `6 + 6*x + 5*x^2 + 2*x^3?
これを行うには2つの方法を考えています。それぞれの小さな関数は動的に生成されるため、関数を上記の形式に単純化してから、たとえば次のようなデータ型で情報を格納する必要があります:(適切な構文ではありません)
data FuncInfo = Info [Double]
if 1 + 2*x + 3*x^2 ----> Info [1,2,3]
5 + 4*x^3 ----> Info [5,0,0,4]
このようにして、2つのデータを追加し、新しい関数を作成するのは簡単です。ただし、実際には、動的に生成される小さな関数を単純化するのは非常に難しいため、実行するのは簡単ではありません(小さな関数は次のようになります:) 10 / (1+x)^5
。
私が考えているもう1つの方法は、関数を一緒に追加するだけで、単純化したり、新しいデータ型に格納したりする必要がないようにすることです。たとえば、次のようになります。
func1 = 10 / (1+x) ^5
func2 = 25 / (1+x) ^9
newfunc = (10 / (1+x) ^5) + (25 / (1+x) ^9)