求解超级方程
【题目】 我们可能学过很多方程的解法。但如下这么简单的方程你会解吗?
X
X
=
100
X ^ X = 100
XX=100
这一点也不奇怪,其实绝大多数的方程都无法解,准确地说是找不到解析解
。但有了计算机,对多数方程,我们总可以求出它的模拟
解来。
模拟解的基本原理很简单,先猜一个数,并想办法判断出这个数是猜大了,还是猜小了。然后修正猜测值,继续猜下去,直到其精度符合要求。
这个问题与【问题26】手算开平方很类似,如下是 haskell 代码:
----超级方程 x^x=100 模拟解
f超级 :: (Ord a, Floating a) => a -> a
f超级 v = f 1
where
f x猜 = let
x配 = v ** (1 / x猜)
x差 = abs (x猜 - x配)
in
if x差 < d限 then x猜
else f $ (x配 + x猜) / 2
d限 = 1e-6
main :: IO ()
main = print $ f超级 100
这里的关键是找到与 x猜
配对的那个数。想法如下。假设猜了一个数 t
则, 方程
X
t
=
100
X^t=100
Xt=100 很容易解出来 x 的值。
如果,x 比 t 大,说明 t 的值猜小了。否则 t 的值猜大了。总之,真值在 x 与 t 之间。
明白了这个道理,程序与【问题26】如出一辙!