function [afxin,fxin]=ercichazhi(a,b,epsilon)
% ERCICHAZHI——用二次插值法求目标函数的最小点和最小值
% afxin——目标函数的最小点
% fxin——目标函数的最小值
% a,b——初始搜索区间上下限
% epsilon——收敛精度
% K——表示初始点af2第一次被插值点af4置换前后的状态
% J——表示判断循环过程中是否导致c2=0或(af4-af1)*(af3-af4)<=0的一个开关变量
% J==0表示循环过程中未导致上述情况出现;否则若J==1表示循环过程中导致了上述情况出现
f=inline(input('请输入目标函数:','s'));
af1=a;af3=b;af2=(af1+af3)/2;
f1=f(af1);f2=f(af2);f3=f(af3);
K=0;
c1=(f3-f1)/(af3-af1);c2=((f2-f1)/(af2-af1)-c1)/(af2-af3);
if c2~=0
af4=0.5*(af1+af3-c1/c2);
if (af4-af1)*(af3-af4)>0
f4=f(af4);
while K==0||(K~=0&&abs(af4-af2)>epsilon)
J=0;
if af2<af4
if f2>f4
f1=f2;af1=af2;af2=af4;f2=f4;K=1;
else
f3=f4;af3=af4;
end
else
if f2>f4
f3=f2;af3=af2;af2=af4;f2=f4;K=1;
else
f1=f4;af1=af4;
end
end
c1=(f3-f1)/(af3-af1);c2=((f2-f1)/(af2-af1)-c1)/(af2-af3);
if c2==0
J=1;break;
end
af4=0.5*(af1+af3-c1/c2);
if (af4-af1)*(af3-af4)<=0
J=1;break;
end
f4=f(af4);
end
if J==0
if f2>f4
afxin=af4;fxin=f4;
else
afxin=af2;fxin=f2;
end
else
afxin=af2;fxin=f2;
end
else
afxin=af2;fxin=f2;
end
else
afxin=f2;fxin=f2;
end