基于MATLAB用二分法求非线性方程的零点

概念不多说,很好理解,直接放代码:

代码说明:针对每一个问题,我分别创建了三个文件,解法1.m  解法2.m  以script为后缀名的文件。前两个文件存入两种解法的实现函数,最后一个用来存放脚本文件,即将测试的数据编入,调用时可直接在命令行窗口输入脚本文件名。

 bisect1.m

function [x,k]=bisect1(f,a,b,eps)
%此题先计算了达到精确值所要走的步数,再用for循环求解x
%kmax=1+floor((log(b-a)-log(eps))/log(2)) Kmax为达到输入精度要走的步数,书上公式
%f为待求函数,[a,b]为起始区间,eps为精度,有默认值
if nargin<4   
    eps=1e-5; %eps的默认值
end
fa=feval(f,a);
fb=feval(f,b);
if fa*fb>0
    disp('[a,b]不是有根区间!')
end
kmax=1+floor((log(b-a)-log(eps))/log(2)); 
for k=1:kmax
    x=(a+b)/2;
    fx=feval(f,x);
    if    fx*fa<0
          b=x;
          fb=fx;
    elseif  fx*fa>0
          a=x;
          fa=fx;
    else
        a=x;
        b=x;
        break;
    end
end
%若在for循环底部多加一步下面的判断,情况会不一样
%if(b-a)/2<eps
%        break;
%end
%x=(a+b)/2;
%这是因为先判断区间是否符合精度标准,再求该区间的x
    

bisect2.m 

function [x,k]=bisect2(f,a,b,eps)
%用while循环找出符合精度的区间
%while循环可用于当循环次数不确定时
if nargin<4
    eps=1e-5;
end
fa=feval(f,a);
fb=feval(f,b);
if fa*fb>0
   x=[fa,fb];k=0;
   return;
end
k=1;
while abs(b-a)/2>eps
    x=(a+b)/2;
    fx=feval(f,x);
    if fa*fx<0
        b=x;
        fb=fx;
    else
        a=x;
        fa=fx;
    end
    k=k+1;
end
x=(a+b)/2;

bisectscript.m 

clc;
f=inline('x^3-x-1'); 
[x,k]=bisect2(f,1,1.5,0.005)
[x,k]=bisect1(f,1,1.5,0.005)

运行结果:

>>bisectscript

x =

1.3242

k =

 7

x =

1.3242

k =

 7

由于数值分析这门课所以才开始接触MATLAB,在这给同我一样是初学者的人提个建议,要想看懂这些代码,必须先掌握一些matlab的基础流程控制与两种m文件的编写,这样以后看代码就容易多了。基于刚学,博文肯定有不尽完善的地方,也希望大家可以指出来,共同进步。以后会陆续将我的学习心得与代码分享出来,供大家参考。

以上代码均为原创,转载请注明出处。  --凉柒-lq

 

  • 10
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值