【数值分析】非线性方程求根,二分法,割线法,matlab实现

1. 基本问题

收敛阶
lim ⁡ k → ∞ ∣ e k + 1 ∣ ∣ e k ∣ r = C > 0    ,    r 为收敛阶 \lim_{k\to\infty} \frac{|e_{k+1}|}{|e_k|}^r=C>0 \,\,,\,\, r为收敛阶 k→∞lim∣ek∣∣ek+1∣r=C>0,r为收敛阶

2. 二分法

二分法是线性收敛的,如果指定精度 ϵ { \epsilon } ϵ ,则最多需要迭代步数
k = ⌈ log ⁡ 2 ( b − a ϵ ) ⌉ k= \lceil \log_2(\frac{b-a}{\epsilon }) \rceil k=⌈log2(ϵb−a)⌉

matlab实现

matlab 复制代码
%% 二分法例子
f = @(x) x^3-x-1;
format long
[x,i] = bisect(f,1,2,1e-5,1000)

%% 二分法求非线性方程的根
% 输入函数,范围,精度,最大迭代次数
% 输出根,迭代次数
function [x,i] = bisect(f,a,b,eps,max_iter)
    if sign(f(a))~=sign(f(b))
        for i = 1:max_iter  
            c = a/2+b/2;
            if (b-a)<eps || abs(f(c))<eps
                x = c;
                break
            end
            if sign(f(a))==sign(f(c))
                a = c;
            else
                b = c;
            end
        end
    end
end

3. 不动点迭代加速

不动点 x = x ∗ {x=x ^{*} } x=x∗
x k + 1 = ϕ ( x k ) x_{k+1}=\phi(x_k) xk+1=ϕ(xk)
x k + 1 − x ∗ = ϕ ( x k ) − ϕ ( x ∗ ) = ϕ ′ ( ξ k ) ( x k − x ∗ )    ,    ξ k ∈ ( x k , x ∗ ) x_{k+1}-x ^{*} =\phi(x_k)-\phi(x ^{*} )=\phi'(\xi_k)(x_k-x ^{*} ) \,\,,\,\, \xi_k\in(x_k,x ^{*} ) xk+1−x∗=ϕ(xk)−ϕ(x∗)=ϕ′(ξk)(xk−x∗),ξk∈(xk,x∗)
let     ϕ ′ ( ξ k ) = L \text{let} \,\,\, \phi'(\xi_k) =L letϕ′(ξk)=L
x ∗ ≈ x k + 1 − L x k 1 − L = ϕ ˉ ( x ) x ^{*} \approx \frac{x_{k+1}-Lx_k}{1-L}=\bar\phi(x) x∗≈1−Lxk+1−Lxk=ϕˉ(x)

为加速后的不动点迭代格式。

6. 割线法

割线法比起牛顿迭代法不需要计算导数。
双点割线法

需要知道两个的函数初始值,不需要函数值异号 。迭代公式如下:
x k + 1 = x k − f ( x k ) x k − x k − 1 f ( x k ) − f ( x k − 1 ) x_{k+1}=x_k-f(x_k) \frac{x_k-x_{k-1}}{f(x_k)-f(x_{k-1})} xk+1=xk−f(xk)f(xk)−f(xk−1)xk−xk−1

收敛阶:
r = 5 + 1 2 ≈ 1.618 r= \frac{\sqrt{5}+1}{2} \approx 1.618 r=25 +1≈1.618

matlab编程实现

matlab 复制代码
%%  割线法例子
f = @(x) x-sin(x)-0.5;
[x,e,i] = cutSolve(f,1.4, 1.6, 0.01, 100)

%% 双点割线法
% 输入函数,根所在的区间下限上限,精度,最大迭代次数
% 输出根,根的值,迭代次数
function [x,e,i] = cutSolve(f,a,b,eps,max_iter)
    x0 = a;
    x1 = b;
    for i = 1:max_iter
        x = -f(x0)*(x1-x0)/(f(x1)-f(x0))+x0
        if abs(x-x1)<=eps
            e = abs(f(x));
            break;
        end
        x0=x1;
        x1=x;
    end
end

单点割线法

固定初始点,有
x k + 1 = x k − f ( x k ) x k − x 0 f ( x k ) − f ( x 0 ) x_{k+1}=x_k-f(x_k) \frac{x_k-x_{0}}{f(x_k)-f(x_{0})} xk+1=xk−f(xk)f(xk)−f(x0)xk−x0

算是一种不动点迭代。

相关推荐
小白的高手之路5 小时前
Matlab中的积分——函数int()和quadl()
matlab
机器学习之心7 小时前
PINN物理信息神经网络用于求解二阶常微分方程(ODE)的边值问题,Matlab实现
人工智能·神经网络·matlab·物理信息神经网络·二阶常微分方程
WangYan202212 小时前
MATLAB 2023a深度学习工具箱全面解析:从CNN、RNN、GAN到YOLO与U-Net,涵盖模型解释、迁移学习、时间序列预测与图像生成的完整实战指南
深度学习·matlab·matlab 2023a
迎风打盹儿12 小时前
均匀圆形阵抗干扰MATLAB仿真实录与特点解读
matlab·信号处理·抗干扰·均匀圆阵·波束合成
数维学长9861 天前
【全网最全】《2025国赛/高教杯》C题 思路+代码python和matlab+文献 一到四问 退火算法+遗传算法 NIPT的时点选择与胎儿的异常判定
开发语言·算法·matlab
dlraba8021 天前
用遗传算法破解一元函数最大值问题:从原理到 MATLAB 实现
开发语言·matlab
996终结者2 天前
Python数据分析与处理(二):将数据写回.mat文件的不同方法【超详细】
python·matlab·数据分析
我是水怪的哥2 天前
在时间序列中增加一个阶跃对长期趋势变化的影响
matlab·lake
lingchen19062 天前
MATLAB矩阵及其运算(三)矩阵的创建
算法·matlab·矩阵
民乐团扒谱机3 天前
【微实验】妈妈,我的MATLAB开始学方言了!?(一)
数学建模·matlab·语言学·方言