Newton_iterative


0.背景

惊讶的发现,在过去的一年里,我的python编程技巧几乎没有进步。为了提高编程能力和拥抱AI时代,有必要加强python在真正的数值分析方面的能力,因此开始学习鸣凤老师的课程

第一节课主要讲解了牛顿迭代法求根的python实现,我们这里把实现的代码记录下来,方便后续的复习(本人记忆太差了)。

  • 函数在整个定义域内最好是二阶可导的
  • 起始点对求根计算影响重大,可以增加一些别的判断手段进行试错

1. 代码实现

python_advance_0001.py
#!/usr/bin/env python from sys import argv, exit from sympy import * def function(): """Equation of expression""" x = symbols('x') return x*exp(-x)*sin(x) + 2*cos(x) - 0.25 def diff_function(): """The first derivative""" return function().diff() def Newton_iterative(x0, eps, maxiter): """Newton_iterative""" x = symnols("x") fh = function() dfh = diff_function() x_n = x0 # output header print("%5s %25s %25s" % ("Iter", "Approximate_Solution", "Error_Rate")) k = 0 errval = 0 for k in range(maxiter): x_b = x_n fx = fh.evalf(subs = {x : x_b}) dfx = dfh.evalf(subs = {x : x_b}) x_n = x_b - fx/dfx # 这里注意,求根嘛 看当前y值与X轴的差异 errval = abs(fh.evalf(subs = {x: x_n})) print("%5d %25.15f %25.15f" % (k+1, x_n, errval)) if errval <= eps: break if k+1 <= maxiter-1: print(f"Under the accuracy:{eps}, the approximate solution of the equation"+ f" is {x_n} and the error rate is {errval}.") else: print("The maximum number of iterations is exceeded, convergence may not occur!") return None if __name__ == "__main__": if len(argv) != 4: exit("Usage: python python_advance_0001.py [initial_x] [accuracy_requirement] [iter_count]") Newton_iterative(argv[1], argv[2], argv[3])

文章作者: zhangchaofan
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 zhangchaofan !
评论
  目录