数值计算方法——第一节方程的根的求解

方程的根的求法——交叉法,迭代法

迭代法

一、迭代法基本原理介绍
  1. 迭代法的基本思想
    将方程改写成某种等价形式,由等价形式构造出相应的迭代公式,然后选择方程的某个初始近似根x_0,代入迭代公式,反复矫正,逼近所求的根的近似值,直到达到满足的精度为止。
    给定一个方程f(x)=0,要求求出这个方程的一个近似的根。我们给出计算过程:
  • 将方程改写成为x=g(x)的等价形式。比如改写成:x=x+f(x)②(右边的x+f(x)就相当于g(x))。
  • 给定一个初值x_0代入②式的右端,得到x_1=g(x_0 ),x_2=g(x_1 ),x3=g(x_2)……
  • 通过(2),本质是一个递推式,即上述的迭代公式:x_(k+1)=g(x_k ),k=0,1,2,3……进而我们得到一个序列{x_k },即{x_0,x_1,x_2……x_k……}。
  • 如果序列{x_k}有极限x*,那么x*即是所求的方程的近似根。或者说按照所给的精度(比如0.001)如果偏差|x_(k+1)-x_k|<ε,ε≤0.001,那么就保证了迭代误差|x-x_k|足够小。因此|x_(k+1)-x_k|<ε往往作为迭代结束的条件。
  1. 此方法的几何意义:
    y=x与y=g(x)的图像的交点——
    在这里插入图片描述
  2. 给出一个例子:求方程:x^3-x-1=0的根
    我们将上述方程改写成为它的一个等价形式:x=∛(x+1)
    选择初始值x_0=1.5

在这里插入图片描述
4. 关于迭代法中g(x)的选择的问题
虽然迭代法的思想简单,但是并不是每次都能得到根的值:g(x)的选择是关键点。还是以方程x^3-x-1=0为例,假如我们将方程改写成为另外一种形式:
在这里插入图片描述
我们仍取初值x_0=1.5,然后建立迭代公式:
在这里插入图片描述
经过迭代我们发现𝑥1=2.375,𝑥2=12.3976……一直迭代下去并没有发现序列收敛。所以𝑔(𝑥)的选择是很重要的。

定理:设方程x=g(x),在(a,b)内有根x,满足李普希兹(Lipschitz)条件:即对(a,b)内任意的x_1,x_2 都有:
在这里插入图片描述
其中q为一个确定的正数,且q<1。那么方程在(a, b)内有唯一的根。
且迭代公式:
在这里插入图片描述
对于任意初始近似值x_0均收敛于方程的根x

需要说明三点:
①要验证g(x)满足李普希兹条件是比较困难的,若g(x)可微,可以利用充分条件
在这里插入图片描述
来替代李普希兹条件。否则不一定能满足求出收敛的根x*。
②迭代的终止条件:|x_(k+1)-x_k|<ε。
③在上面我们已经说过,确定g(x)是比较重要的。选取不当的话,迭代的结果不会收敛。最一般地,g(x)可以写成这种形式:
x+α(x)f(x);
即方程x=x+α(x)f(x)的形式,这样可以通过选取α(x),使其满足①中给出的充分条件。

二、常用的确定g(x)的方法

1.牛顿法(Newton-Raphson Method)
(1)在牛顿法中,我们选择
在这里插入图片描述
(2)迭代公式:
在这里插入图片描述

(3)牛顿法确定g(x)的几何意义:做x_0这点的切线,切线与x轴交点为x_1,后面以此类推……
在这里插入图片描述
2.弦截法(Secant Method)
(1)在弦截法中,递推公式为:
在这里插入图片描述
在这里插入图片描述

交叉法

一、交叉法概述

这是一类求根方法,对于连续的𝑓(𝑥), 现在已知𝑓(x_1)𝑓(x_2) < 0,那么在x_1与x_2之间一定有一点𝑥满足𝑓(𝑥) = 0,即 𝑥 ∈ (x_1, x_2),(这里不妨设x_1 < x_2) 我们可通过不断减小这个区间的范围,从而找到𝑥的数值解。

二、 交叉法的具体方法
  • 逐步求根法
  • 二分法
  • 比例求根法

方法过程:

  1. 设𝑓(𝑎) < 0, 𝑓(𝑏) > 0
  2. 对于上述的三种方法:
    逐步求根法:
    c=a+h (h为步长)
    二分法:
    c=(a+b)/2
    比例求根法:在这里插入图片描述
  3. 计算𝑓(c)
    若𝑓(c)> 0,则令a=c
    若𝑓(c)< 0, 则令b=c
    若𝑓(c)= 0, 则x=c,结束
  4. 返回步骤2

三、例题分析
例1:分别用二分法、牛顿法、弦截法求下列方程的根,并分别画出几种方法所求根的收敛速 度对比图(即画出相对误差随迭代步数的变化趋势图)以下给出Matlab代码。

  1. f(x)=cos⁡x-x
function y=f(x)
%编辑方程式
y=cos(x)-x;

①二分法:

function [c,k,iteration]=half(a,b,epsilon)
%默认取中点为数值解
iteration=zeros(19,1);
k=0;%迭代次数
result=test;
% result是零点,即方程的解
myResult=0;
c=0;
while(abs(myResult-result)>epsilon)
    c=(a+b)/2;
    if f(a)*f(c)<0
        b=c;
    elseif f(b)*f(c)<0
        a=c;
    end
    myResult=c;
    k=k+1;
    iteration(k)=abs(myResult-result)/result;
end
x=1:k;
plot(x,iteration,'-b');
grid on
xlabel('迭代次数');
ylabel('相对误差');
legend('二分法求解');

②牛顿法

function [k,x1]=newton(x0,epsilon)
%牛顿法求根
result=test;
%result为根的值;
syms x
g=cos(x)-x;
f1=subs(diff(g),x,x0);
x1=x0-f(x0)/f1;
k=1;
iterater=zeros(5,1);
while (abs(x0-x1)>=epsilon)
    x0=x1;
    f1=subs(diff(g),x,x0);
    x1=x0-f(x0)/f1;
    myResult=x1;
    iterater(k)=abs(myResult-result)/result;
    k=k+1;
end
k1=1:k;
plot(k1,iterater,'-.r')

③ 弦截法

function secant(x0,x1,epsilon)
%弦截法求根
x2=x1-(x1-x0)*f(x1)/(f(x1)-f(x0));
k=1;
while(abs(x2-x1)>=epsilon)
    x0=x1;
    x1=x2;
    x2=x1-(x1-x0)*f(x1)/(f(x1)-f(x0));
end
k
x2
  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Blanche117

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值