Haskell方程的实数解法

Haskell方程的实数解法,haskell,math,list-comprehension,precision,equation-solving,Haskell,Math,List Comprehension,Precision,Equation Solving,我刚开始玩GHCi。我看到列表生成器基本上解决给定集合内的一个方程: Prelude> [x | x <- [1..20], x^2 == 4] [2] Prelude>[x | x首先[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。列表理解不会解方程,它只会生成属于

我刚开始玩GHCi。我看到列表生成器基本上解决给定集合内的一个方程:

Prelude> [x | x <- [1..20], x^2 == 4]
[2]
Prelude>[x | x首先
[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。

列表理解不会解方程,它只会生成属于某些集合的项目列表。如果您的集合在
[1..20]
中定义为任意
x
,从而
x^2==4
,那么您就得到了

您无法使用从
0.01
2.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]

浮点问题可以通过以下方式解决:

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

Prelude>[x | x正如其他人所提到的,这不是求解方程的有效方法,但可以通过比率来实现

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

序曲数据。比率>[x|xAh,所说的“R”是指实数,而不是语言R!不幸的是,无法生成两个数(或所有浮点数)之间的R的所有成员的集合,这将是一个难以置信的大集合。@Andrew…比难以置信的大更大:-)让我们不要再向他隐瞒真相了:在0.001和0.01之间有无限的实值。无限。比一个封闭的宇宙可能包含的数量少得可笑的大量粒子还要多。:)值得注意的是:列出像你所看到的简单的那种理解have give可以简单地写为
过滤器(==2)。(*4))xs
@Stephane…我的意思是,在特定大小的0和2之间(例如64位)有一个非常大(但有限)的可表示浮点数。即使您可以生成一个0到2之间所有浮点表示的列表,这也是一种非常低效的“求解”方法等式,因为它只是从开始到结束一个接一个地搜索。你可以尝试将类型改为
Rational
。@Andrew Jaffe,此外,浮点数中甚至可能不存在解决方案。
(sqrt 2)^2==2--->False
。这对特定示例有效,但固定ε为10⁻⁹ 真的不是很可靠,因为浮点不准确不是绝对的。(如果数字太小,你可能会得到一大堆误报,如果它们太大,没有一个可以满足。)要用浮点数字解方程,你应该使用合适的解算器(牛顿·拉斐逊)或者至少比较相对偏差。
Prelude> :m +Data.Ratio 
Prelude Data.Ratio> [x|x<-[1%10, 2%10..2], x*4 == 2]
[1 % 2]