logo资料库

二次插值法求极值的程序代码.doc

第1页 / 共2页
第2页 / 共2页
资料共2页,全文预览结束
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); }
分享到:
收藏