【MATLAB】逐步搜索法、二分法、比例求根法、牛顿法、弦截法求方程的根

本文为《数值计算方法》的作业之一

之二:【MATLAB】欧拉法、2阶R-K法、4阶R-K法、预测-校正法(M-S法、A-M法)、有限差分法
解常微分方程

之三:

收敛性比较

分别用逐步搜索法、二分法、比例求根法、牛顿法、弦截法求下列方程的根,并分别画出几种方法所求根的收敛速度对比图(即画出相对误差随迭代步数的变化趋势图)

  • f ( x ) = c o s ( x ) − x f(x)=cos(x)-x f(x)=cos(x)x

图1

  • f ( x ) = x 12 − 1 f(x)=x^{12}-1 f(x)=x121

在这里插入图片描述

  • 代码

clear
% f(x) = 0 
f = @(x)cos(x) - x
x_left = -1;
x_right = 2;
stepsMax= 15;
% 逐步搜索法、二分法、比例求根法、牛顿法、弦截法error
errors = zeros(stepsMax,5);
syms x
df = matlabFunction(diff(f(x)))% 求导
if(f(x_left) * f(x_right) >= 0)
    disp("f(x_left) * f(x_right) >= 0")
end
% 逐步搜索法
a = x_left;
b = x_right;
h = (x_right - x_left)/stepsMax;
for i = 1:stepsMax
    c = a + h;
    errors(i,1) = f(c);
    if f(c)==0  
        break;
    elseif f(c)*f(b)<0    
        a = c;
    else
        b = c;
    end
end
% 二分法
a = x_left;
b = x_right;
for i = 1:stepsMax
    c = (a+b)/2;
    errors(i,2) = f(c);
    if f(c)==0  
        break;
    elseif f(c)*f(b)<0    
        a = c;
    else
        b = c;
    end
end
% 比例求根法
a = x_left;
b = x_right;
for i = 1:stepsMax
    c = a - f(a)/(f(a)-f(b))*(a-b);
    errors(i,3) = f(c);
    if f(c)==0  
        break;
    elseif f(c)*f(b)<0    
        a = c;
    else
        b = c;
    end
end
% 牛顿法
c = x_right;
for i = 1:stepsMax
    c = c - f(c)./df(c);
    errors(i,4) = f(c);
    if f(c)==0  
        break;
    end
end
% 弦截法
c = x_right;
d = x_left;
for i = 1:stepsMax
    temp = d;
    d = d - f(d)*(c-d)/(f(c)-f(d));
    c = temp;
    errors(i,5) = f(d);
    if f(c)==0  
        break;
    end
end


figure
hold on
errors = abs(errors);
for i = 1:5
    semilogy(errors(:,i),".-");
end



评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

框架主义者

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

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

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

打赏作者

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

抵扣说明:

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

余额充值