2.已知函数 f(x)= ,初始搜索区间为[a1,a3]=[0,2],求
解精度为 ,试用二次插值法求解函数的极小值点和极小值。
二次插值代码如下:
#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 ",i,a1,a2,a3,ap,fp);
while(fabs(a2-ap)>=E)
{
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)
- 1
- 2
前往页