【数学知识】非线性方程求解的二分法以及牛顿迭代法

  • 导入包
  • 二分法
    • 问题1
    • 编程作业
  • 牛顿迭代法
    • 编程作业

本博客不谈及理论推导,只提供代码实现,关于理论推导,大家可以查看其它博客文章。

导入包

import sys
import math
import sympy as sp
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

二分法

class ConditionError(Exception):def __init__(self,ErrorInfo):super().__init__(self)self.errormsg = ErrorInfodef __str__(self):return self.errormsg
def BisectionMethod(f,a,b,err=1e-5,max_iter=100):'''A root-finding method:Bisection method.Args----------f: callable functionThe nonlinear function to be solved.a,b: floatThe initial interval, which satisfies the condition:a<berr: floatTollerence of the result.max_iter: intMaximun iterations.Outs----------x0: floatThe root between interval [a,b].tol: floatTollerence of the result.iters:Number of iterations when the method stopped.'''if a>b:raise ConditionError('Wrong interval setup,it must be: a<b')if (f(a)>0 and f(b)>0) or (f(a)<0 and f(b)<0):print("Can't find the root of function as the condition is insurficient!")n = 1while n<max_iter:c = (a+b)/2print("n={},c={}".format(n,f(c)))if  f(c)==0 or (b-a)/2<err:x0=cbreakn += 1if f(a)*f(c)>0: a = celse:b = cprint("求解结果:n={},tol={},x0={}".format(n,abs(f(x0)),x0))tol, iters = abs(f(x0)), nreturn x0,tol,iters

问题1

求解方程
(x+5)(x−1)(x−3)=0(x+5)(x-1)(x-3)=0 (x+5)(x−1)(x−3)=0

求解步骤:
1、画图确定根的大致位置,选择根的初始区间[a,b]
2、使用二分法函数BisectionMethod进行求解

def f(x):'''Nonlinear function to be solved$f(x)=(x+5)(x-1)(x-3)$'''return (x+5)*(x-1)*(x-3)x = np.linspace(-6, 6, num = 1000)
y = f(x)
plt.plot(x,y)
ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')         # 将右边 上边的两条边颜色设置为空 其实就相当于抹掉这两条边ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')          # 指定下边的边作为x轴   指定左边的边为y轴ax.spines['bottom'].set_position(('data', 0))   #指定data设置的bottom(也就是指定的x轴)绑定到y轴的0这个点上
ax.spines['left'].set_position(('data', 0))

BisectionMethod(f,-7,4,err=1e-5)
n=1,c=39.375
n=2,c=28.546875
n=3,c=-35.712890625
n=4,c=2.945556640625
n=5,c=-14.629669189453125
n=6,c=-5.418788909912109
n=7,c=-1.1327033042907715
n=8,c=0.9321668744087219
n=9,c=-0.09380341321229935
n=10,c=0.4207942122593522
n=11,c=0.16389898478519171
n=12,c=0.03514874020766001
n=13,c=-0.029302090633791522
n=14,c=0.002929635346163195
n=15,c=-0.01318464989051904
n=16,c=-0.005127112848040127
n=17,c=-0.0010986401466772655
n=18,c=0.000915522250586609
n=19,c=-9.155278530671024e-05
n=20,c=0.0004119862733211405
n=21,c=0.00016021712917794583
求解结果:n=21,tol=0.00016021712917794583,x0=-4.999996662139893(-4.999996662139893, 0.00016021712917794583, 21)
BisectionMethod(f,0,2,err=1e-5)
n=1,c=-0.0
求解结果:n=1,tol=0.0,x0=1.0(1.0, 0.0, 1)
BisectionMethod(f,2,4,err=1e-5)
n=1,c=0.0
求解结果:n=1,tol=0.0,x0=3.0(3.0, 0.0, 1)

编程作业

使用二分法求解以下方程的根:
x2−ex=0x^2-e^x=0 x2−ex=0

# 请在此区域书写求解代码

牛顿迭代法

  • 使用到包sympy
    sympy教程:https://geek-docs.com/python/python-tutorial/python-sympy.html
    SymPy 是用于符号数学的 Python 库。 它旨在成为功能齐全的计算机代数系统。 SymPy 包括从基本符号算术到微积分,代数,离散数学和量子物理学的功能。 它可以在 LaTeX 中显示结果。
    SymPy 是使用pip install sympy命令安装的。
t = np.linspace(-5,5,100)
y = t*np.exp(t)-100
plt.plot(t,y)
ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')         # 将右边 上边的两条边颜色设置为空 其实就相当于抹掉这两条边ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')          # 指定下边的边作为x轴   指定左边的边为y轴ax.spines['bottom'].set_position(('data', 0))   #指定data设置的bottom(也就是指定的x轴)绑定到y轴的0这个点上
ax.spines['left'].set_position(('data', 0))

def NewtonMethod(f,x0,err=1e-5,max_iter=1000):'''A root-finding method:Newton method.Args----------f: callable functionThe nonlinear function to be solved.x0: floatThe initial x0err: floatTollerence of the result.max_iter: intMaximun iterations.Outs----------result: floatThe root between interval.'''x=sp.symbols("x")f=sp.integrate(f, x)  # 先求不定积分f=sp.diff(f)  # 再求导if sp.diff(f).subs(x,x0)==0:return x0n=1x_new=x0while n<=max_iter:x_new=x0-f.subs(x,x0)/sp.diff(f).subs(x,x0)#x_new=float(x_new)if math.fabs(x_new-x0)<err:return float(x_new)x0=x_newn+=1print("无法在设定的循环步数内获得指定精度的近似解")return float(x_new)
x=sp.symbols("x")  # 定义符号
f=x*sp.exp(x)-100  # 需要注意,各种初等函数符号,例如exp,cos,sin等,均需要使用sympy指定的符号构建
x0 = 3
xr = NewtonMethod(f,x0,err=1e-3,max_iter=1000)
print("求根结果:", float(xr))
求根结果: 3.385630140831713

编程作业

使用牛顿迭代法求解以下方程的根:
x3−ex=0x^3-e^x=0 x3−ex=0

# 请在此区域书写求解代码

【作者简介】陈艺荣,男,目前在华南理工大学电子与信息学院广东省人体数据科学工程技术研究中心攻读博士,担任IEEE Access、IEEE Photonics Journal的审稿人。两次获得美国大学生数学建模竞赛(MCM)一等奖,获得2017年全国大学生数学建模竞赛(广东赛区)一等奖、2018年广东省大学生电子设计竞赛一等奖等科技竞赛奖项,主持一项2017-2019年国家级大学生创新训练项目获得优秀结题,参与两项广东大学生科技创新培育专项资金、一项2018-2019年国家级大学生创新训练项目获得良好结题,发表SCI论文4篇,授权实用新型专利8项,受理发明专利13项。
我的主页
我的Github
我的CSDN博客
我的Linkedin

【数学知识】非线性方程求解的二分法以及牛顿迭代法相关推荐

  1. python迭代法求解非线性方程_荐【数学知识】非线性方程求解的二分法以及牛顿迭代法...

    [数学知识]非线性方程求解的二分法以及牛顿迭代法 本博客不谈及理论推导,只提供代码实现,关于理论推导,大家可以查看其它博客文章. 导入包 import sys import math import s ...

  2. 二分法求方程的根_快速求解方程的根——二分法与牛顿迭代法

    今天是周四高等数学专题的第7篇文章. 之前的文章和大家聊了许多数学上的理论,今天和大家聊点有用的东西. 我们都知道,工业上的很多问题经过抽象和建模之后,本质还是数学问题.而说到数学问题就离不开方程,在 ...

  3. java牛顿法求方程根_快速求解方程的根——二分法与牛顿迭代法

    今天是周四高等数学专题的第7篇文章. 之前的文章和大家聊了许多数学上的理论,今天和大家聊点有用的东西. 我们都知道,工业上的很多问题经过抽象和建模之后,本质还是数学问题.而说到数学问题就离不开方程,在 ...

  4. 最优化算法数学详解之——梯度下降法和牛顿迭代法

    目录 应用情景 为何不直接求解析解? 梯度下降法 牛顿迭代法 两种算法比较 应用情景 当我们有了一堆数据,需要用这堆数据构建模型时,首先需要确定模型中的变量,其次确定模型形式,最后需要确定模型中的参数 ...

  5. 【数学】手写开根号(牛顿迭代法 | 二分)

    题目链接 [编程题]开根号 题面 在没有任何数学库函数的情况下,求一个数 m 开 n 次方的结果. 输入描述: 每组输入只有1行,包括有一个正实数m和一个正整数n,其中1<=n<=321 ...

  6. JAVA实现开根号的两种方式:二分法以及牛顿迭代法

    public class demo {public static void main(String[] args) {System.out.println("---- 二分法计算根号 --- ...

  7. 二元牛顿迭代法matlab,Matlab编写二分法及牛顿迭代法

    谈到单根区间上方程求根的近似算法,我们第一印象就是高中的时候接触的二分法,正如其名称,二分法就是通过每次把f(x)的零点所在小区间收缩一半的方法,使区间的两个端点逐步迫近函数的零点,以求得零点的近似值 ...

  8. c语言牛顿迭代法求解非线性方程组,利用牛顿迭代法求解非线性方程组

    最近一个哥们,是用牛顿迭代法求解一个四变量方程组的最优解问题,从网上找了代码去改进,但是总会有点不如意的地方,迭代的次数过多,但是却没有提高精度,真是 最近一个哥们,是用牛顿迭代法求解一个四变量方程组 ...

  9. matlab如何用二分法求非线性方程,Matlab学习手记——非线性方程求解:二分法

    功能:二分法求解非线性方程的一个解,采用递归的方式. 源码 function root = HalfInterval_Search(fun, a, b, eps) % 二分法求函数fun在区间[a b ...

  10. 非线性方程求解 :二分迭代法和牛顿迭代法

    在机器人算法开发中,经常会遇到求解非线性方程.非线性方程的求解十分困难,这里介绍两种方法: 1. 二分法 2.牛顿迭代法 定义: 非线性方程,就是因变量与自变量之间的关系不是线性的关系,这类方程很多, ...

最新文章

  1. 连接不上ftp解决方案
  2. 顶尖技术专家严选,15场前沿论坛思辨,2019中国大数据技术大会邀您共赴
  3. 大一计算机考试题库window,2016年计算机考试Windows题库及答案
  4. Batch Normalization的TensorFlow实现
  5. Oracle对数据的导出和导入,建立用户,删除用户以及其下的所有表
  6. 如果你的Windows无法连接L2TP协议的***,809错误
  7. linux 小命令1
  8. BugkuCTF-Crypto题MathEnglish
  9. 隐私泄漏在线检测源码
  10. Eigen官网教程 (4) 高级初始化
  11. js中的charAt,indexOf
  12. PXE+kickstart 无人值守安装CentOS 6
  13. MySQL索引的原理,B+树、聚集索引和二级索引的结构分析
  14. 计算机网络布线开题报告,网络综合布线开题报告.docx
  15. 在Chrome浏览器添加IDM插件——顽强版
  16. varchar2改为clob的解决步骤
  17. 吸引子传播(Affinity Propagation)算法
  18. eclipse安装red5插件,创建red5项目
  19. 数据分析报告这样写,才算真正读懂了数据
  20. Delphi CxGrid 用法详解

热门文章

  1. 第三届蓝桥杯Java组 黄金队列
  2. 亚马逊中国公布2020年第一季度付费电子书畅销榜名单
  3. 安卓自动化工具:解锁屏幕+打开支付宝蚂蚁森林+收取能量+种树浇水+自动退出
  4. 决策树----对天气和自身状态是否适合去运动做出预测
  5. 【原创项目】GC Server 更新
  6. CKEditor 4.x 批量图片上传插件
  7. javascript思维导图大全
  8. electron Mac版截图功能实现
  9. E4A安卓app制作——初识易安卓(一)
  10. html文本显示不完整,css 内容显示不全怎么办