0

動的に生成される方程式を解きたい。ニュートンラプソン法を使用して近似根を計算できる優れたライブラリを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)
4

1 に答える 1

5

もちろん。ただし、関数の値には加算の概念が必要なので、タイプがの関数に制限する必要があります(Num b) => a -> b。その後、あなたは簡単に行うことができます

functionSum :: (Num b) => (a -> b) -> (a -> b) -> (a -> b)
functionSum f g x = (f x) + (g x)

join(ほとんどの人がこの確立された機能について考えるかもしれないので、私は名前の使用を避けました)。

したがって、たとえば、

func1 :: Double -> Double
func1 x = 1+2*x+5*x^2

func2 :: Double -> Double
func2 x = 5+4*x+2*x^3

それから

*> :t (functionSum func1 func2)
(functionSum func1 func2) :: Double -> Double

質問の一部で、係数のリストとして多項式が保存されていることを示しているようです。[a0, a1, a2, ...]が多項式a0+a1 * x + ...を記述している場合zipWith (+) list1 list2、2つの多項式の合計を表す係数の新しいリストを作成するために使用することもできます。長さが異なる有限リストの場合は注意して処理してください(ヒント:短いリストにゼロを追加して、長いリストの長さに一致させてください)。

于 2013-03-17T22:30:58.620 に答える