非线性方程二分法

非线性方程二分法

优点:算法直观、简单、总能保证收敛;局限:收敛速度慢、一般不单独用它求根,仅为了获取根的粗略近似

1 二分法基本思想

f ( x ) f(x) f(x) [ a , b ] [a,b] [a,b]上连续、严格单调、满足条件
f ( a ) f ( b ) < 0 f(a)f(b)<0 f(a)f(b)<0
则在区间 [ a , b ] [a,b] [a,b]内必有一根 x ∗ x^* x。通过反复对分有根区间,以极限思想求解出非线性方程的数值解。具体步骤如下:

  • [ a , b ] [a,b] [a,b]的中点 x 0 = ( a + b ) / 2 x_0=(a+b)/2 x0=(a+b)/2,计算 f ( x 0 ) f(x_0) f(x0),当
    • f ( a ) f ( x 0 ) < 0 f(a)f(x_0)<0 f(a)f(x0)<0,则令 a 1 = a , b 1 = x 0 a_1=a,b_1=x_0 a1=a,b1=x0;
    • f ( x 0 ) f ( b ) < 0 f(x_0)f(b)<0 f(x0)f(b)<0,则令 a 1 = x 0 , b 1 = b a_1=x_0,b_1=b a1=x0,b1=b;

通过重复上述步骤,得到一系列有根区间
[ a , b ] ⊃ [ a 1 , b 1 ] ⊃ [ a 2 , b 2 ] ⊃ ⋯ ⊃ … [a,b]\supset [a_1,b_1]\supset[a_2,b_2]\supset\dots \supset\dots [a,b][a1,b1][a2,b2]
由于后一个区间长度是前一个区间的一半,通过递归公式求解出区间长度的通项公式
b k − a k = b − a 2 k b_k-a_k=\frac{b-a}{2^k} bkak=2kba
k → ∞ k\to \infty k时, ∣ ∣ b k − a k ∣ ∣ → 0 ||b_k-a_k||\to0 ∣∣bkak∣∣0,此时序列 { a k } , { b k } , { x k } → x ∗ \{a_k\},\{b_k\},\{x^k\} \to x^* {ak},{bk},{xk}x,其中
x ∗ = a k + b k 2 x^*=\frac{a_k+b_k}{2} x=2ak+bk
由于方程根和中点间的距离真包含于 [ a k , b k ] [a_k,b_k] [ak,bk],故收敛速度
0 ≤ ∣ x ∗ − x k ∣ ≤ ( b k − a k ) / 2 = ( b − a ) / 2 k + 1 0\le|x^*-x_k|\le(b_k-a_k)/2=(b-a)/2^{k+1} 0xxk(bkak)/2=(ba)/2k+1
k → ∞ k\to \infty k时,利用夹逼定理
lim ⁡ k → ∞ 0 ≤ lim ⁡ k → ∞ ∣ x ∗ − x k ∣ ≤ lim ⁡ k → ∞ ( b − a ) / 2 k + 1 = 0 \mathop {\lim }\limits_{k\to \infty}0 \le \mathop {\lim }\limits_{k\to \infty}|x^*-x_k|\le\mathop {\lim }\limits_{k\to \infty}(b-a)/2^{k+1}=0 klim0klimxxkklim(ba)/2k+1=0
故有 x k → x ∗ x^k\to x^* xkx。给定终止条件 ε \varepsilon ε,当
( b − a ) / 2 k + 1 < ε (b-a)/2^{k+1}<\varepsilon (ba)/2k+1<ε
时,可求出满足精度 ε \varepsilon ε的最少二分次数 k k k


2 二分法实现

求解:
f ( x ) = 2 x + x − 2 f(x)=2^x+x-2 f(x)=2x+x2

function[xstar,index,it] = bisect(fun,a,b,ep)
% 非线性方程二分法
% fun为目标函数
% a,b为初始区间
% ep为精确度,当(b-a)/2<ep循环结束,迭代失败输出两端点函数值
% index指标变量,index = 1,迭代成功,index  = 0表明初始区间不是有根区间
% it迭代次数
if nargin < 4
    ep = 1e-5;
end
fa = feval(fun,a); %计算a处的函数值
fb = feval(fun,b); %计算b处的函数值
if fa*fb>0
    xstar = [fa,fb];
    index = 0;
    it = 0;
    return
end
k = 0;
while abs(b-a)/2 >= ep
    x = (a+b)/2;
    fx = feval(fun,x);
    if fx*fa<0
        b = x;fb = fx;
    else
        a = x;fa = fx;
    end
    k = k +1;
end
xstar = (a+b)/2;index = 1;it = k
%具体函数
function f = fun1(x)
%测试函数
f = 2^x+x-2;  %任意可改
end

format long
[xstar,index,it] = bisect(@fun1,0,2,0.0000001)

xstar = 0.543000400066376

index = 1

it = 24


-END-

参考文献

曾繁慧. 数值分析[M]. 中国矿业大学出版社,2009

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MATLAB中,非线性方程解通常使用`fzero`函数,它是专门用于寻找零点(即满足方程f(x) = 0的x值)的算法之一,其中`f`是你要解决的非线性函数。二分法(也称为牛顿-割线法)是一种迭代方法,但MATLAB的`fzero`函数内部可能并未直接使用二分法,因为`fzero`使用了更高级的数值解技术,如拟牛顿法或Secant方法。 要使用`fzero`函数来解决非线性方程,你需要提供一个匿名函数(`@`符号定义的函数),例如: ```matlab % 假设你有一个非线性函数f(x) function result = myNonlinearFunction(x) % 在这里编你的函数代码 result = x^2 - 2*sin(x); % 一个示例函数,让x^2 = sin(x) end % 初始化一个猜测值 initial_guess = 1; % 你认为可能的解 % 使用fzero函数解 solution = fzero(@myNonlinearFunction, initial_guess); ``` 如果你想要亲自实现二分法,你可以编一个自定义函数,但请注意,对于复杂的非线性方程二分法可能不如内置的`fzero`或其他高级算法效率高。下面是二分法一个简单示例: ```matlab function root = bisectionMethod(f, a, b, tolerance) if f(a)*f(b) > 0 % 如果初值区间端点函数值同号,说明可能不存在交点 error('Initial interval does not bracket a zero.'); end c = (a + b) / 2; % 取区间的中点作为新的搜索点 while abs(f(c)) > tolerance % 当函数值接近0时停止 if f(a)*f(c) < 0 % 更新区间 b = c; else a = c; end c = (a + b) / 2; end root = c; % 返回找到的根 end % 调用自定义的二分法函数 tolerance = 1e-6; root = bisectionMethod(@(x) x^2 - 2*sin(x), 0, 2*pi, tolerance); ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值