function [y_start,y_end,x_reality,n_reality] = arccut(f_name,x_start,x_end,tolerance,n_limit)
%%
% 弦割法求解方程f_name = 0根的MATLAB实现
% f_name为函数名
% x_start为弦割区间的左端点
% x_end为弦割区间的右端点
% tolerance为所求的精度要求
% n_limit为函数的最大迭代次数
%%
% y_start为弦割左端点的函数值
% y_end为弦割右端点的函数值
% x_reality为
% n_reality为最后计算次数
%%
format long; % 计算结果保留到小数点后14位
fprintf('弦割法求方程: %s = 0 的近似根\n',f_name);
n_reality = 0;
%%
while 1
x_reality = x_end;
if(abs(x_end - x_start) <= tolerance) % 如果满足精度要求,输出结果,跳出while循环
fprintf('在精度不超过%.14f的条件下,方程:%s = 0 的根为 %.14f\n迭代次数为:%d\n',...
tolerance,f_name,x_reality,n_reality);
break;
elseif(n_reality > n_limit) % 如果迭代次数超过限制,输出提示语,结束循环
disp('迭代次数超界');
break;
else
n_reality = n_reality + 1;
y_start = feval(f_name,x_start);
y_end = feval(f_name,x_end);
fprintf('n_reality=%3.0f, x_end=%12.14f,y_end=%12.14f\n',n_reality,x_end,y_end);
% 弦割法
x_end = x_end - y_end / (y_end - y_start) * (x_end - x_start);
x_start = x_reality; % 这样减少了变量,程序看起来简单了,但是重复计算了第20行的值
end
end
disp('弦割法结束');
end
%%
% 弦割法的优点:
% 不必求导数(同牛顿法相比)
% 弦割法的缺点:
% 1.收敛速度(1.618)不如牛顿法(2.0)
% 2.需要提供两个初始近似根
%%