2016-04-10 20 views
0

Alan hesaplamak istiyorum Belirli bir eğri için y = f (x) l ve r limitleri arasında.Haskell kullanarak Eğri Alanı hesaplanıyor?

Input will be : l r [a1,a2,a3..] [b1,b2,b3,b4,..] 
    The curve will be (a1)x^(b1) + (a2)x^(b2)+.... 

Programım:

area_curve _ _ [] [] = 0 
    area_curve l r (ai:as) (bi:bs) = (ai(r^^(bi+1)-l^^(bi+1))) + area_curve l r as bs 

aşağıdaki hatayı alıyorum programı çalıştırdığınızda:

"ghci> " area_curve 1 4 [1,2,3,4,5] [6,7,8,9,10] 
<interactive>:20:1: 
    Non type-variable argument in the constraint: Num (a1 -> a) 
    (Use FlexibleContexts to permit this) 
    When checking that ‘it’ has the inferred type 
     it :: forall a a1. (Fractional a1, Num a, Num (a1 -> a)) => a 
+0

Bu proje Eluler nedir? –

+0

orada bazı '' 'eksik (örneğin burada:' ai (r ^^ ...) 'var gibi görünüyor. Matematikçilerin çok tembel olduklarını bile bilmiyorsunuz' * '/' \ cdot' ;) – Carsten

+1

Çarpmanın açık olması gerekiyor. ai * (r ^^ ... ' – luqui

cevap

1

mola aşağı kolay parçalara

powers x = map (x^) 
dot = zipWith (*) 
minus = zipWith (-) 

curve x as ps = dot as $ powers x ps 

areacurve le ri as ps = minus (curve ri as ps) (curve le as ps) 

GÜNCELLEME için : Sadece kodunuzu yeniden düzenlediğimi, gerçekten ne yaptığına bakmadığımı unutmayın. Eğer eğrilerin integraller değerlendirmek istiyorsanız burada Çift olarak sayısal türünü tespit ederek sadeleştirilecektir ama genelleme kolay olmalıdır,

güçler negatif olmayan varsayıyorum daha yapısal bir yoldur

type Curve = [(Double,Double)] 

parabola = [(1.0,2.0)] 
line  = [(1.0,1.0)] 
zero  = [] 

integral :: Curve -> Curve 
integral = map (\(a,p) -> (a/(p+1),p+1)) 

eval :: Double -> Curve -> Double 
eval :: Double -> Curve -> Double 
eval x c = sum $ map (\(a,p) -> a*x**p) c 

Şimdi, örneğin, 2<x<3

> curve = [(1.0,1.0),(3.0,2.0)] 
> integral curve 
[(0.5,2.0),(1.0,3.0)] 

> map ($ integral curve) $ map eval [2,3] 
[10.0,31.5] 

alanı için 3*x^2+1 eğrisinin altındaki alan, bu iki değer arasındaki fark 21.5

Benzer şekilde, iki eğri arasındaki alanı tanımlayabilirsiniz.

+0

de bunu buldum sanırım sen de liste toplamı var – karakfa

+0

Bunu yaptım ama eğrinin alanı için bile iyi bir tahmin gerekir. –

+0

0.001 –