0、基本原理:逐次逼近

给定某初始解,按     

若{}收敛于,且 连续,则即为的解 (   

迭代法收敛的充分条件

定理:若迭代函数满足

  1. 在区间存在,且存在,使

则(1)、任取初值,迭代法都收敛于方程的唯一实根。

(2)、         用于误差估计

(3)、            用于误差估计

例:用迭代法求方程     ,再内的根,要求,保留5位有效数字。

解:把原方程化为:

  • 存在,且

收敛。

n Xn
0 0
1 0.25000
2 0.29730
3 0.30721
4 0.30933
5 0.30937

 为近似解。

一、牛顿迭代法解方程

原理:求解,在函数f(x)图上任何一点画一条切线,然后确定切线与x轴的交点。这个方法需要一个初始值xo,此后的迭代公式为   。具体理解:

如图,设 的一个近似根,则由泰勒展开有:,若,则可得,重复该过程,有 。

matlab代码:

clear;
clc;
% fun = 2* x^3 - 4* x^2 + 3*x - 6;
x0 = 0;
error = 1;
f = subs(myfunction,x0);
df = subs(diff(myfunction),x0);
while error > 0.0001f = double(subs(myfunction,x0));          %加上double是为了显示结果为小数df = double(subs(diff(myfunction),x0));
%     f = sin(x0)+ x0 + 1;
%     df = cos(x0) + 1;root = x0 - f/df ;         %牛顿迭代公式error = abs(x0 - root);    %更新误差x0 = root;                 %更新初始值
end
format long
root

调用的函数为:

function y = myfunction
syms x;
y = sin(x) + x + 1;
end
  • syms是定义符号变量的函数,求导需要用到,没有申明的话,无法求导。
  • matlab中subs()是符号计算函数,表示将符号表达式中的某些符号变量替换为指定的新的变量,常用调用方式为:

    subs(S,OLD,NEW) 表示将符号表达式S中的符号变量OLD替换为新的值NEW。

  •  ,加上double是为了显示结果为小数

C++代码:

/* 牛顿迭代法 求方程根 */
#include <iostream>
#include"function.h"
using namespace std;int main()
{double x0, err, e, root;cout << "请输入初始值x0, x0 = "  ;cin >> x0;cout << "请输入误差限e, e = ";cin >> e;err = 10;                    //定义一个较大的数,使其进入循环while (err > e) {int n = 1;                   //迭代次数double x = x0;/*   double f = 2.0 * pow(x, 3) - 4 * pow(x, 2) + 3 * x - 6;double df = 6 * pow(x, 2) - 8 * x + 3;*/double f = Original_equation(x);double df = Integral_equation(x);x = x0 - f / df;root = x;err = fabs(x0 - root);x0 = x;n++;if (n > 150) {cout << "迭代次数太多,请更换算法,已推出程序!" << endl;break;}}cout << "方程的根为:root = " << root << endl;//cout << "Hello World!" << endl;
}

头文件为:

#pragma once
double Original_equation(double &x) {double y = 2.0 * pow(x, 3) - 4 * pow(x, 2) + 3 * x - 6;return y;
}double Integral_equation(double &x) {double dy = 6 * pow(x, 2) - 8 * x + 3;return dy;
}

结果为:

但是,作为计算一般性函数零解问题的算法,它有三个严重的缺陷。

  • 要求函数必须是光滑的;
  • 可能遇到导数不方便计算的困难;
  • 初始解必须靠近准确解。

至于优点,就是对于计算平方根的问题,牛顿法特别简洁有效。

二、弦截法(弦割法)

有的时候,求导是件很麻烦的事,所以弦截法就出来了。

首先了解一下差商:称 、两点的差商。其实在时,就是导数的定义。

原理:弦截法用最近两次选代解构造出的有限差分近似,替代牛顿法中的求导数计算,不同于牛顿法在f(x)曲线上某一点画切线的做法,它通过两个点画一条割线,下一个迭代解就是割线与x轴的交点。
割线法的迭代需要两个初始值,xo和x1,后续的迭代解按下面的公式计算:

1、定端点弦截法

  、          (牛顿法中的被割线的斜率所替代)。

2、变端点弦截法

  、       (牛顿法中的被割线的斜率所替代)。

matlab代码:

clear;
clc;
f = @(x) x^3 - x -1;
x0 = 1;
x1 = 1.5;
k = 0;
while abs(x1 - x0) > 0.0001s = (f(x1) - f(x0)) / (x1 - x0);root = x1 - f(x1) / s;x0 = x1;x1 = root;k = k + 1;if k > 150fprintf("循环次数太多,推出程序"); disp('循环次数太多,推出程序');root = NULL;break;end
end
% format long
root

结果为:

C++代码:

#include <iostream>
#include"function.h"
using namespace std;int main()
{/*弦截法*/double x0, x1, error;double x ;double root;int n = 0;cout << "请输入初始值x0, x0 = ";cin >> x0;cout << "请输入初始值x1, x1 = ";cin >> x1;cout << "请输入误差限error, error = ";cin >> error;while (fabs(x1 - x0) > error) {double s = equation2(x1, x0);root = x1 - equation1(x1) / s;x0 = x1;x1 = root;n++;if (n > 150) {cout << "迭代次数太多,请更换算法,已推出程序!" << endl;break;}}cout << "方程的根为:root = " << root << endl;//cout << "Hello World!" << endl;
}

头文件:

#pragma once
double equation1(double &x) {double y = pow(x, 3) - x - 1;return y;
}
double equation2(double &x1, double &x0) {double s = (equation1(x1) - equation1(x0)) / (x1 - x0);return s;
}

结果为:

数值计算笔记之非线性方程的求解(二)迭代法相关推荐

  1. 数值计算笔记之非线性方程的求解(一)二分法

    二分法 若 在上连续,且,则在上必有解. 二分法的步骤: 第一步:取边界上的中点,求. 如图,是正确解,是第一个中点.考虑存在以下情况: ,则即为方程的解.这种情况很极端,极少出现. ,那么.同号,则 ...

  2. 非线性方程求解 不动点迭代法

    非线性方程求解 不动点迭代法 Solution Knowledge 收敛定理一 可以尝试证明一下 1.不动点的存在性 2.不动点的唯一性 3.序列收敛 收敛定理二 这个的条件2更加简洁 可以尝试证明 ...

  3. 二维有限元方程matlab,有限元法求解二维Poisson方程的MATLAB实现

    有限元法求解二维 Poisson 方程的 MATLAB 实现 陈 莲a ,郭元辉b ,邹叶童a ( 西华师范大学 a. 数学与信息学院; b. 教育信息技术中心,四川南充 6437009) 摘 要: ...

  4. 吴恩达《机器学习》学习笔记七——逻辑回归(二分类)代码

    吴恩达<机器学习>学习笔记七--逻辑回归(二分类)代码 一.无正则项的逻辑回归 1.问题描述 2.导入模块 3.准备数据 4.假设函数 5.代价函数 6.梯度下降 7.拟合参数 8.用训练 ...

  5. 有限体积法求解二维方腔流(一)——动量方程和连续性方程的离散

    1. 有限体积法求解二维方腔流–理论手册 1.1. 不可压缩流体控制方程 连续性方程 ∇⋅U=0(1)\nabla \cdot U=0 \tag{1} ∇⋅U=0(1) 动量方程 ∂U∂t+∇⋅(UU ...

  6. matlab 高斯迭代法求解,高斯迭代法matlab算例

    Matlab 线性方程组的迭代解法 Gauss-Seidel 迭代法 Matlab 线性方程组的迭代解法 Gauss-Seidel 迭代法实验报告 1.熟悉 Gauss-Seidel 迭代法,并编写 ...

  7. 学习笔记之数据可视化(二)—— 页面布局(下)

    续上一章 2.7 地图区域(.map) 2.7.1 实现步骤: 2.8 用户统计模块 2.8.1 布局: 2.8.2 柱状图 2.9 订单模块 2.9.1 订单区域布局 2.9.2 订单区域(orde ...

  8. 学习笔记之数据可视化(二)——页面布局(中)

    续上一章 2.6 监控区域布局 2.6.1 布局结构解析: 2.6.2 样式描述: 2.6.3 HTML结构及CSS样式代码 2.6.3 ### 监控区域-效果 2.6.7 点位区域(point) 2 ...

  9. 学习笔记之数据可视化(二)——页面布局(上)

    ~续上一章 2. 项目页面布局 2.1 基础布局 2.1.1 PC端屏幕宽度适配设置 2.1.2 主体容器viewport背景图片 2.1.3 HTML结构 2.1.4 css样式代码 2.2 边框图 ...

最新文章

  1. Windows HTML本地快速渲染轨迹线
  2. python文本替换 数据库_Python pptx(Power Point)查找和替换文本(ctrl+H)
  3. Dev-C++安装教程附免费安装包资源
  4. CRM订单上状态字段在UI的显示逻辑
  5. Delphi中字符串比较大小 VS Oracle-SQL中字符串比较大小
  6. 阿里云再降价 数据库产品降20%
  7. 专题:补丁自动分发管理策略
  8. Git log diff config高级进阶
  9. 详解串行通信协议及其FPGA实现
  10. TCP/IP协议新手入门学习
  11. 机器学习基石1 学习笔记
  12. C# -> (Cshape)笔记
  13. 图片无损压缩 图片无损等比例缩放
  14. [NOIP2018]普及组游记
  15. 阿里云何登成:云时代的IT“新”治理
  16. Zookeepr分布式协调服务之基础铺垫(大数据工程师工作笔记)
  17. java外包恒大,JAVA开发工程师
  18. MTK平台唤醒源分类
  19. 设置stm32时钟频率 的flash等待问题?
  20. qt 练习 题目 7 网络 查询 股票实时数据

热门文章

  1. java老师实例_java实例关于继承求实例,有关学生和老师的程序代码!望诸位软件达人帮忙,谢谢大虾!...
  2. uniapp简单搞定支付传统的开发支付需要前后端做很多工作,各种参数的处理,签名,秘钥的验证校验等,尤其是涉及到多种不同的平台支付,更是繁琐;而且以往的支付是由后端主导的,如果后端是个菜鸡,那么做这
  3. 2.04 标志寄存器
  4. Wormhole for mac(在Mac上控制iOS和Android设备)
  5. java多线程 isAlive方法的有趣现象
  6. Axure 高保真 日期选择器实现 可选任意年/月/日
  7. 快慢指针慢指针和快指针一定会相遇
  8. PyCharm 快速批量注释及取消注释
  9. 证明求最短路径问题具有最优子结构(动态规划)
  10. latex排版[4]:子公式分别编号