MATLAB-非线性方程的数值解法——二分法

本文主要使用MATLAB实现二分法解非线性方程的功能
二分法在用计算机求非线性方程解的数值方法中是最简单的一种,用人工算效率很低,但用计算机运算时还是一种很有效的方法。本文主要参考《计算方法》李大美 李素贞 朱方生编著

目录

  1. 原理
  2. 计算步骤
  3. 程序框图
  4. MATLAB实现
    4.1.按照程序框图进行编写
    4.2.先估算二分次数再进行二分
  5. 例题

原理

二分法的数学理论基础是闭区间上连续函数的一个基本性质,即设f(x)在闭区间[a,b]上连续且f(a)(b)<0,则在区间内至少存在一个点α,使得f(α)=0
MATLAB-非线性方程的数值解法——二分法_第1张图片
​​​
记a0=a, b0=b, 称区间[a0, b0]为方程f(x)=0的有根区间

对分区间[a0, b0]可得中点​​​​​​ x0 并计算出f(x0)

若恰好有f(x0)=0,则方程的根为
中点
MATLAB-非线性方程的数值解法——二分法_第2张图片
若f(x0)≠0,则计算乘积f(x0)f(b0)

1.若f(x0)f(b0)>0,则根在区间[a0, x0]内,记a1=a0,b1=x0

2.若f(x0)f(b0)<0,则根在区间[x0, b0]内,记a1=x0,b1=b0

区间[a1, b1]是包含根的新区间,在旧的有根区间内

MATLAB-非线性方程的数值解法——二分法_第3张图片

记d1为区间[a1, b1]的长度,则d1

再将区间[a1, b1]对分,重复上述过程,可得方程新的有根区间[a2, b2],其长度为

d2

如此重复n次,若还没有找到方程的根,就得到了包含方程根的区间的一个序列:[a0, b0], [a1, b1], ···, [an, bn], ···

这个闭区间序列具有这样的特点:后一个区间落在前一个区间内,且其长度只有前一个区间长度的一半

记区间[an, bn]的长度为dn,则该区间与最初区间[a, b]的长度关系为

dn

但n充分大时,可取区间[an, bn]的中点作为方程f(x)=0的一个实根α的近似值,且它们满足关系式

误差估计式

方程根的近似值x*的绝对误差小于最初区间长度的2n+1分之一

对于给定的精度ε,可估算出二分法所需的二分次数

计算步骤

MATLAB-非线性方程的数值解法——二分法_第4张图片

程序框图

MATLAB-非线性方程的数值解法——二分法_第5张图片

MATLAB实现

按照程序框图进行编写

有两个允许误差ε1,ε2,且未估算二分次数n

clear;clc;

%使用二分法求非线性连续函数的根,无法求复数根和偶数重根
%初始未计算二分次数

a0=1;b0=2; %输入有根区间

accuracy_1=10^(-4);accuracy_2=5*10^(-4); %设定两个允许误差

syms x; %定义变量x
f(x)=x^6-x-1; %设定方程

y1=f(a0);y2=f(b0); %求初始两端点f(x)值

a=zeros(100,1);b=a;x=a;form=zeros(100,5); %提前创建矩阵,提高运算速度,因未计算二分次数,所以设定了100次,可适当修改
if y1*y2>0
    fprintf ('区间内有偶数个根或者无实根')
else
    n=0; %n为2分次数
    a(1)=a0;b(1)=b0;
    while ((b(n+1)-a(n+1))>accuracy_2) %循环至满足误差要求
        x(n+1)=(a(n+1)+b(n+1))/2;%求当前区间中点
        y=f(x(n+1));yb=f(b(n+1)); %求此区间中点、右端点对应的f(x)
        if abs(y)0 %y*yb大于0则让右端点等于中点,左端点保持不变,若y*yb<0则相反
                b(n+2)=x(n+1);
                a(n+2)=a(n+1);
            else
                a(n+2)=x(n+1);
                b(n+2)=b(n+1);
            end
        end
        form(n+1,1)=n;form(n+1,2)=a(n+1);form(n+1,3)=b(n+1);form(n+1,4)=x(n+1);form(n+1,5)=y; %填充表格
        n=n+1; %累计二分次数
    end
end

先估算二分次数再进行二分

先用误差估计式进行估算,求出n,再进行二分

clear;clc;

%使用二分法求非线性连续函数的根,无法求复数根和偶数重根
%初始根据误差估计式计算二分次数n

a0=1;b0=2; %输入有根区间

accuracy=5*10^(-4); %设定允许误差

syms x; %定义变量x
f(x)=x^6-x-1; %设定方程
y1=f(a0);y2=f(b0); %求初始两端点f(x)值

n=ceil(log2((b0-a0)/accuracy/2)); %由误差估计式计算二分次数,ceil:向正无穷取整
a=zeros(n,1);b=a;x=a;form=zeros(n,5); %根据二分次数提前创建矩阵,提高运算速度
if y1*y2>0
    fprintf ('区间内有偶数个根或者无实根')
else
    a(1)=a0;b(1)=b0;
    for i=1:n+1
        x(i)=(a(i)+b(i))/2;%求当前区间中点
        y=f(x(i));yb=f(b(i)); %求此区间中点、右端点对应的f(x)
        if y*yb>0 %y*yb大于0则让右端点等于中点,左端点保持不变,若y*yb<0则相反
            b(i+1)=x(i);
            a(i+1)=a(i);
        else
            a(i+1)=x(i);
            b(i+1)=b(i);
        end
        form(i,1)=i-1;form(i,2)=a(i);form(i,3)=b(i);form(i,4)=x(i);form(i,5)=y; %填充表格
    end
end

运算结果如下图

方法一
MATLAB-非线性方程的数值解法——二分法_第6张图片
方法二
MATLAB-非线性方程的数值解法——二分法_第7张图片

例题

求x3-x-1=0在[1, 1.5]内的解,要求ε<0.01

将a=1,b=1.5,accuracy=0.01,代码里的方程也改为x3-x-1,然后运算代码,可得图表
MATLAB-非线性方程的数值解法——二分法_第8张图片
MATLAB-非线性方程的数值解法——二分法_第9张图片
运行所得结果与例题参考答案高度重合,因此所求方程的近似解为x*=1.3203,满足允许的误差精度

你可能感兴趣的:(数学理论与应用,matlab,算法)