Haskell方程在实数中求解

时间:2011-02-13 12:00:02

标签: haskell math list-comprehension precision equation-solving

我刚刚开始玩GHCi。我看到列表生成器基本上解决了给定集合中的等式:

Prelude> [x | x <- [1..20], x^2 == 4]
[2]

(只找到一个根,如预期的那样)

现在,为什么我不能在ℝ中求解带有结果的方程式,因为解决方案 包含在指定的范围内?

[x | x <- [0.1,0.2..2.0], x*4 == 2]

如何在实数集中解决这些方程?

编辑:抱歉,我的意思是0.1

4 个答案:

答案 0 :(得分:8)

列表理解不会求解方程式,它只会生成属于某些集合的项目列表。如果您的集合在x中定义为{em>任何[1..20],而x^2==4 ,那就是您所获得的。

你不能用0.012.0的任何实数的完整列表来做到这一点,因为这样的真实列表不能用haskell表示(或更好:它不能在任何计算机上表示),因为它具有无限精度的无限数。

[0.01,0.2..2.0]是由以下数字组成的列表:

Prelude> [0.01,0.2..2.0]
[1.0e-2,0.2,0.39,0.5800000000000001,0.7700000000000001,0.9600000000000002,1.1500000000000004,1.3400000000000005,1.5300000000000007,1.7200000000000009,1.910000000000001]

这些数字都不能满足你的行为。


请注意,您可能需要[0.1,0.2..2.0]而不是[0.01,0.2..2.0]。仍然:

Prelude> [0.1,0.2..2.0]
[0.1,0.2,0.30000000000000004,0.4000000000000001,0.5000000000000001,0.6000000000000001,0.7000000000000001,0.8,0.9,1.0,1.1,1.2000000000000002,1.3000000000000003,1.4000000000000004,1.5000000000000004,1.6000000000000005,1.7000000000000006,1.8000000000000007,1.9000000000000008,2.000000000000001]

答案 1 :(得分:5)

正如其他人所提到的,这不是解决方程式的有效方法,但可以用比率来完成。

Prelude> :m +Data.Ratio 
Prelude Data.Ratio> [x|x<-[1%10, 2%10..2], x*4 == 2]
[1 % 2]

x % y视为x divided by y

答案 2 :(得分:4)

浮点问题可以用这种方式解决:

Prelude> [x | x <- [0.1, 0.2 .. 2.0], abs(2 - x*4) < 1e-9]
[0.5000000000000001]

有关浮点数可能导致问题的参考,请参阅:Comparing floating point numbers

答案 3 :(得分:3)

首先,即使浮点运算是准确的,[0.01,0.2..2.0]也不会包含0.5。我假设你的第一个元素是0.1

列表[0.1,0.2..2.0]不包含0.5,因为浮点运算不精确,[0.1,0.2..2.0]的第5个元素是0.5000000000000001,而不是0.5。