萌ICP备20220458号

一行 Python 的牛顿迭代

2021年11月30日 2638点热度 4人点赞 0条评论

今天数学课正好讲这个,于是整点花的(

使用牛顿迭代法求函数 f(x)=x^2-2x=1.5 附近的零点,即 \sqrt 2 的值,精确到 10^{-12}

允许赋值表达式:

(lambda: (zero := lambda f, df, x, e: zero(f, df, x - fx / df(x), e) if abs(fx := f(x)) > e else x))()(lambda x: x * x - 2, lambda x: x * 2, 1.5, 1e-12)

写成纯 lambda:

(lambda f: (lambda f: f(f))(lambda g: f(lambda *v: g(g)(*v))))(lambda zero: lambda f, df, x, e: (lambda fx: zero(f, df, x - fx / df(x), e) if abs(fx) > e else x)(f(x)))(lambda x: x * x - 2, lambda x: x * 2, 1.5, 1e-12)

可以再闭个包:

(lambda f, df, e: (lambda f: (lambda f: f(f))(lambda g: f(lambda v: g(g)(v))))(lambda zero: lambda x: (lambda fx: zero(x - fx / df(x)) if abs(fx) > e else x)(f(x))))(lambda x: x * x - 2, lambda x: x * 2, 1e-12)(1.5)

或者少套一层:

(lambda f: lambda *v: f(f, *v))(lambda zero, f, df, x, e: (lambda fx: zero(zero, f, df, x - fx / df(x), e) if abs(fx) > e else x)(f(x)))(lambda x: x * x - 2, lambda x: x * 2, 1.5, 1e-12)

其实主要倒不是牛顿迭代,而是递归的各种实现方式。

funnysyc

啥都不会。

文章评论