[数值计算-7]:一元n次非线性方程求解-单点盲探-牛顿迭代法&Python法代码示例

2023-11-16

 作者主页(文火冰糖的硅基工坊):https://blog.csdn.net/HiWangWenBing

本文网址:https://blog.csdn.net/HiWangWenBing/article/details/119813740


目录

1. 一元n次非线性方程

1.1 非线性函数

1.2 非线性函数案例

1.3 非线性函数的几何图形

2. 牛顿迭代法求非线性方程解的基本原理

2.1 概述

2.2 中值定理

2.3 确定误差或收敛条件

2.4 迭代过程

2.5 牛顿迭代法的条件

2.6 牛顿迭代法的优缺点

3. Python代码示例

3.1 案例1:初值= +2

3.1 案例2:初值= -2



1. 一元n次非线性方程

1.1 非线性函数

线性函数是一次函数的别称,则非线性函数即函数图像不是一条直线的函数。

非线性函数包括指数函数、幂函数、对数函数、多项式函数等等基本初等函数以及他们组成的复合函数

1.2 非线性函数案例

 y = f(x) = a3*x^3 + a2*x^1 +  a0 

另a3 = 1, a2=-1, a0=-1;得到:

y=f(x) = x^3 - x^2 - 1

1.3 非线性函数的几何图形

2. 牛顿迭代法求非线性方程解的基本原理

2.1 概述

牛顿迭代法(Newton's method)又称为牛顿-拉夫逊(拉弗森)方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。 

2.2 中值定理

 中值定理是反映函数本身与其在某一点处的导数之间联系的重要定理

函数与其导数是两个不同的函数;而导数只是反映函数在一点的局部特征;如果要了解函数在其定义域上的整体性态,就需要在导数及函数间建立起联系,微分中值定理就是这种作用。

微分中值定理,包括罗尔定理、拉格朗日定理柯西定理、泰勒定理。是沟通导数值与函数值之间的桥梁,是利用导数的局部性质推断函数的整体性质的工具。

拉格朗日中值定理:

内容是说一段连续光滑曲线中必然有一点,它的斜率与整段曲线平均斜率相同。

上述公式既是牛顿迭代法误差公式的基础,也是迭代公式的基础。

2.3 确定误差或收敛条件

 当X接近真实根的时候,X与真实值的误差约等于Xk+1与Xk之间的差值。

2.4 迭代过程

 

2.5 牛顿迭代法的条件

(1)在真实解附近是可导

(2)初始值需要靠近真实解附近

2.6 牛顿迭代法的优缺点

(1)优点:

  • 在真实解附近,收敛快

  • 能够体现导数对迭代收敛意义和作用

(2)缺点:

如果初始点离真实解较远,且中间的单调的,就可以切线与X轴的交点,不能向真实解收敛,即y=f(x)不能向0方向收敛。因为所谓求方程解,就是求y=f(x)=0处的x值,如果y=f(Xk)不能向0收敛,则x就无法向真实解收敛。

解决次问题的方法:就是“牛顿下山法”对牛顿迭代法进行优化和限制。

3. Python代码示例

3.1 案例1:初值= +2

(1)源代码:

#导入库
from math import *
import time
import numpy
import matplotlib.pyplot as plt


# 一元N次非线性函数
# y=f(x) = x^3 - x - 1
def f(x,derive):
    #定义函数参数
    if(derive == 0):
        return(1.0*x**3 - 1.0*x**1 -1)  #原函数 
    elif (derive == 1):
        return(3.0*x**2 - 1.0)         #导函数
    else:
        print("Input Error")
        return(0)

#定义精度
accuracy = 0.0001

#定义起始点
x1 = 2

#log data
count = 0
x_data  = []
y_data  = []

#记录初始节点
x_data.clear()
y_data.clear()
x_data.append(0)
y_data.append(x1)

#迭代起始时间
start = time.time()

while True:
    #新的一轮迭代
    x2 = x1 - f(x1,0)/f(x1,1) # X值的迭代
    Err = fabs(x2-x1)         # 迭代后误差
    x1 = x2                   # 保留当前x值
    
    #增加log记录
    count = count + 1
    x_data.append(count)
    y_data.append(x1)
    
    if (Err <= accuracy):
        break;
    
#迭代终止时间
end = time.time()

print("耗时=", end-start)
print("迭代次数=", count)
print("方程解=", x2)
print("实际误差=", Err)
print("迭代数据序列..........")

print("\n迭代过程")
for x in x_data:
    print("X{}={}".format(x,y_data[x]))

plt.scatter(x_data, y_data)

(2)输出结果

耗时= 0.00099945068359375
迭代次数= 5
方程解= 1.3247179572458576
实际误差= 1.0921712676470463e-06

迭代过程
X0=2
X1=1.5454545454545454
X2=1.359614915915184
X3=1.325801345005845
X4=1.3247190494171253
X5=1.3247179572458576

(3)图形显示收敛过程

3.1 案例2:初值= -2

(1)源代码

#定义精度
accuracy = 0.0001

#定义起始点
x1 = -2

#log data
count = 0
x_data  = []
y_data  = []

#记录初始节点
x_data.append(0)
y_data.append(x1)

#迭代起始时间
start = time.time()

while True:
    #新的一轮迭代
    x2 = x1 - f(x1,0)/f(x1,1) # X值的迭代
    Err = fabs(x2-x1)         # 迭代后误差
    x1 = x2                   # 保留当前x值
    
    #增加log记录
    count = count + 1
    x_data.append(count)
    y_data.append(x1)
    
    if (Err <= accuracy):
        break;
    
#迭代终止时间
end = time.time()

print("耗时=", end-start)
print("迭代次数=", count)
print("方程解=", x2)
print("实际误差=", Err)

print("\n迭代过程")
for x in x_data:
    print("X{}={}".format(x,y_data[x]))

plt.scatter(x_data, y_data)

(2)输出

耗时= 0.0
迭代次数= 65
方程解= 1.3247179574157972
实际误差= 1.3548153629638904e-05

迭代过程
X0=-2
X1=-1.3636363636363638
X2=-0.8892353134230391
X3=-0.29609491722682657
X4=-1.2864352364252927
X5=-0.8217128731113184
X6=-0.10691984835296464
X7=-1.03298211799929
X8=-0.5472085094190648
X9=-6.611274711607757
X10=-4.433702585989313
X11=-2.989538057557567
X12=-2.031496813533126
X13=-1.3854649531667529
X14=-0.9075970552862211
X15=-0.33661987193684095
X16=-1.3994357597139493
X17=-0.9192055355939536
X18=-0.3605283713478141
X19=-1.4855582794693762
X20=-0.9886592503827742
X21=-0.4826912520186133
X22=-2.5747641103691308
X23=-1.7544435797503293
X24=-1.190229561606389
X25=-0.7299425321629264
X26=0.37120956464817956
X27=-1.8791055025333052
X28=-1.2790826744313537
X29=-0.8150369612962106
X30=-0.08343010635041948
X31=-1.0201408804244034
X32=-0.5293414717824825
X33=-4.4127113786720065
X34=-2.9756275206939176
X35=-2.0222349844904874
X36=-1.3790536473294959
X37=-0.9022331545785207
X38=-0.3251428738220351
X39=-1.3637814489635551
X40=-0.8893583038994928
X41=-0.2963784747231665
X42=-1.2871128668662455
X43=-0.822325743167123
X44=-0.10902119046333758
X45=-1.0342878895057943
X46=-0.5489915337873275
X47=-6.9822885227693545
X48=-4.680020332909626
X49=-3.1527764448637754
X50=-2.140083129871087
X51=-1.4602171044569312
X52=-0.9685635995638602
X53=-0.4504371240959939
X54=-2.0883677454698484
X55=-1.4247054725546997
X56=-0.9399406438426444
X57=-0.40040427420864433
X58=-1.6793109477226182
X59=-1.1355642957994752
X60=-0.6723450974394425
X61=1.1010597171365635
X62=1.3916209468034497
X63=1.3285408122104765
X64=1.3247315055694269
X65=1.3247179574157972

(3)图形 


作者主页(文火冰糖的硅基工坊):https://blog.csdn.net/HiWangWenBing

本文网址:https://blog.csdn.net/HiWangWenBing/article/details/119813740

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[数值计算-7]:一元n次非线性方程求解-单点盲探-牛顿迭代法&Python法代码示例 的相关文章

随机推荐

  • unity shader 之基础四 数学

    4 2 笛卡尔坐标系 笛卡尔坐标系分为二维和三维坐标系 4 2 1二位坐标系 OpenGL 和 DirectX 二位坐标系是不同的 OpenGL 和 DirectX 是不同的图形访问接口 用来和硬件交互的 二维坐标系 是可以相互转换的 既
  • 【经典】centos 安装 mysql

    CentOS第一次安装MySQL的完整步骤 目录 1 官方安装文档 2 下载 Mysql yum包 3 安转软件源 4 安装mysql服务端 5 首先启动mysql 6 接着检查mysql 的运行状态 7 修改临时密码 7 1 获取MySQ
  • [转] 英文写作中分号和冒号的使用

    我们先来了解下分号和冒号的作用 分号的主要作用是来连接两个在语法上平等的成分 冒号的主要作用是引起读者对冒号后面内容的注意力 下面总结下规则 用分号的情况 1 用分号连接两个独立的句子 两个独立的句子不能够用逗号隔开 如果用逗号 必须逗号后
  • idea忽略.iml文件

    1 点击file文件下的设置中 2 点下file types 文件类型 进入到file types窗口 如图 然后点击忽略文件那添加需要忽略的类型
  • 自用HTML+CSS学习笔记

    HTML CSS学习笔记 1 Web标准 Web标准也称为网页标准 由一系列的标准组成 大部分由W3C World Wide Web Consortium 万维网联盟 负责制定 由三个组成部分 HTML 负责网页的结构 页面元素和内容 CS
  • IT的教育

    IT的教育 李颜芯 CSDN的网友大家好 欢迎大家收看这一起的CSDN视频访谈节目 今天我们请到了两位嘉宾 一位是 金旭亮 老师 一位是 金戈 老师 两位老师作一下自我介绍怎么样 金旭亮 我先介绍一下吧 我叫金旭亮是北京理工大学的讲师 我在
  • 怎样把pdf转换成word-多语言ocr支持

    http jingyan baidu com article 86fae34699bb4e3c49121a23 html PDF格式良好的视觉阅读性和通用性使得PDF文件的使用越来越广泛了 网络上的PDF资料也越来越多 但是我们往往想要提出
  • 【大屏】 amap + echarts 踩坑以及避免办法

    amap echarts 踩坑以及避免办法 大屏 踩坑 代码 大屏 html body container margin 0 padding 0 width 5376px height 1944px background color 000
  • softmax用于分类问题/逻辑回归

    参考 d2l 线性回归问题最后输出一个参数用于预测 多分类问题最后输出多个维度的数据 多少个output channels就有多少个类别 softmax是一种激活函数 它常见于分类问题的最后一层激活函数 目的是让输出属于一个概率密度函数 我
  • AI「领悟」有理论解释了!谷歌:两种脑回路内部竞争,训练久了突然不再死记硬背...

    梦晨 发自 凹非寺量子位 公众号 QbitAI 谷歌PAIR团队不久前撰文介绍了AI的 领悟 Grokking 现象 训练久了突然不再死记硬背 而是学会举一反三 有了泛化能力 不出一个月 另一只团队 主要成员来自DeepMind 表示 已经
  • 说实话,其实Spring Security并没有看起来那么复杂(附源码)

    权限管理是每个项目必备的功能 只是各自要求的复杂程度不同 简单的项目可能一个 Filter 或 Interceptor 就解决了 复杂一点的就可能会引入安全框架 如 Shiro Spring Security 等 其中 Spring Sec
  • Android Studio使用技巧:添加Module依赖

    今天在学习使用Volley的时候 下载好了Volley的Module文件 成功import到了Android Studio 但是却不知道怎么在自己的项目 Module 里使用 经朋友指点才知道原来还有给自己的项目添加Module Depen
  • JVM反射的实现

    实现方式 有两种不同的实现方式 一种是本地实现 一种是动态实现 JVM开始运行之后 方法的代码和入口地址都能获取到 想要通过反射调用方法 无非就是找到方法地址 然后将参数传递进去执行 本地实现就是使用native方法直接调用方法 但是这种方
  • PS调节图片:拉伸、变形

    一 对图片进行变形处理 打开PS软件 选中需要处理的图片 ctrl J复制一层图层 点击编辑选项 在下拉菜单里找到变换 变形选项 即可对图片进行变形操作 注意变形的图片下边还有一层图形 那即是我们复制图层的效果 复制图层相当于在图片上面加了
  • 计算机网络基础知识总结及思维导图(六)应用层

    文章目录 六 应用层 6 1 域名系统DNS 6 1 1 基础概念 6 1 2 域名服务器 6 2 文件传送协议 6 2 1 介绍 6 2 2 FTP协议 6 2 3 简单文件传送协议TFTP 6 3 远程终端协议TELNET 6 4 万维
  • 哪个网站云服务器最便宜,哪家云服务器比较便宜

    哪家 云服务器 是一种简单高效 安全可靠 处理能力可弹性伸缩的计算服务 其管理方式比物理服务器更简单高效 用户无需提前购买硬件 即可迅速创建或释放任意多台云服务器 我们在选择云服务器时 多从CPU 内存和磁盘特性等方面来对比 在这些因素相差
  • webdriver在浏览器中显示版本不对的解决方法

    相信看到这的小伙伴已经安装好了selenium包了 pip3 install selenium 可能是运行的时候出现这样的错误 SessionNotCreatedException Message session not created T
  • k8s系列——部署k8s集群

    1 环境准备 1 1 安装操作系统 此处选用centos 7 操作系统进行安装操作 1 2 关闭防火墙 systemctl stop firewalld systemctl disable firewalld 1 3 关闭selinux s
  • java使用okhttp3实现gofastdfs上传

    1 maven
  • [数值计算-7]:一元n次非线性方程求解-单点盲探-牛顿迭代法&Python法代码示例

    作者主页 文火冰糖的硅基工坊 https blog csdn net HiWangWenBing 本文网址 https blog csdn net HiWangWenBing article details 119813740 目录 1 一