2.已知函数 f(x)= 3
8
x
2
2
x
7
x
,初始搜索区间为[a1,a3]=[0,2],求
3
解精度为 310 ,试用二次插值法求解函数的极小值点和极小值。
二次插值代码如下:
#include "stdio.h"
#include "math.h"
#define E 1e-3
#define f(x) 8*x*x*x-2*x*x-7*x+3
main()
{
int i=1;
float a1=0,a3=2,a2=(a1+a3)/2,ap;
float f1=f(a1),f2=f(a2),f3=f(a3),fp;
float c1,c2;
c1=(a2*a2-a3*a3)*f1+(a3*a3-a1*a1)*f2+(a1*a1-a2*a2)*f3;
c2=(a2-a3)*f1+(a3-a1)*f2+(a1-a2)*f3;
ap=c1/(2*c2);
fp=f(ap);
printf("%d %f %f %f %f %f
while(fabs(a2-ap)>=E)
{
\n",i,a1,a2,a3,ap,fp);
if(ap>=a2)
{
if(fp>=f2)
{a3=ap;f3=fp;
c1=(a2*a2-a3*a3)*f1+(a3*a3-a1*a1)*f2+(a1*a1-a2*a2)*f3;
c2=(a2-a3)*f1+(a3-a1)*f2+(a1-a2)*f3;
ap=c1/(2*c2);
fp=f(ap);
}
else
{a1=a2;f1=f2;
a2=ap;f2=fp;
c1=(a2*a2-a3*a3)*f1+(a3*a3-a1*a1)*f2+(a1*a1-a2*a2)*f3;
c2=(a2-a3)*f1+(a3-a1)*f2+(a1-a2)*f3;
ap=c1/(2*c2);
fp=f(ap);
}
}
else
{
if(fp>=f2)
{
a1=ap;f1=fp;
c1=(a2*a2-a3*a3)*f1+(a3*a3-a1*a1)*f2+(a1*a1-a2*a2)*f3;
c2=(a2-a3)*f1+(a3-a1)*f2+(a1-a2)*f3;
ap=c1/(2*c2);
fp=f(ap);
}
else
{
a3=a2;f3=f2;
a2=ap;f2=fp;
c1=(a2*a2-a3*a3)*f1+(a3*a3-a1*a1)*f2+(a1*a1-a2*a2)*f3;
c2=(a2-a3)*f1+(a3-a1)*f2+(a1-a2)*f3;
ap=c1/(2*c2);
fp=f(ap);
}
}
i++;
printf("%d %f %f %f %f %f
}
if(f2>=fp)
\n",i,a1,a2,a3,ap,fp);
printf("迭代次数为%d\n 极小值点为%f\n 最优解为%f\n",i,ap,fp);
else
printf("迭代次数为%d\n 极小值点为%f\n 最优解为%f\n",i,a2,f2);
}