牛顿迭代法Python代码,全网最详细,教学向

这篇具有很好参考价值的文章主要介绍了牛顿迭代法Python代码,全网最详细,教学向。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

       

        代码功能包括函数图像展示,初始值选取收敛区间判断,迭代结果输出,迭代过程图像输出。

        因讲解过于冗长,先将完整代码直接放在这里,只是想抄个模板方便修改的可以直接拿去用啦,有不了解的地方可以再翻下去看。

"""
牛顿法编程计算sin(x)-x/2=0的正根,取x0=pi,x0=pi/2,误差限E<1e-4
2023.3.19
"""

from math import *     #基本数学库
import numpy as np     #数据结构:数组
from matplotlib import pyplot as plt   #绘图需要的库
plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号

"""
下面判断收敛性
"""
f = lambda x: np.sin(x)-x/2   #待求根函数
df = lambda x: np.cos(x)-1/2    #待求根函数的一阶导
df2 = lambda x: -np.sin(x)     #代求根函数的二阶导
Judge = lambda x: df(x)**2-abs(df2(x)/2)*abs(f(x)) #P116页,式6.13,
X = np.arange(-3.15,3.15,0.01)
plt.figure()   #新建图窗
plt.xlabel('x')  #横坐标标签
plt.ylabel('y')  #纵坐标标签
plt.plot(X, f(X),'green',label="y = sin(x)-x/2")  #绘制图像
plt.plot(X, Judge(X),'blue',linestyle=":",label="判断函数")
plt.plot(X, np.zeros_like(X),'black',linestyle="--",label="y = 0")  #绘制图像
plt.legend()
#保存图片
plt.savefig("D:/计算物理学/第六章习题/6-51",dpi=600, bbox_inches='tight')
plt.show()

"""
下面是子函数模块
"""
#牛顿法(输入两个参数,初始猜值与误差限)
def Newton(x0,E):
    XX = [x0]    #存放迭代过程中的所有解
    for i in range(10**3):     #括号内为最大迭代次数
        XX.append(XX[i]-f(XX[i])/df(XX[i])) #迭代公式
        if abs(XX[i+1]-XX[i]) <= E:
            break
    
    return(XX[i+1],i+1,XX)      #依次返回最终迭代结果,迭代次数,迭代过程全解
    
"""
下面进行结果整理与展示
"""
x0,E = input("请输入初始猜值x0,误差限E,以逗号分隔:").split(',')
x0,E = eval(x0),eval(E)    #输入是字符串形式,数值化
result,num,All = Newton(x0,E)    #接收函数返回结果
print("方程的一个实根为x =",result,"迭代次数:",num)  #输出结果与迭代次数

#展示迭代过程
plt.figure()   #新建图窗
plt.xlabel('迭代次数')  #横坐标标签
plt.ylabel('迭代结果')  #纵坐标标签
plt.plot(np.arange(0,num+1,1), All,'#bcbd22',linestyle='-',label="迭代过程"
         ,marker = 'o',markersize = 6, # 点的大小
         markeredgecolor='black', # 点的边框色
         markerfacecolor='#8c564b' # 点的填充色
         )  
plt.legend()
plt.savefig("D:/计算物理学/第六章习题/6-52",dpi=600, bbox_inches='tight')
plt.show()

下面是纯新手向详细代码讲解:

       下面我以第六章习题6.5为例展示牛顿迭代法相关代码,我将从头开始讲起,给大家讲解一些我的编程思路以及一些可能有用的小技巧。

题目如下:

用牛顿法编程计算的正根。(取x0=pi和x0=pi/2分别计算至)

首先我们在程序的开头使用多行注释,标注一下这个程序的用途,谁写的,什么时间写的。(非必要,纯仪式感)

"""
计算物理第六章习题6.5
牛顿法编程计算sin(x)-x/2=0的正根,取x0=pi,x0=pi/2,误差限E<1e-4
2023.3.19
"""

然后开始正式写代码,主流习惯以及我个人的习惯都是先把需要的库导入,并且把相关设置设置好,像下面这样:

from math import *     #基本数学库
import numpy as np     #数据结构:数组
from matplotlib import pyplot as plt   #绘图需要的库
plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号

       这里我们分别导入了math库(提供常数π,以及一些基本数学表达式),numpy库(提供新的数据结构:数组,以及后面会提到的一些实用的函数),matplotlib库(用于绘图)。

       牛顿迭代法和其他迭代法相似,都需要进行初始值的选取。而初始值的选取并不是任意的,不当的取值会让其迭代发散,无法收敛到根上,因此下面我们先进行收敛性的讨论。代码如下:

"""
下面判断收敛性
"""
f = lambda x: np.sin(x)-x/2   #待求根函数
df = lambda x: np.cos(x)-1/2    #待求根函数的一阶导
df2 = lambda x: -np.sin(x)     #代求根函数的二阶导
Judge = lambda x: df(x)**2-abs(df2(x)/2)*abs(f(x)) #P116页,式6.13,
X = np.arange(-3.15,3.15,0.01)
plt.figure()   #新建图窗
plt.xlabel('x')  #横坐标标签
plt.ylabel('y')  #纵坐标标签
plt.plot(X, f(X),'green',label="y = sin(x)-x/2")  #绘制图像
plt.plot(X, Judge(X),'blue',linestyle=":",label="判断函数")
plt.plot(X, np.zeros_like(X),'black',linestyle="--",label="y = 0")  #绘制图像
plt.legend()
#保存图片
plt.savefig("D:/计算物理学/第六章习题/6-51",dpi=600, bbox_inches='tight')
plt.show()

       这段代码首先将待求根函数,它的一阶导,它的二阶导进行了定义。这里我们采取了匿名函数的定义方式,对简短的表达式进行函数定义的时候采用匿名函数,可以比传统的def定义更加简便与清晰,只需一行便可定义完成。然后根据函数与它的一阶,二阶导数,便可以写出它的判断函数Judge(在该函数大于0的区间内选取初值必定收敛)。

       画图代码部分三个地方出现了numpy库的运用:一个语句为np.arange(-3.15,3.15,0.01),该语句创造一个从-3.15开始,以0.01的步长增加至3.14结束的数组;一个语句为np.zeros_like(X),该语句的作用是创建一个与X形状相同并全为0的数组,使用该语句可以很简洁地画出y=0的曲线;另外在定义函数时使用了np.sin和np.cos,这个语句可以直接作用在数组(列表)上,返回一个每个元素都经过正弦(余弦)运算的数组(列表)。

最终成图如下:

牛顿迭代法Python代码,全网最详细,教学向

       从图里绿色曲线可以大致看出,函数在x=1.9附近有一个根,并且在x>1.5的范围里判断函数一直大于0,这也说明只要选取的初值x0大于1.5,就都能收敛。

       在确定函数正根的大致范围和初值的可取范围后,我们下面开始正式编写牛顿迭代法的算法实现,如下:

"""
下面是子函数模块
"""
#牛顿法(输入两个参数,初始猜值与误差限)
def Newton(x0,E):
    XX = [x0]    #存放迭代过程中的所有解
    for i in range(10**3):     #括号内为最大迭代次数
        XX.append(XX[i]-f(XX[i])/df(XX[i])) #迭代公式
        if abs(XX[i+1]-XX[i]) <= E:
            break
    
    return(XX[i+1],i+1,XX)      #依次返回最终迭代结果,迭代次数,迭代过程全解

       这里的代码实现我们采用了for循环进行迭代,通过列表XX进行迭代过程中所有根的存储(列表的更新通过append语句完成,列表定义时的初始值就是由使用者输入的初始猜值),并且最终返回:迭代的结果,迭代次数,迭代过程全部数据。

       到这里整个算法就已经实现完成了,下面进行结果的整理与展示。

"""
下面进行结果整理与展示
"""
x0,E = input("请输入初始猜值x0,误差限E,以逗号分隔:").split(',')
x0,E = eval(x0),eval(E)    #输入是字符串形式,数值化
result,num,All = Newton(x0,E)    #接收函数返回结果
print("方程的一个实根为x =",result,"迭代次数:",num)  #输出结果与迭代次数

#展示迭代过程
plt.figure()   #新建图窗
plt.xlabel('迭代次数')  #横坐标标签
plt.ylabel('迭代结果')  #纵坐标标签
plt.plot(np.arange(0,num+1,1), All,'#bcbd22',linestyle='-',label="迭代过程"
         ,marker = 'o',markersize = 6, # 点的大小
         markeredgecolor='black', # 点的边框色
         markerfacecolor='#8c564b' # 点的填充色
         )  
plt.legend()
plt.savefig("D:/计算物理学/第六章习题/6-52",dpi=600, bbox_inches='tight')
plt.show()

       在由用户输入初始猜值和误差限后,将输入进行数值化处理(因为默认输入的是字符串形式,字符串无法直接运算)。然后调用前面定义的牛顿迭代法子函数,得到最终结果。将迭代结果和迭代次数直接通过print输出,迭代过程绘制点线图输出。如下:

牛顿迭代法Python代码,全网最详细,教学向

牛顿迭代法Python代码,全网最详细,教学向文章来源地址https://www.toymoban.com/news/detail-480455.html

到了这里,关于牛顿迭代法Python代码,全网最详细,教学向的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言每日一练——第154天:牛顿迭代法求方程根

    🌟 前言 Wassup guys,我是Edison 😎 今天是C语言每日一练,第154天! Let’s get it! 编写用牛顿迭代法求方程根的函数。   方程为 a x 2 + b x 2 + c x + d = 0 ax^2+bx^2+cx+d=0 a x 2 + b x 2 + c x + d = 0 ,系数a,b,c,d 由主函数输入。   求 x x x 在 1 1 1 附近的一个实根。求出根后,由主函数输

    2024年01月23日
    浏览(45)
  • 牛顿(Newton)迭代法求解非线性方程以及方程组的Matlab实现

    必做题目比较简单,写得有些随意,主要还是第二个拓展题目的难度比较高 传入题设数据有: 另附运行截图  

    2024年02月11日
    浏览(47)
  • python算法二:迭代法

    1.定义:迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的是直接法(或者称为一次解法),即一次性解决问题。迭代算法是用计算机解决问题的一种基本方法,它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步

    2024年02月06日
    浏览(53)
  • 数学建模算法(基于matlab和python)之 线性方程组的迭代法(雅可比迭代、高斯-赛德尔迭代)(7/10)

    实验目的及要求: 1、了解各迭代法的基本原理和特点; 2、判断雅克比迭代、高斯-塞德尔迭代对任意初始向量的收敛性; 3、完成雅克比迭代、高斯-塞德尔迭代算法的程序实现。 实验内容: 1、编写雅可比迭代法与高斯-赛德尔迭代法通用子程序,求解下列线性方程组 ,并考

    2024年02月04日
    浏览(50)
  • 雅可比迭代和高斯—赛德尔迭代法

           对于线性方程组AX=b,我们首先将系数矩阵A分解为对角矩阵D、下三角矩阵L和上三角矩阵U:   在这里,我们求解下面的带状方程(以下程序均是以求解该带状方程为例): .............           高斯—赛德尔迭代法是再雅可比迭代法的基础上,在计算 时尽可能地用最

    2024年01月25日
    浏览(44)
  • 松弛(SOR)迭代法

            松弛迭代法是在雅可比迭代法和高斯——赛德尔迭代法的基础上,以w0为松弛因子,建立迭代格式如下: 即         我们将线性方程组AX=b的系数矩阵A分解成一个对角矩阵D、一个下三角矩阵L和一个上三角矩阵D,即A=D-L-U,则有:                        当w=1时,

    2024年02月04日
    浏览(44)
  • 3.4 迭代法

        雅可比迭代法是一种用于求解线性方程组的迭代算法,其基本思想是将线性方程组中的系数矩阵拆分为对角线矩阵和非对角线矩阵两部分,并利用对角线矩阵的逆矩阵来迭代求解方程组。 具体地,设线性方程组为Ax=b,其中A为系数矩阵,b为常数向量,x为未知向量,雅可

    2024年02月08日
    浏览(45)
  • 数值分析-高斯塞得尔迭代法

    高斯-赛德尔迭代(Gauss–Seidel method)是数值线性代数中的一个迭代法,可用来求出线性方程组解的近似值。该方法以卡尔·弗里德里希·高斯和路德维希·赛德尔命名。 同雅可比法一样,高斯-赛德尔迭代是基于矩阵分解原理。(源自百度百科) 版本一 版本二 与雅克比迭代法

    2024年02月11日
    浏览(44)
  • 程序设计基础实例大全(1.迭代法)

    本博文最先发表于知乎网 程序设计最为常用的计算方法有枚举(Enumeration)、递推和递归(Recursion)等。暴力搜索(Brute-­force search)属于枚举法。 迭代法(Iteration)也是最为常用的一种方法。 1.1 阶乘之和 问题描述 计算S=1!+2!+…+n! 输入 一个正整数n,满足1≤n≤10。 输出 阶

    2024年02月07日
    浏览(44)
  • Jacobi迭代法的matlab程序(《数值分析原理》)

    Jacobi迭代法是常见的几种迭代法之一,迭代格式如下图所示:(图片来自CHD的ztl老师的PPT)(具体内容详见《数值分析原理》) 该例子使用matlab的命令文件格式,命名为jacobi.m。 举例:设有方程组 取初始向量为x (0)=(-3,1,1) (T),用Jacobi方法求解,要求||x (k+1)-x (k)||小于等于10…

    2023年04月08日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包