迭代法的作用

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

不动点迭代法

简单迭代法或基本迭代法又称不动点迭代法
1、不动点(FixedPoint)
首先来看一下什么是不动点:

换句话说,函数φ的不动点是y=φ(x)与y=x的交点,下图画出了函数y=cos(x)与y=x在区间[0,π/2]的交点,即cos(x)的不动点:

2、不动点迭代(Fixed Point Iteration)
不动点迭代的基本思想:

也就是说,为了求解方程f(x)=0,首先将方程转换为x=g(x),然后初始化x0,循环迭代xi+1=g(xi),直到满足收敛收件。
这里将方程f(x)=0转换为x=g(x)是很容易的,比如对于f(x)=x-cos(x),求解f(x)=0即为求解x-cos(x)=0,即x=cos(x),因此g(x)=cos(x)。
再例如对于方程:

可以等价为

还可以等价为

也就是说,将方程f(x)=0转换为x=g(x)有不同的方式,因此对方程f(x)=0来说,g(x)也不是唯一的。
3、不动点迭代的收敛性
这个迭代过程是很简单的,但这里有个关键性的问题:迭代收敛么?即经过N次迭代后是否会收敛于不动点?

通俗点讲,若要使不动点迭代收敛,则要求φ(x)在区间[a,b]上的函数值也在此区间内,另外还要求φ(x)的斜率绝对值不大于1。其证明过程比较复杂,有兴趣的可以查阅一些相关文献。

例题

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

先看看不用迭代法计算的结果

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(0, 0.11))
print(result)

结果:

FiniteSet(0.0623775815137495)

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

代码:

xl = 0  #区间下限
xu = 0.11  #区间上限
x = (xl+xu)/2  #迭代初始值
x_list = [x]
i = 0while True:x = x ** 3 - 0.165 * x ** 2 + 3.993 * 10 ** (-4) + xx_list.append(x)if len(x_list) > 1:i += 1error = abs((x_list[-1] - x_list[-2]) / x_list[-1])if error < 10**(-6):print(f'迭代第{i}次后,误差小于10^-6')breakelse:pass

结果:

迭代第777次后,误差小于10^-6
所求方程式的根为0.062370654088088

迭代至电脑默认误差为0

xl = 0  #区间下限
xu = 0.11  #区间上限
x = (xl+xu)/2  #迭代初始值
x_list = [x]
i = 0while True:x = x ** 3 - 0.165 * x ** 2 + 3.993 * 10 ** (-4) + xx_list.append(x)if len(x_list) > 1:i += 1error = abs((x_list[-1] - x_list[-2]) / x_list[-1])if error == 0:print(f'迭代第{i}次后,误差为0')breakelse:passprint(f'所求方程式的根为{x_list[-1]}')

结果:

迭代第3402次后,误差为0
所求方程式的根为0.062377581513749114

画迭代法

import matplotlib.pyplot as plt
xl = 0  #区间下限
xu = 0.11  #区间上限
x = (xl+xu)/2  #迭代初始值
x_list = [x]
i = 0x_values = []
y_values = []
while True:x = x ** 3 - 0.165 * x ** 2 + 3.993 * 10 ** (-4) + xx_list.append(x)if len(x_list) > 1:i += 1error = abs((x_list[-1] - x_list[-2]) / x_list[-1])x_values.append(i)y_values.append(error)if error == 0:print(f'迭代第{i}次后,误差为0')breakelse:passprint(f'所求方程式的根为{x_list[-1]}')#设置绘图风格
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 = 1, # 点的大小)
# 修改x轴和y轴标签
plt.xlabel('迭代次数')
plt.ylabel('误差值')
# 显示图形
plt.show()

结果:

迭代第3402次后,误差为0
所求方程式的根为0.062377581513749114

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

不动点迭代法(Fixed Point Iteration)迭代求根的python程序相关推荐

  1. 区间二分法(Bisection Method)迭代求根的python程序

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. 【机器学习】数值分析02——任意方程求根

    任意方程求根 全文目录 (博客园)机器学习 (Github)MachineLearning Math 1.简介 方程和函数是代数数学中最为重要的内容之一,从初中直到大学,我们都在研究着方程与函数,甚至 ...

  9. 数值分析2-解非线性方程的不动点迭代法,斯蒂芬森(steffensen)迭代法,牛顿法以及简化牛顿法的matlab程序

    对于形如f(x)=0的单变量非线性方程,可以构造不同的迭代函数进行迭代求根,以f(x)=x3-x-1为例,我们可以简单的通过等式变形构造出x=x3-1和x=(x+1)(1/3)两种等价形式:也可以自己 ...

最新文章

  1. Kotlin 二分法算法游戏--猜价格
  2. Java Stub 研究学习(2)
  3. 下载文件旁边附的MD5/SHA256等有什么用途?
  4. sql 2008 使用output避免数据修改后的二次查询
  5. 求和函数sumx_PowerBI公式-SUMX 函数
  6. RTUILabel+正则表达式
  7. 涉密文件检查工具_保密文件销毁咨询
  8. 如何修复MySQL配置文件?
  9. 数据库笔试题(答案)
  10. 联想Thinkpad E430 原装win8改版win7的BIOS设置
  11. 《C++ Primer》第9章 9.3节习题答案
  12. 在Linux中部署集群(零基础速学!)
  13. 为什么要上机械制造业ERP系统?对企业有什么帮助?
  14. Oracle中add_months()函数的用法
  15. 香港计算机授课型研究生,香港城市大学授课型研究生的要求高不高啊?
  16. SPSS数据分析流程经验总结
  17. FMOC-PEG-acid,FMOC-PEG-COOH,芴甲氧羰基PEG羧基用于探究新型材料
  18. Symbian开发入门
  19. 做前端的你还没用这些软件?? out 啦
  20. 长虹v8android os 2.3,3.7寸屏Android机 长虹HONPhone V8评测

热门文章

  1. Jmeter性能测试2
  2. 选择区域的检验tajimD
  3. 基于matlab的水下航行器建模与仿真,水下航行器尾流的感应电磁场模型与仿真
  4. http请求报文详解
  5. Java(标识符和关键字)
  6. 刚卖了印度的5000辆自行车,ofo又因500万欠款成被告,这个寒冬戴威尤其冷!
  7. VMware vsan群集开启EVC
  8. java 安卓 蓝牙_Android Bluetooth(蓝牙)实例
  9. 谷歌浏览器下载地址及chromedriver下载地址
  10. android添加横幅广告,android-如何获取适用于adMob的测试广告横幅...