使用割线法求解非线性方程

本文介绍了割线法,一种无需计算导数的迭代方法,用于求解非线性方程的根。通过两点初始估计值和线性插值概念,逐步逼近方程的解。文章还提供了MATLAB代码示例,展示了如何使用割线法求解非线性方程cos(x)-x的根。
摘要由CSDN通过智能技术生成

割线法的介绍

两点割线法(也称为割线法)是求解非线性方程根的一种迭代方法。它是一种开放方法,与牛顿-拉夫森方法相似,但不需要计算导数,因此在某些情况下更易于应用。这种方法基于线性插值的概念,通过连续估计方程的根来迭代求解。割线法使用两个初始估计值,这两点之间的割线斜率用于逼近方程的根。

割线法的详细解释

如下图所示:
在这里插入图片描述
1、选择两个初始近似值 x n − 1 x_{n-1} xn1 x n x_n xn(当 n = 1 n=1 n=1时为 x 0 x_0 x0 x 1 x_1 x1),它们分别是方程 f ( x ) = 0 f(x)=0 f(x)=0的两个近似根。
2、计算函数值 f ( x n − 1 ) f(x_{n-1} ) f(xn1) f ( x n ) f(x_n ) f(xn)
3、迭代过程:
·使用 x n − 1 x_{n-1} xn1 x n x_n xn之间的割线斜率来估计方程的根。割线斜率可以表示为 f ( x n ) − f ( x n − 1 ) x n − x n − 1 \frac{f(x_n)-f(x_{n-1})}{x_n-x_{n-1}} xnxn1f(xn)f(xn1)
·计算新的估计值 x n + 1 x_{n+1} xn+1,使用公式:
x n + 1 = x n − f ( x n ) ⋅ x n − x n − 1 f ( x n ) − f ( x n − 1 ) x_{n+1}=x_n-f(x_n)\cdot\frac{x_n-x_{n-1}}{f(x_n)-f(x_{n-1})} xn+1=xnf(xn)f(xn)f(xn1)xnxn1
其中n代表迭代次数。
4、更新估计值并重新迭代:用 x n x_n xn替换 x n − 1 x_{n-1} xn1 x n + 1 x_{n+1} xn+1替换 x n x_n xn ,然后重复步骤2和3,直到满足某个终止条件,例如 ∣ f ( x n + 1 ) ∣ < ϵ |f(x_{n+1})|<\epsilon f(xn+1)<ϵ ∣ x n + 1 − x n ∣ < ϵ |x_{n+1}-x_n|<\epsilon xn+1xn<ϵ,其中 ϵ \epsilon ϵ是预先设定的容忍误差。

两种割线法

在使用两点割线法求解非线性方程时,主要有两种不同的策略或方法:
基本割线法:这是最直接的割线法形式,如上所述,仅涉及两个初始估计值和迭代更新过程。在每次迭代中,使用最新的两个估计值来计算下一个近似根。
改进的割线法(或变种):这些方法可能会引入其他元素以改进基本割线法的性能或收敛特性。例如,一种改进的割线法可能会在每次迭代中动态选择两个用于计算下一近似根的点,而不是简单地使用最近的两个估计值。这种选择可能基于函数值的大小、斜率的变化或其他准则,目的是加速收敛或提高稳定性。

实例及对应MATLAB代码

考虑方程 f ( x ) = c o s ⁡ ( x ) − x f(x)=cos⁡(x)-x f(x)=cos(x)x,这是一个非线性方程,没有简单的代数解。使用两点割线法求解这个方程时,我们从两个初始估计值开始: x 0 = 0 x_0=0 x0=0 x 1 = 1 x_1=1 x1=1、下面是解决这个实例的MATLAB代码:

function root = secant_method()
%SECANT_METHOD 使用割线法求解非线性方程
% 定义目标函数
f = @(x) cos(x) - x; %   f: 目标函数句柄

% 设置初始近似值和参数
x0 = 0;
x1 = 1;  %   x0, x1: 两个初始近似值
tol = 1e-5;  %   tol: 容忍误差,用于判断收敛条件
max_iter = 100;  %   max_iter: 最大迭代次数

for iter = 1:max_iter
    fx0 = f(x0);
    fx1 = f(x1);
    % 计算新的近似根
    x2 = x1 - (fx1 * (x1 - x0)) / (fx1 - fx0);
    % 检查收敛条件
    if abs(f(x2)) < tol
        root = x2;
        fprintf('找到根 x = %f 在 %d 次迭代后\n', root, iter);
        return;
    end
    % 更新近似值
    x0 = x1;
    x1 = x2;
end

% 如果达到最大迭代次数仍未满足容忍误差,则输出最后的估计值
root = x2;
fprintf('达到最大迭代次数。最后的估计根 x = %f\n', root);
end

这段代码定义了一个名为 secant_method 的函数,它实现了割线法的逻辑。函数接受一个函数句柄 f (在这个例子中是 c o s ( x ) − x cos(x)-x cos(x)x),两个初始近似值 x 0 x_0 x0 x 1 x_1 x1,一个容忍误差 tol 用于判断何时停止迭代,以及一个最大迭代次数 max_iter。
在 secant_method 函数中,通过迭代更新 x 0 x_0 x0 x 1 x_1 x1来逐渐逼近方程的根。每次迭代后,如果新计算的近似根的函数值小于容忍误差 tol,则认为已经找到根,并结束迭代。如果迭代次数达到 max_iter 但仍未找到满足容忍误差的根,则输出最后计算的近似根。
最后代码的运行结果为:
在这里插入图片描述
通过迭代计算,我们得到了方程的根 x ≈ 0.7391 x≈0.7391 x0.7391。这个例子说明,通过迭代更新估计值,并利用函数在当前估计点的值,割线法能够有效地逼近方程的真实根。此外,该方法的实现相对简单,不需要求导数,这在实际应用中是一个显著优势。

  • 34
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

hututu1122

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

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

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

打赏作者

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

抵扣说明:

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

余额充值