第1章 Python輸入與輸出視頻案例——牛頓迭代法
?
案例:牛頓迭代法求解非線性方程根(視頻錄制講解):
視頻網(wǎng)址:https://www.bilibili.com/video/BV1uv411s7Wj?p=1
# -*- coding:UTF-8 -*-
# 開發(fā)時間:2020/9/20 20:15
from sympy import *
# 數(shù)值運算、符號運算
def function():
??? """
??? 求解方程的符號定義
??? :return: 方程
??? """
??? x = symbols('x')? #符號變量的定義
??? return 2*exp(-x)*sin(x) + 2*cos(x) - 0.25
def diff_function():
??? """
??? 求解方程的一階導函數(shù)
??? :return: 方程一階導函數(shù)
??? """
??? return function().diff()
def Newton_iterative(x0,eps,maxiter):
??? """
??? 牛頓迭代法求解非線性方程的根,采用逼近思想
??? :param x0: 迭代初始值
??? :param eps: 精度要求
??? :param maxiter: 最大迭代次數(shù)
??? :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處的數(shù)值
??????? 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("牛頓迭代法求解數(shù)值逼近,已經(jīng)達到最大迭代次數(shù),可能不收斂或精度過高......")
??? return None
if __name__ == '__main__':
??? fh = function()
??? plot(fh)
??? x0 = float(input("請輸入迭代初值:"))? #input函數(shù)總是以字符串的形式返回
??? eps = float(input("請輸入方程解的精度要求:")) #0.00000000000001
??? maxiter = int(input("請輸入最大迭代次數(shù):"))? # 100次
??? Newton_iterative(x0,eps,maxiter)
執(zhí)行結果示例:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? ? ? ? ?