我制作了一个函数,使用 n 个梯形的梯形规则计算某个函数 g 从 a 到 b 的定积分。 即
definiteIntegral (-4) 5 (\x -> x) 5 = 4.499999999999998
我需要开发一个quickCheck功能来测试我的功能。我想利用积分内部的系数可以取出并乘以积分的性质。
这是我的快速检查功能:
prop :: (Double, Double, Integer, Double) -> Property
prop (a, b, n, random) = (n > 0) ==> abs(random * (definiteIntegral a b (\x->x) n) - (definiteIntegral a b (\x-> random * x) n)) <= marginOfError
where
marginOfError = 1e-5
我遇到的问题是我需要根据积分的大小改变误差幅度。这是因为虽然
2.8109220919999948-2.810922091999996 = -1.3322676295501878e-15
,2.8109220919999948e15-2.810922091999996e15 = -1
。
因此,我需要某种方法来检查这两个数字,看看它们是否相似,但我当前的误差幅度方法不起作用。我想我需要检查有效数字或科学计数法中的数字乘以 10 的幂,但我不确定如何在 Haskell 中实现。
有什么想法吗? 提前致谢。
为了计算两个数字的相当稳健的误差幅度,请将它们平均,然后除以某个大常数;使用它作为误差范围。
margin :: Double -> Double -> Double
margin a b = (a + b) / (1e5) -- Increase this for more precision; decrease for less
close :: Double -> Double -> Bool
close a b = (abs (a - b)) < (margin a b)