学习Matlab的第一个程序——用二分法求根

学习Matlab的第一个程序——用二分法求根

问题描述

对于一个给定的方程f(x)=0和零点的大致区间(a,b),用二分法将区间(a,b)缩小,当误差小于允许的给定误差时,输出零点的近似解和迭代次数。

matlab代码

总体上用递归思路实现。

1 fun函数,即给定的f(x)

function y1=fun(x)
y1=x*x*x+4*x*x-20;

2 dichotomy函数,是最外层的函数。

%可以用C语言的思路写,最外层函数相当于main函数
%二分法计算函数的零点
%输入求根区间a,b和求根精度abtol
%函数输出根的近似值,和迭代次数
function dichotomy()
a=input('请输入求根的下限,a=');
b=input('请输入求根的上限,b=');
abtol=input('请输入求根的精度,abtol=');
iterations=0;
ya=fun(a);yb=fun(b);%程序中调用的fun.m为函数
if ya*yb>0;
    fprintf('注意:ya*yb>0,请重新调整区间端点a和b.'),return
else
    [iter,y]=dichotomyRoot(a,b,abtol,iterations);
    disp('Root='),disp(y);
end
disp('迭代次数='),disp(iter);
end

3 dichotomyRoot函数

%可以只运行某一个小函数(内层函数)
%使用二分法计算函数的零点
%参数a,b为根的大概区间,abtol为精度
function [iterations,y]=dichotomyRoot(a,b,abtol,counter)
x=(a+b)/2;
f3=fun(x);
f1=fun(a);
if(f1*f3<0)
    m=x-a;
    if(m>abtol)
        b=x;
        counter=counter+1;
        [counter,y]=dichotomyRoot(a,b,abtol,counter);
    else
        y=x;
    end
else
    m=b-x;
    if(m>abtol)
        a=x;
        counter=counter+1;
        [counter,y]=dichotomyRoot(a,b,abtol,counter);
    else
        y=x;
    end
end
iterations=counter;
end

遇到的一些问题和心得体会

1.现在是大二,只有一点点c++基础,原以为matlab是要用全新的语言,在做二分法求根问题的时候,查资料发现竟然可以用类似c的思路实现!把最外层函数看作main函数,里层的函数是被调用的小函数。和一般的c++代码不同的是,每个.m函数文件都可以单独运行,只要把函数需要的变量给函数就好。
2.在增加变量迭代次数iterations的时候,学习了怎样让函数传出多个变量(用【】框起来就好),要注意的是,所有调用多输出函数dichotomyRoot的地方都要把输出赋给多个值,不然会出现奇怪的问题(迭代次数回溯到1)。
3.疑惑:不知道maylab能不能支持c++的类呢?可以用java的思路去写吗?
4.之后想把牛顿迭代也实现!
5.第一次在CSDN上写文章,如果文章有什么做的不对的地方请多指教,谢谢!

参考了作者shuoyueqishilove的“利用matlab编写二分法求根函数”,写得很清楚,非常感谢!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值