欢迎光临散文网 会员登陆 & 注册

第1章 Python输入与输出视频案例——牛顿迭代法

2021-02-02 09:32 作者:鸣凤在竹-白驹食场  | 我要投稿

 

案例:牛顿迭代法求解非线性方程根(视频录制讲解):

视频网址: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)

执行结果示例:

程序执行结果示例

                                   

非线性方程图像绘制结果

         


第1章 Python输入与输出视频案例——牛顿迭代法的评论 (共 条)

分享到微博请遵守国家法律