您的位置:首页 > 编程语言 > MATLAB

Matlab 实现 数值计算方法 二分法

2015-05-28 08:33 696 查看
给本科生助课,需要用到二分法,所以就编写了一下二分法的matlab代码,while循环、for循环都用到了;

个人认为这两段程序编写的比较细致,该涉及到的输入输出都有。都是比较简单的知识,所以给大家分享出来,供交流讨论:

第一个:

%% erfenfa new use one
% Author:jfsufeng@foxmail.com
% Version:
% Date&Time:
% Description:

function [i,x,fx]=erfenfa_new_use1(f,bot,top,err)
%输入:f为要求解的方程函数表达式,bot为求解区间的下界,top为求解区间的上界,err为所要求的误差范围
%输出:i为二分法求解的次数,x为最终的根,fx为方程的根x对应的函数值(精度要求内接近于零或等于零)
if f(bot)*f(top)>0
disp('\n注意:f(bot)*f(top)>0,无法继续运算,请重新调整区间端点bot和top.\n');
return
end
%wucha=abs(top_new-bot_new)/2;  % put that into for loop || while loop
n=ceil((log(top-bot)- log(err))/log(2))-1; %n为二分法运算总的次数;ceil是上取整 ,相对应的floor是下取整
for i=0:1:n    % 步长默认为1,中间的1加不加都可以
x=(bot+top)/2;
fx=f(x);
if fx==0
bot=x; top=x;
elseif f(bot)*fx<0
top=x;
else
bot=x;
end
%     if abs(top-bot)<=err  % 结合题意,加不加1/2都行,只是有着多二分运算一次的影响
%         %此外,实际这里的if判断err的语句part,针对for循环是无必要的
%         break  % 这里用break,不用return
%     end
end
fprintf('\nThe result:\n二分法运算次数i=%d;方程的根x=%.4f;f(x)=%.4f\n',i,x,fx);%保留4位小数


第二个:

%% erfenfa new use two
% Author:jfsufeng@foxmail.com
% Version:
% Date&Time:
% Description:

function [i,x,fx]=erfenfa_new_use2(f,bot,top,err)
%输入:f为要求解的方程函数表达式,bot为求解区间的下界,top为求解区间的上界,err为所要求的误差范围
%输出:i为二分法求解的次数,x为最终的根,fx为方程的根x对应的函数值(精度要求内接近于零或等于零)
if f(bot)*f(top)>0
disp('\n注意:f(bot)*f(top)>0,无法继续运算,请重新调整区间端点bot和top.\n');
return
end
i=ceil((log(top-bot)- log(err))/log(2))-1; %n为二分法运算总的次数;ceil是上取整 ,相对应的floor是下取整
while abs(top-bot)>err
x=(bot+top)/2;
fx=f(x);
if fx==0
bot=x; top=x;
elseif f(bot)*fx<0
top=x;
else
bot=x;
end
end
fprintf('\nThe result:\n二分法运算次数i=%d;方程的根x=%.4f;f(x)=%.4f\n',i,x,fx);%保留4位小数


执行示例:(1和2的执行一致)

In Command Window:

>> [i,x,fx]=erfenfa_new_use2(@(x)x^3+4*x^2-10,1,2,5e-4)

The result:

二分法运算次数i=10;方程的根x=1.3647;f(x)=-0.0080

i =

10

x =

1.3647

fx =

-0.0080

注:个人手敲,link:http://blog.csdn.net/jfsufeng/article/details/46116501 点击打开链接

有问题请与我联系:jfsufeng@foxmail.com
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: