第1章 Python输入与输出视频案例——牛顿迭代法
案例:牛顿迭代法求解非线性方程根(视频录制讲解):
视频网址:https://www.bilibili.com/video/BV1uv411s7Wj?p=1
# -*- coding:UTF-8 -*-
# 开发时间:2020/9/20 20:15
from sympy import *
# 数值运算、符号运算
def function():
"""
求解方程的符号定义
:return: 方程
"""
x = symbols('x') #符号变量的定义
return 2*exp(-x)*sin(x) + 2*cos(x) - 0.25
def diff_function():
"""
求解方程的一阶导函数
:return: 方程一阶导函数
"""
return function().diff()
def Newton_iterative(x0,eps,maxiter):
"""
牛顿迭代法求解非线性方程的根,采用逼近思想
:param x0: 迭代初始值
:param eps: 精度要求
:param maxiter: 最大迭代次数
:return: 返回值为None
"""
# x1 = x0 - f(x0)/f'(x0)==>> x2 = x1 - f(x1)/f'(x1)
x = symbols('x') # 符号变量的定义
fh = function() #方程
dfh = diff_function() #方程的一阶导
x_n = x0 # x_next代表x(n+1)
k = 0
errval = 0
print("%5s %22s %22s" % ("Iter", "Approximate_Solution", "ErrorPrecision"))
# 利用牛顿迭代思想逐渐逼近精确解
for k in range(maxiter):
x_b = x_n #代表x(n)
fx = fh.evalf(subs = {x:x_b}) #方程在xn处的数值
dfx = dfh.evalf(subs = {x:x_b}) #一阶导方程在xn处的值
x_n = x_b - fx/dfx #牛顿迭代公式
errval = abs(fh.evalf(subs = {x:x_n})) #第k次迭代误差大小
#输出迭代过程
print("%3d %22.15f %25.15f" % (k+1,x_n,errval))
if errval <= eps:
break
if k+1 <= maxiter-1:
print("方程在满足精度"+str(eps)+"的条件下,近似解为:" + str(x_n) +
",误差:"+ str(errval))
else:
print("牛顿迭代法求解数值逼近,已经达到最大迭代次数,可能不收敛或精度过高......")
return None
if __name__ == '__main__':
fh = function()
plot(fh)
x0 = float(input("请输入迭代初值:")) #input函数总是以字符串的形式返回
eps = float(input("请输入方程解的精度要求:")) #0.00000000000001
maxiter = int(input("请输入最大迭代次数:")) # 100次
Newton_iterative(x0,eps,maxiter)
执行结果示例:

