迭代法的作用

许多复杂的求解问题,都可以转换成方程f(x)=0的求解问题。这一系列的解叫做方程的根。对于非线性方程的求解,在自变量范围内往往有多个解,我们将此变化区域分为多个小的子区间,对每个区间进行分别求解。我们在求解过程中,选取一个近似值或者近似区间,然后运用迭代方法逐步逼近真实解。
方程求根的常用迭代法有:二分法、不动点迭代、牛顿法、弦截法。

二分法

求实根最简单有效的方法:二分法。易于在计算机上实现,且对于函数f(x)的性质要求不高,仅仅要求它在有根区间上连续,且区间端点的函数值异号即可。它的缺点是不能求偶数重根,也不能求复根,收敛速度与以1/2为公比的等比数列相同,不算太快,因此一般在求方程近似根时,不太单独使用,常用它来为其他方法求方程近似根提供好的初值区间(重要:初值区间的确定直接决定求解的速度)。

二分法基本思想

把函数f(x)的零点所在的区间[a,b](满足f(a)×f(b)<0)“一分为二”,得到[a,m]和[m,b]。根据“f(a)●f(m)<0”是否成立,取出零点所在的区间[a,m]或[m,b],仍记为[a,b]。所对得的区间[a,b]重复上述步骤,直到包含零点的区间[a,b]“足够小”,则[a,b]内的数可以作为方程的近似解。

二分法计算步骤


详细步骤:



例题

求方程式:x3 - 0.165*x2 + 3.993*10**(-4) = 0在(0,0.11)的根

牛刀小试
代码:

xl = 0
xu = 0.11def f(x):f = x**3 - 0.165*x**2 + 3.993*10**(-4)  #需要求根的函数return ffor i in range(100):     #进行100次迭代,迭代次数自己定xm = (xl + xu) / 2if f(xm) == 0:breakelse:passif f(xl) * f(xm) < 0:xl =xlxu = xmelif f(xl) * f(xm) > 0:xl = xmxu = xuelse:break
print(xl , xu)
print('方程的根为:', (xl + xu) / 2)

结果:

0.06237758151374948 0.06237758151374953
方程的根为: 0.0623775815137495

约定一个误差,当误差小于某个数值的时候,迭代停止
代码如下:

xl = 0
xu = 0.11def f(x):f = x**3 - 0.165*x**2 + 3.993*10**(-4)  #需要求根的函数return fxm_list = []
m = 0
while True:xm = (xl + xu) / 2xm_list.append(xm)m += 1if f(xm) == 0:breakelse:passif f(xl) * f(xm) < 0:xl =xlxu = xmelif f(xl) * f(xm) > 0:xl = xmxu = xuelse:breakif len(xm_list) > 1:error = abs((xm_list[-1] - xm_list[-2]) / xm_list[-1])if error < 10 ** (-6):print(f'迭代第{m}次后,误差小于10^(-6),误差为{error}')breakelse:pass
print(xl , xu)
print(f'得到方程的根为:{(xl + xu) / 2}')

结果:

迭代第21次后,误差小于10^(-6),误差为8.408809405129639e-07
0.062377543449401864 0.062377595901489266
得到方程的根为:0.06237756967544557

迭代至电脑默认误差为0

xl = 0
xu = 0.11def f(x):f = x**3 - 0.165*x**2 + 3.993*10**(-4)  #需要求根的函数return fm = 0
while True:xm = (xl + xu) / 2m += 1if f(xm) == 0:breakelse:passif f(xl) * f(xm) < 0:xl =xlxu = xmelif f(xl) * f(xm) > 0:xl = xmxu = xuelse:break
print(xl , xu)
print(f'迭代第{m}次后,误差为0,得到方程的根为:{(xl + xu) / 2}')

结果:

0.06237758151374948 0.06237758151374953
迭代第52次后,误差为0,得到方程的根为:0.0623775815137495

画迭代图
代码:

import matplotlib.pyplot as plt
xl = 0
xu = 0.11def f(x):f = x**3 - 0.165*x**2 + 3.993*10**(-4)  #需要求根的函数return fxm_list = []
x_values = []
y_values = []
m = 0
while True:xm = (xl + xu) / 2xm_list.append(xm)m += 1if f(xm) == 0:breakelse:passif f(xl) * f(xm) < 0:xl =xlxu = xmelif f(xl) * f(xm) > 0:xl = xmxu = xuelse:breakif len(xm_list) > 1:error = abs((xm_list[-1] - xm_list[-2]) / xm_list[-1])x_values.append(m)y_values.append(error)if error == 0:breakelse:pass
print(f'xl={xl},xu={xu}')
print(f'迭代第{m}次后,误差为0,得到方程的根为:{(xl + xu) / 2}')#设置绘图风格
plt.style.use('ggplot')
#处理中文乱码
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
#坐标轴负号的处理
plt.rcParams['axes.unicode_minus']=False
#横坐标是迭代次数
#纵坐标是误差值
plt.plot(x_values,y_values,color = 'steelblue', # 折线颜色marker = 'o', # 折线图中添加圆点markersize = 3, # 点的大小)
# 修改x轴和y轴标签
plt.xlabel('迭代次数')
plt.ylabel('误差值')
# 显示图形
plt.show()

结果:

xl=0.06237758151374948,xu=0.06237758151374953
迭代第52次后,误差为0,得到方程的根为:0.0623775815137495


对比牛顿迭代法,牛顿迭代法要快很多,而且准确率也高
牛顿迭代法(Newton’s Method)迭代求根的Python程序

不用迭代,直接得到高次方程的解:

from sympy import *
from sympy.abc import xdef func(x):return x**3 - 0.165*x**2 + 3.993*10**(-4)
result = solve(func(x),x)
print(result)

结果:

[-0.0437370862084818 + 0.e-24*I, 0.0623775815137495 + 0.e-22*I, 0.146359504694732 - 0.e-24*I]

【问题】
0.e-24*I 到底是什么含义呢?
有路过的大神看到了,请帮忙在评论区解答一下
【解答】

from sympy import *
from sympy.abc import xdef func(x):return x**3 - 0.165*x**2 + 3.993*10**(-4)
result = solveset(func(x), x, Interval(-1, 1))
print(result)

结果:

FiniteSet(-0.0437370862084818, 0.0623775815137495, 0.146359504694732)

所以0.e-24*I 的含义是精度

区间二分法(Bisection Method)迭代求根的python程序相关推荐

  1. 不动点迭代法(Fixed Point Iteration)迭代求根的python程序

    迭代法的作用 许多复杂的求解问题,都可以转换成方程f(x)=0的求解问题.这一系列的解叫做方程的根.对于非线性方程的求解,在自变量范围内往往有多个解,我们将此变化区域分为多个小的子区间,对每个区间进行 ...

  2. 牛顿迭代法(Newton’s Method)迭代求根的Python程序

    迭代法的作用 许多复杂的求解问题,都可以转换成方程f(x)=0的求解问题.这一系列的解叫做方程的根.对于非线性方程的求解,在自变量范围内往往有多个解,我们将此变化区域分为多个小的子区间,对每个区间进行 ...

  3. 使用二分法(Bisection Method)求平方根。

    转自:https://www.weidianyuedu.com/ 使用二分法(Bisection Method)求平方根. def sqrtBI(x, epsilon): assert x>0, ...

  4. 关于牛顿迭代求根的笔记

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

  5. matlab求根的原程序,MATLAB求根程序求帮助

    我有一个函数g=m*(m1/m)*(m2/m)*(r^2)*rm*Wc1*cos(2*u),我需要一个程序求这个函数在在(-2*pi,2*pi)上所有的根. 其中u是自变量,其他所有参数都是已知.已知 ...

  6. 高斯-勒让德求积分的Python程序

    理论知识: 勒让德多项式及性质 第四节 高斯(Gauss)求积公式 高斯-勒让德求积公式及Matlab实现 目标函数求积区间为[-1,1]时 代码: #高斯-勒让德求积公式 from sympy im ...

  7. 龙贝格算法求数值积分的Python程序

    Ronberg Integration 分成n等份时辛普森公式的值 from sympy import *def f(t):f = 2000*log(140000/(140000-2100*t))-9 ...

  8. 求素数的python程序,Python-求素数程序

    #!/usr/bin/python #-*- coding: utf-8 -*- import time from math import sqrt #根据概念判断: def SelectPrime1 ...

  9. 学习Matlab的第一个程序——用二分法求根

    学习Matlab的第一个程序--用二分法求根 问题描述 matlab代码 遇到的一些问题和心得体会 问题描述 对于一个给定的方程f(x)=0和零点的大致区间(a,b),用二分法将区间(a,b)缩小,当 ...

最新文章

  1. 青源 Forum | 人工智能的数理基础前沿系列报告 · 第 4 期
  2. C++开源代码项目汇总
  3. python 类-Python入门--一篇搞懂什么是类
  4. layui 下拉选择框可以选择但不显示数据值_你想做的quot;基因药物疾病quot;网络数据在这里!...
  5. 悬挑脚手架卸载钢丝绳要求_安全不可忽视!脚手架搭设彩色图集,动画展示施工全过程,抠细节...
  6. 07_Influxdb+Grafana监控CPU
  7. C++数据结构与算法 队列的应用之图元识别
  8. Qt环境搭建(Visual Studio)
  9. python正则表达式怎么用_python正则表达式的使用
  10. 五种开源API网关实现组件对比
  11. css font-size 失效,css font-size不管用的经解决方法
  12. 打开word很慢(无网络时正常)
  13. 【ModelMapper简单使用】
  14. 【camera】手机相机系统
  15. 视频网站中video标签中blob:http
  16. uni-app 添加到“用其他应用打开”中、app加入系统分享列表、获取分享的文件
  17. [计算机组成原理]计算机发展历程篇
  18. 找规律万能公式_数字规律题有万能求解公式吗,只要能找出一种规律就行...?
  19. FreeType 管理字形
  20. 【评测】常规PCR(终点法,跑胶)的多重PCR的试剂

热门文章

  1. 基于java校园新闻管理系统数据库模块的论文_校园新闻管理系统设计与实现 大学论文.doc...
  2. YOLOv5实战垃圾分类目标检测
  3. Python理解面向对象
  4. 餐厅小票打印模板_快麦打印机教程 | 如何用手机控制DP358外卖小票机?
  5. 国家级搜索平台“chinaso 中国搜索”正式上线
  6. 修复好一个科脉软件-科脉御商软件数据库损坏问题
  7. 工作两年,靠BIG佬的Java面试宝典,跳槽到京东,月薪直涨10K
  8. css计算函数 scalc 微信小程序_在微信小程序中,基于云函数发送邮件
  9. java app崩溃分析工具_[原创]App崩溃率统计工具推荐
  10. 「智能新能源」时代,谁才是真正的硬核技术玩家?