区间二分法(Bisection Method)迭代求根的python程序
迭代法的作用
许多复杂的求解问题,都可以转换成方程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程序相关推荐
- 不动点迭代法(Fixed Point Iteration)迭代求根的python程序
迭代法的作用 许多复杂的求解问题,都可以转换成方程f(x)=0的求解问题.这一系列的解叫做方程的根.对于非线性方程的求解,在自变量范围内往往有多个解,我们将此变化区域分为多个小的子区间,对每个区间进行 ...
- 牛顿迭代法(Newton’s Method)迭代求根的Python程序
迭代法的作用 许多复杂的求解问题,都可以转换成方程f(x)=0的求解问题.这一系列的解叫做方程的根.对于非线性方程的求解,在自变量范围内往往有多个解,我们将此变化区域分为多个小的子区间,对每个区间进行 ...
- 使用二分法(Bisection Method)求平方根。
转自:https://www.weidianyuedu.com/ 使用二分法(Bisection Method)求平方根. def sqrtBI(x, epsilon): assert x>0, ...
- 关于牛顿迭代求根的笔记
关于牛顿迭代求根的笔记 牛顿迭代法(Newton's method)又称为牛顿-拉夫逊(拉弗森)方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求 ...
- matlab求根的原程序,MATLAB求根程序求帮助
我有一个函数g=m*(m1/m)*(m2/m)*(r^2)*rm*Wc1*cos(2*u),我需要一个程序求这个函数在在(-2*pi,2*pi)上所有的根. 其中u是自变量,其他所有参数都是已知.已知 ...
- 高斯-勒让德求积分的Python程序
理论知识: 勒让德多项式及性质 第四节 高斯(Gauss)求积公式 高斯-勒让德求积公式及Matlab实现 目标函数求积区间为[-1,1]时 代码: #高斯-勒让德求积公式 from sympy im ...
- 龙贝格算法求数值积分的Python程序
Ronberg Integration 分成n等份时辛普森公式的值 from sympy import *def f(t):f = 2000*log(140000/(140000-2100*t))-9 ...
- 求素数的python程序,Python-求素数程序
#!/usr/bin/python #-*- coding: utf-8 -*- import time from math import sqrt #根据概念判断: def SelectPrime1 ...
- 学习Matlab的第一个程序——用二分法求根
学习Matlab的第一个程序--用二分法求根 问题描述 matlab代码 遇到的一些问题和心得体会 问题描述 对于一个给定的方程f(x)=0和零点的大致区间(a,b),用二分法将区间(a,b)缩小,当 ...
最新文章
- 青源 Forum | 人工智能的数理基础前沿系列报告 · 第 4 期
- C++开源代码项目汇总
- python 类-Python入门--一篇搞懂什么是类
- layui 下拉选择框可以选择但不显示数据值_你想做的quot;基因药物疾病quot;网络数据在这里!...
- 悬挑脚手架卸载钢丝绳要求_安全不可忽视!脚手架搭设彩色图集,动画展示施工全过程,抠细节...
- 07_Influxdb+Grafana监控CPU
- C++数据结构与算法 队列的应用之图元识别
- Qt环境搭建(Visual Studio)
- python正则表达式怎么用_python正则表达式的使用
- 五种开源API网关实现组件对比
- css font-size 失效,css font-size不管用的经解决方法
- 打开word很慢(无网络时正常)
- 【ModelMapper简单使用】
- 【camera】手机相机系统
- 视频网站中video标签中blob:http
- uni-app 添加到“用其他应用打开”中、app加入系统分享列表、获取分享的文件
- [计算机组成原理]计算机发展历程篇
- 找规律万能公式_数字规律题有万能求解公式吗,只要能找出一种规律就行...?
- FreeType 管理字形
- 【评测】常规PCR(终点法,跑胶)的多重PCR的试剂
热门文章
- 基于java校园新闻管理系统数据库模块的论文_校园新闻管理系统设计与实现 大学论文.doc...
- YOLOv5实战垃圾分类目标检测
- Python理解面向对象
- 餐厅小票打印模板_快麦打印机教程 | 如何用手机控制DP358外卖小票机?
- 国家级搜索平台“chinaso 中国搜索”正式上线
- 修复好一个科脉软件-科脉御商软件数据库损坏问题
- 工作两年,靠BIG佬的Java面试宝典,跳槽到京东,月薪直涨10K
- css计算函数 scalc 微信小程序_在微信小程序中,基于云函数发送邮件
- java app崩溃分析工具_[原创]App崩溃率统计工具推荐
- 「智能新能源」时代,谁才是真正的硬核技术玩家?