%
%
%
% 第三题,二分法还原答案结果
%

f=@(x)exp(x)+10*x-3;
bot=0;top=1;err=0.000001
[i,x,fx]=erfenfa_new_use2(f,bot,top,err)

%
% 第七题
% 第二小问可以用卡西欧991完成
% 附上参考链接:
% https://www.zhihu.com/question/323716445
% 第三小问
% 向社会分子低头,我选择计算机

f=@(x)x.^3-3.*x-1
x=zeros(6,1);
x(1)=1;x(2)=3;x(3)=2;%初始化x,并且输入x0,x1,x2

% 计算x0,x1,x2差商,从而得到ω

k=3;
A=csb(x(k-2:k),f(x(k-2:k)))
omega=A(3,3)+A(3,4)*(A(3,1)-A(2,1));
fprintf("k=%d时omega=%f+%f*%f=%f",k,A(3,3),A(3,4),A(3,1)-A(2,1),omega)
x(k+1)=x(k)-2*f(x(k))/(omega+sign(omega)*sqrt(omega^2-4*f(x(k))*A(3,4)));
fprintf("x_%d=%.9f",k,x(k+1))
k=4;
A=csb(x(k-2:k),f(x(k-2:k)))
omega=A(3,3)+A(3,4)*(A(3,1)-A(2,1));
fprintf("k=%d时omega=%f+%f*%f=%f",k,A(3,3),A(3,4),A(3,1)-A(3,2),omega)
x(k+1)=x(k)-2*f(x(k))/(omega+sign(omega)*sqrt(omega^2-4*f(x(k))*A(3,4)));
fprintf("x_%d=%.9f",k,x(k+1))
k=5;
A=csb(x(k-2:k),f(x(k-2:k)))
omega=A(3,3)+A(3,4)*(A(3,1)-A(2,1));
fprintf("k=%d时omega=%f+%f*%f=%f",k,A(3,3),A(3,4),A(3,1)-A(3,2),omega)
x(k+1)=x(k)-2*f(x(k))/(omega+sign(omega)*sqrt(omega^2-4*f(x(k))*A(3,4)));
fprintf("x_%d=%.9f",k,x(k+1))

%
% 第八题

clc;clear;
f=@(x)2*x-tan(x);
bot=4;top=4.7;err=0.00000001
[i,x,fx]=erfenfa_new_use2(f,bot,top,err)

%

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是下取整
k=0;
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
    k=k+1;
    fprintf('\nk=%d\ta=%.9f\tb=%.9f\txk=%.9f\tf=%f\t1/2^(k+1)=%.9f',k,bot,top,(bot+top)/2,f((bot+top)/2),1/2^(k+1))
end
fprintf('\nThe result:\n二分法运算次数i=%d;方程的根x=%.4f;f(x)=%.4f\n',i,x,fx);%保留4位小数
end

function A=csb(X,Y)
n=length(X);
A=zeros(n,n+1);
A(:,1)=X';
A(:,2)=Y';
for j=3:n+1
for i=j-1:n
A(i,j)=(A(i,j-1)-A(i-1,j-1))./(A(i,1)-A(i-j+2,1));
end
end
end