数值计算笔记之非线性方程的求解(二)迭代法
0、基本原理:逐次逼近
给定某初始解,按
若{}收敛于,且 连续,则即为的解 ( )
迭代法收敛的充分条件
定理:若迭代函数满足
- 在区间上存在,且存在,使
则(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;
}
结果为:
数值计算笔记之非线性方程的求解(二)迭代法相关推荐
- 数值计算笔记之非线性方程的求解(一)二分法
二分法 若 在上连续,且,则在上必有解. 二分法的步骤: 第一步:取边界上的中点,求. 如图,是正确解,是第一个中点.考虑存在以下情况: ,则即为方程的解.这种情况很极端,极少出现. ,那么.同号,则 ...
- 非线性方程求解 不动点迭代法
非线性方程求解 不动点迭代法 Solution Knowledge 收敛定理一 可以尝试证明一下 1.不动点的存在性 2.不动点的唯一性 3.序列收敛 收敛定理二 这个的条件2更加简洁 可以尝试证明 ...
- 二维有限元方程matlab,有限元法求解二维Poisson方程的MATLAB实现
有限元法求解二维 Poisson 方程的 MATLAB 实现 陈 莲a ,郭元辉b ,邹叶童a ( 西华师范大学 a. 数学与信息学院; b. 教育信息技术中心,四川南充 6437009) 摘 要: ...
- 吴恩达《机器学习》学习笔记七——逻辑回归(二分类)代码
吴恩达<机器学习>学习笔记七--逻辑回归(二分类)代码 一.无正则项的逻辑回归 1.问题描述 2.导入模块 3.准备数据 4.假设函数 5.代价函数 6.梯度下降 7.拟合参数 8.用训练 ...
- 有限体积法求解二维方腔流(一)——动量方程和连续性方程的离散
1. 有限体积法求解二维方腔流–理论手册 1.1. 不可压缩流体控制方程 连续性方程 ∇⋅U=0(1)\nabla \cdot U=0 \tag{1} ∇⋅U=0(1) 动量方程 ∂U∂t+∇⋅(UU ...
- matlab 高斯迭代法求解,高斯迭代法matlab算例
Matlab 线性方程组的迭代解法 Gauss-Seidel 迭代法 Matlab 线性方程组的迭代解法 Gauss-Seidel 迭代法实验报告 1.熟悉 Gauss-Seidel 迭代法,并编写 ...
- 学习笔记之数据可视化(二)—— 页面布局(下)
续上一章 2.7 地图区域(.map) 2.7.1 实现步骤: 2.8 用户统计模块 2.8.1 布局: 2.8.2 柱状图 2.9 订单模块 2.9.1 订单区域布局 2.9.2 订单区域(orde ...
- 学习笔记之数据可视化(二)——页面布局(中)
续上一章 2.6 监控区域布局 2.6.1 布局结构解析: 2.6.2 样式描述: 2.6.3 HTML结构及CSS样式代码 2.6.3 ### 监控区域-效果 2.6.7 点位区域(point) 2 ...
- 学习笔记之数据可视化(二)——页面布局(上)
~续上一章 2. 项目页面布局 2.1 基础布局 2.1.1 PC端屏幕宽度适配设置 2.1.2 主体容器viewport背景图片 2.1.3 HTML结构 2.1.4 css样式代码 2.2 边框图 ...
最新文章
- Windows HTML本地快速渲染轨迹线
- python文本替换 数据库_Python pptx(Power Point)查找和替换文本(ctrl+H)
- Dev-C++安装教程附免费安装包资源
- CRM订单上状态字段在UI的显示逻辑
- Delphi中字符串比较大小 VS Oracle-SQL中字符串比较大小
- 阿里云再降价 数据库产品降20%
- 专题:补丁自动分发管理策略
- Git log diff config高级进阶
- 详解串行通信协议及其FPGA实现
- TCP/IP协议新手入门学习
- 机器学习基石1 学习笔记
- C# -> (Cshape)笔记
- 图片无损压缩 图片无损等比例缩放
- [NOIP2018]普及组游记
- 阿里云何登成:云时代的IT“新”治理
- Zookeepr分布式协调服务之基础铺垫(大数据工程师工作笔记)
- java外包恒大,JAVA开发工程师
- MTK平台唤醒源分类
- 设置stm32时钟频率 的flash等待问题?
- qt 练习 题目 7 网络 查询 股票实时数据
热门文章
- java老师实例_java实例关于继承求实例,有关学生和老师的程序代码!望诸位软件达人帮忙,谢谢大虾!...
- uniapp简单搞定支付传统的开发支付需要前后端做很多工作,各种参数的处理,签名,秘钥的验证校验等,尤其是涉及到多种不同的平台支付,更是繁琐;而且以往的支付是由后端主导的,如果后端是个菜鸡,那么做这
- 2.04 标志寄存器
- Wormhole for mac(在Mac上控制iOS和Android设备)
- java多线程 isAlive方法的有趣现象
- Axure 高保真 日期选择器实现 可选任意年/月/日
- 快慢指针慢指针和快指针一定会相遇
- PyCharm 快速批量注释及取消注释
- 证明求最短路径问题具有最优子结构(动态规划)
- latex排版[4]:子公式分别编号