matlab中方程根的近似计算
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一方程根的近似计算
一、问题
求非线性方程的根
二、实验目的
1、学会使用matlab中内部函数roots、solve、fsolve、fzero求解方程,并用之解决实际问题。
4、熟悉Matlab的编程思路,尤其是函数式M文件的编写方法。
三、预备知识
方程求根是初等数学的重要内容之一,也是科学和工程中经常碰到的数值计算问题。它的一般形式是求方程f(x)=0的根。如果有x*使得f(x*)=0,则称x*为f(x)=0的根,或函数f(x)的零点。并非所有的方程都能求出精确解或解析解。理论上已经证明,用代数方法可以求出不超过3次的代数方程的解析解,但对于次数大于等于5的代数方程,没有代数求根方法,即它的根不能用方程系数的解析式表示。至于超越方程,通常很难求出其解析解。不存在解析解的方程就需要结合具体方程(函数)的性质,使用作图法或数值法求出近似解。而计算机的发展和普及又为这些方法提供了广阔的发展前景,使之成为科学和工程中最实用的方法之一。下面介绍几种常见的求近似根的方法。
1. 求方程近似解的简单方法
1.1 图形方法—放大法求根
图形的方法是分析方程根的性态最简洁的方法。不过,不要总是想得到根的精确值。这些值虽然粗糙但直观,多少个根,在何范围,一目了然。并且还可以借助图形局部放大功能,将根定位得更加准确一些。
例1.1 求方程x5+2x2+4=0的所有根及其大致分布范围。
解
(1)画出函数f(x)=x5+2x2+4的图形,确定方程的实数根的大致范围。为此,在matlab命令窗中输入
clf
ezplot x-x,
grid on
hold on
ezplot('x^5+2*x^2+4',[-2*pi,2*pi])
1-1 函数f(x)=x5+2x2+4的图形
clf
x=-2*pi:0.1:2*pi;
y1=zeros(size(x));
y2= x.^5+2*x.^2+4;
plot(x,y1,x,y2)
grid on
axis tight
title('x^5+2x^2+4')
xlabel('x')
从图1-1可见,它有一个实数根,大致分布在-2与2之间。
(2)将作图范围不断缩小,用放大法可得到精度越来越高的根的近似值。在matlab命令窗中先后键入
subplot(2,2,1)
ezplot x-x, grid on, hold on, ezplot('x^5+2*x^2+4',[-2,2])
subplot(2,2,2)
ezplot x-x, grid on, hold on, ezplot('x^5+2*x^2+4',[-2,-1])
subplot(2,2,3)
ezplot x-x, grid on, hold on, ezplot('x^5+2*x^2+4',[-1.6,-1.5])
subplot(2,2,4)
ezplot x-x, grid on, hold on, ezplot('x^5+2*x^2+4',[-1.55,-1.54])
图1-2 放大法求函数f(x)=x5+2x2+4的根
由图1-2可知,方程的根在-1.545与-1.54之间。
1.2 数值方法
非线性方程f(x)=0求根的方法有区间法和迭代法两大类,二分法、弦位法是区间法,简单迭代法和牛顿迭代法及其变形是迭代法,这里只给出二分法、简单迭代法和牛顿迭代法的构造过程。
(1)根的隔离与二分法
根的隔离思想来源于连续函数的零点定理:
若函数f(x)在闭区间[a,b]上连续,且f(a)f(b)<0,则方程f(x)=0在(a,b)内至少有一根x *。
二分法是最简单的求根方法,它是利用连续函数的零点定理,将含根区间逐次减半缩小,取区间的中点构造收敛点列{x n }来逼近根x *。
用该方法求f(x)=0的近似解可分两步做:
第一步,确定根的近似位置或大致范围,即确定一个区间[a,b],使所求根是位于这个区间内的唯一实根。这个区间称为根的隔离区间,这可以通过函数作图达到:先画出y=f(x)的图形,然后从图上定出它与x 轴交点的大概位置。
第二步,以根的隔离区间[a,b]的端点作为根的初始近似值,用二分法逐步改进根的近似值的精确度,直至求得满足精确度的近似解。具体步骤如下:
取[a,b]的中点x 0=(a+b)/2,若f(x 0)=0,则x 0就是f(x)=0的根x *。若f(a)f(x 0)<0,则根x *必在区间(a,x 0)内,取a 1=a, b 1=x 0;否则根x *必在区间(x 0,b)内,取a 1=x 0, b 1=b 。这样,得到新区间[a 1,b 1],其长度为[a,b]的一半。如此继续下去,进行n 等分后,得到一组不断缩小的区间序列[a,b], [a 1,b 1], [a 2,b 2],…, [a n ,b n ],…,和对应区间的中点数列x n =(a n +b n )/2, n=0,1,2,…, 其中每个区间都含有根x *,满足
[a,b]⊃[a 1,b 1] ⊃[a 2,b 2] ⊃…⊃ [a n ,b n ] ⊃…
且每个区间的长度都是前一区间长度的一半。由于[a n ,b n ]的长度为(b-a)/2n ,当n 不断变大时,这些区间将收敛于一点x *,该点即为所求的根。
当做到第n 步时,有
1*11
22||()()
n n n n x x b a b a +-≤-=-
选择适当的步数n ,就可达到满意的精度。
用二分法,理论上区间中点序列{x n }将收敛到根的真值,但收敛速度较慢,所以通常用二分法为其他方法提供初步的近似值。
(2)简单迭代法
迭代法的基本原理是构造一个迭代公式,反复用它得出一个逐次逼近方程根的数列,数列中每一项都是方程根的近似值,只是精度不同。简单迭代法也成逐次迭代法,是非线性方程求根中各类迭代法的基础。
由于对方程作等价变换根不发生变换,将方程f(x)=0等价变换为
()x x ϕ=,构造迭代计算公式1()n n x x ϕ+=。取定初值x 0,算出数列{x n }。如果
{x n }收敛于x *,则有
**1lim lim ()(lim )()n n n n n n x x x x x ϕϕϕ+→∞
→∞
→∞
====
这说明,x *就是方程f(x)=0的根。上面()x x ϕ=称为不动点方程,()x ϕ称为迭代函数,数列{x n }称为迭代数列。
(3)牛顿迭代法
如果f(x)在[a,b]上具有二阶导数,f(a)f(b)<0,且f'(x)与f''(x)在[a,b]上保持同号,这时可采用牛顿迭代法求方程f(x)=0在(a,b)内的惟一实根。牛顿迭代法将非线性方程线性化处理为近似方程,然后用近似方程获得求根的迭代公式。具体做法如下:
设x n 是f(x)=0的一个近似根,把f(x)在x k 处作泰勒展开,得
f(x)=f(x k )+f'(x k )(x-x k )+(f''(x k )/2!)(x-x k )2+…
取前两项来近似代替f(x),则得近似线性方程
f(x)≈f(x k )+f'(x k )(x-x k )=0
如果f'(x k )≠0,令其解为x k+1,得