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

二分发求方程根的MATLAB程序

2012-07-13 22:13 204 查看
function [x_middle,y_middle,n_reality] = binary(f_name,x_start,x_end,tolerance,n_limit)
%%
% 二分法求解方程f_name = 0根的MATLAB实现
% f_name为迭代函数
% x_start为开始迭代区间的左端点
% x_end为开始迭代区间的右端点
% tolerance为函数迭代的精度要求
% n_limit为函数的最大迭代次数
%%
% x_middle为函数迭代最后结果
% y_middle为最后迭代结果的函数值
% n_reality为最后迭代次数
%%
format long; % 计算结果保留到小数点后14位
fprintf('\n二分法求方程: %s = 0 的近似根\n',f_name);
fprintf(' n x_start x_end x_middle Y_x_start=f(x_start)');
fprintf(' Y_x_end=f(x_end) abs(Y_x_end-Y_x_start)\n');
Y_x_start = feval(f_name,x_start); % 求方程f_name在x_start处的值
Y_x_end = feval(f_name,x_end); % 求方程f_name在x_end处的值
%%
n_reality = 0;
if(Y_x_start * Y_x_end > 0) % 首先判断是否满足使用二分法的条件
disp('不满足条件 f(x_start)*f(x_end)<=0');
else
while 1 % 执行while循环
n_reality = n_reality + 1;
x_middle = (x_start + x_end)/2; % 计算x_start和x_end的中点
y_middle = feval(f_name,x_middle); % 计算x_middle的函数值
fprintf('%3.0f %10.14f,%10.14f,',n_reality,x_start,x_end);
fprintf('%10.14f, %10.14f, %10.14f, ',x_end,Y_x_start,Y_x_end);
fprintf('%12.14f\n',abs(Y_x_end-Y_x_start));
if(abs(x_end - x_start) <= tolerance) % 如果满足精度要求,输出结果,跳出while循环
fprintf('在精度不超过%.14f的条件下,方程:%s = 0 的根为 %.14f\n迭代次数为:%d\n',...
tolerance,f_name,x_middle,n_reality);
break;
elseif(n_reality > n_limit) % 如果迭代次数超过限制,输出提示语,结束循环
disp('迭代次数超界');
break;
elseif(Y_x_start * y_middle <= 0) % 如果Y_x_start的值和y_middle的值异号
x_end = x_middle; % 把x_middle的值赋给x_end;
Y_x_end = y_middle; % 把y_middle的值赋给Y_x_end;
else % 否则
x_start = x_middle; % 把x_middle的值赋给x_start
Y_x_start = y_middle; % 把y_middle的值赋给Y_x_start;
end
end
end
disp('二分法结束');
end
%%
% 二分法的优点:
% 1.方法简单可靠,易于在计算机上实现
% 2.对函数f_name的要求不高,只要连续即可
% 二分法的缺点:
% 1.二分法用于计算精度要求较高的的近似根时,所费时间较长,收敛速度慢,在使用范围上有局限
% 2.不能用于求复根或偶数重根
%%
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  MATLAB 二分法