本实验中函数用单独function计算
%函数[fx]=f(x)
function fx=f(x)
fx=x.^4-4*x.^3-6*x.^2-16*x+4;
一,进退法,Fibonacci,黄金分割法,抛物线法流程图及代码
(一)、进退法
%进退法[a_left,c_middle,b_right]=jintuifa(x0,h)
function [a_left,c_middle,b_right]=jintuifa(x0,h)
a_left=0;
c_middle=0;
b_right=0;
%step1
fx0=f(x0);
%step2
x1=x0+h;
fx1=f(x1);
if(fx1<=fx0)
while(1)
%step3
h=2*h;
if(h>100000000)
fprint('算法失效');
return;
end
x2=x1+h;
fx2=f(x2);
if(fx1<=fx2)
a_left=x0;
c_middle=x1;
b_right=x2;
return
end
%step4
x0=x1;
x1=x2;
fx0=fx1;
fx1=fx2;
end
else
while(1)
%step5
h=2*h;
if(h>100000000)
fprint('算法失效');
return;
end
x2=x0-h;
fx2=f(x2);
if(fx0<=fx2)
a_left=x2;
c_middle=x0;
b_right=x1;
return
end
%step6
x1=x0;
x0=x2;
fx1=fx0;
fx0=fx2;
end
end
(二)、Fibonacci法
1.流程图
2.代码
%x=Fibonacci(a,b,e)
function x=Fibonacci(a,b,e)
x=0;
%step1
c=(b-a)/e;
n=2;
F=[1 1];
while(1)
%step2
n=n+1;
F=[F F(n-1)+F(n-2)];
%step3
if F(n)>=c
break;
end
end
%step4
k=1;
x1=a+(F(n-2)/F(n))*(b-a);
x2=a+(F(n-1)/F(n))*(b-a);
f1=f(x1);
f2=f(x2);
%step5
while(1)
if(f1<f2)
b=x2;
x2=x1;
f2=f1;
x1=a+(F(n-k-2)/F(n-k))*(b-a);
f1=f(x1);
else
a=x1;
x1=x2;
f1=f2;
x2=a+(F(n-k-1)/F(n-k))*(b-a);
f2=f(x2);
end
%step6
k=k+1;
if k>=n-2
break;
end
end
%step7
if(f1<f2)
b=x2;
x2=x1;
f2=f1;
else
a=x1;
end
%step8
x1=x2-0.1*(b-a);
f1=f(x1);
if f1<f2
x=(a+x2)/2;
else
if f1<=f2
x=(x1+x2)/2;
else
x=(x1+b)/2;
end
end
(三)、黄金分割法
1.流程图
2.代码
%x=huangjinfenge(a,b,e)
function x=huangjinfenge(a,b,e)
c=1;
%step1
while(c)
c=0;
x1=a+0.382*(b-a);
f1=f(x1);
x2=a+0.618*(b-a);
f2=f(x2);
while(1)
%step2
if(abs(b-a)<=e)
x=(a+b)/2;
return;
end
%step3
if(f1<f2)
b=x2;
x2=x1;
f2=f1;
x1=a+0.382*(b-a);
f1=f(x1);
else
if(f1<=f2)
a=x1;
b=x2;
c=1;
break;
else
a=x1;
x1=x2;
f1=f2;
x2=a+0.618*(b-a);
f2=f(x2);
end
end
end
end
(四)、抛物线法
1.流程图
2.代码
%x=paowuxian(x1,x0,x2,e1,e2)
function x=paowuxian(x1,x0,x2,e1,e2)
f0=f(x0);
f1=f(x1);
f2=f(x2);
while(1)
%step1
if(abs(x1-x2)<=e1)
x=x0;%step10
return;
end
%step2
if(abs((x2-x0)*f1+(x1-x2)*f0+(x0-x1)*f2)<=e2)
x=x0;%step10
return;
end
%step3
x_=1/2*((x2*x2-x0*x0)*f1+(x1*x1-x2*x2)*f0+(x0*x0-x1*x1)*f2)/((x2-x0)*f1+(x1-x2)*f0+(x0-x1)*f2);
f_=f(x_);
%step4
if (f0-f_)>0
%step5
if(x0>x_)
x2=x0;
x0=x_;
f2=f0;
f0=f_;
else
x1=x0;
x0=x_;
f1=f0;
f0=f_;
end
else
if((f0-f_)<0)
%step6
if(x0<x_)
x2=x_;
f2=f_;
else
x1=x_;
f1=f_;
end
else
%step7
if(x0<x_)
x1=x0;
x2=x_;
x0=1/2*(x1+x2);
f1=f0;
f2=f_;
f0=f(x0);
else
if(x0<=x_)
%step8
xv=1/2*(x1+x0);
fv=f(xv);
if(fv<f0)
x2=x0;
x0=xv;
f2=f0;
f0=fv;
else
if(fv<=f0)
x1=xv;
x2=x0;
x0=1/2*(x1+x2);
f1=fv;
f2=f0;
f0=f(x0);
else
x1=xv;
f1=fv;
end
end
else
%step9
x1=x_;
x2=x0;
x0=1/2*(x1+x2);
f1=f_;
f2=f0;
f0=f(x0);
end
end
end
end
end
二、应用以上代码解决问题
代码如下:
[a,b,c]=jintuifa(0,0.1);
x=Fibonacci(a,c,10^-4);
fprintf('Fibonacci:\tx*=%f\tf(x)=%f\n',x,f(x));
x=huangjinfenge(a,c,10^-4);
fprintf('黄金分割法:\tx*=%f\tf(x)=%f\n',x,f(x));
x=paowuxian(a,b,c,10^-4,10^-30);
fprintf('抛物线法:\tx*=%f\tf(x)=%f\n',x,f(x));
结果