学习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上写文章,如果文章有什么做的不对的地方请多指教,谢谢!