黄金分割法C程序源代码
- 格式:wps
- 大小:23.00 KB
- 文档页数:6
t=(t1+t2)/2; b=t2;
t2=t1; f2=f1; t1=a+b-t2;
f1=f(t1); }
else { a=t1; t1=t2; f1=f2; t2=a+beta*(b-a); f2=f(t2); } } k++;
} t=(t1+t2)/2; printf("\nt=%lf",t); return t; }
*a=t<t1?t:t1; *b=t>t1?t:t1; break; } } t1=t0+h; f1=f(t1); } }
double hjfg() { double beta,t1,t2,t; double f1,f2; double a=0,b=0; double *c,*d; int k=0; c=&a,d=&b; sb(c,d); printf("\n[a,b]=[%lf,%lf]",a,b);
#include<stdio.h> #include<math.h> #define f(t) (8*pow(t,3)-2*pow(t,2)-7*t+3) #define eps pow(10,-6)
void sb(doቤተ መጻሕፍቲ ባይዱble *a,double *b) { double t0,t1,t,h,alpha,f0,f1; int k=0; printf("请输入初始点 t0="); scanf("%lf",&t0); printf("\n 请输入初始步长 h="); scanf("%lf",&h); printf("\n 请输入加步系数 alpha(需大于 1)="); scanf("%lf",&alpha); f0=f(t0); t1=t0+h; f1=f(t1); while(1) {
main()
{ double s,a,b,e;
int n=0;
scanf("%lf %lf %lf",&a,&b,&e); // 输入区间[a,b]和精度 e 的值
s=hj(&a,&b,e,&n);
//调用 hj 函数,其中 n 代表迭代次数
printf("a=%lf,b=%lf,s=%lf,n=%d\n",a,b,s,n);
}
beta=(sqrt(5)-1.0)/2; t2=a+beta*(b-a); f2=f(t2); t1=a+b-t2; f1=f(t1); while(1) {
printf("\n 第%d 次迭代的过程如下:",k+1); printf("\n[t1,t2]=[%lf,%lf]",t1,t2); if(fabs(t1-t2)<eps) break; else {
[t1,t2]=[0.644345,0.668737] 第 9 次迭代的过程如下: [t1,t2]=[0.629270,0.644345] 第 10 次迭代的过程如下: [t1,t2]=[0.619953,0.629270] 第 11 次迭代的过程如下: [t1,t2]=[0.629270,0.635028] 第 12 次迭代的过程如下: [t1,t2]=[0.625712,0.629270] 第 13 次迭代的过程如下: [t1,t2]=[0.629270,0.631470] 第 14 次迭代的过程如下: [t1,t2]=[0.627911,0.629270] 第 15 次迭代的过程如下: [t1,t2]=[0.629270,0.630110] 第 16 次迭代的过程如下: [t1,t2]=[0.630110,0.630630] 第 17 次迭代的过程如下: [t1,t2]=[0.629789,0.630110] 第 18 次迭代的过程如下: [t1,t2]=[0.629591,0.629789] 第 19 次迭代的过程如下: [t1,t2]=[0.629789,0.629912] 第 20 次迭代的过程如下: [t1,t2]=[0.629714,0.629789] 第 21 次迭代的过程如下: [t1,t2]=[0.629789,0.629836] 第 22 次迭代的过程如下: [t1,t2]=[0.629761,0.629789] 第 23 次迭代的过程如下: [t1,t2]=[0.629789,0.629807] 第 24 次迭代的过程如下: [t1,t2]=[0.629778,0.629789] 第 25 次迭代的过程如下: [t1,t2]=[0.629789,0.629796] 第 26 次迭代的过程如下: [t1,t2]=[0.629785,0.629789] 第 27 次迭代的过程如下: [t1,t2]=[0.629783,0.629785] 第 28 次迭代的过程如下: [t1,t2]=[0.629785,0.629787] 第 29 次迭代的过程如下: [t1,t2]=[0.629787,0.629788] t=0.629787
函数的最优值为 f(0.629787)=-0.203425
给,已经编译运行确认: #include "math.h" #include "stdio.h" #define f(x) x*x+2*x+1 //一元函数,这里按照你的要求写的是:x2+2x+1 //函数功能是用黄金分割法实现求一元函数 的最优解 double hj(double *a,double *b,double e,int *n) { double x1,x2,s; if(fabs(*b-*a)<=e) s=f((*b+*a)/2); else { x1=*a+0.382*(*b-*a); x2=*a+0.618*(*b-*a); if(f(x1)>f(x2)) *a=x1; else *b=x2; *n=*n+1; s=hj(a,b,e,n); } return s; }
main() { double t; t=hjfg(); printf("\n 函数的最优值为 f(%lf)=%lf",t,f(t)); }
运行结果如下:
请输入初始点 t0=0
请输入初始步长 h=1
请输入加步系数 alpha(需大于 1)=2
f1=3.000000,f2=2.000000,t0=0.000000,t=1.000000,h=1.000000,k=0 f1=2.000000,f2=180.000000,t0=1.000000,t=3.000000,h=2.000000,k=1 [a,b]=[0.000000,3.000000] 第 1 次迭代的过程如下: [t1,t2]=[1.145898,1.854102] 第 2 次迭代的过程如下: [t1,t2]=[0.708204,1.145898] 第 3 次迭代的过程如下: [t1,t2]=[0.437694,0.708204] 第 4 次迭代的过程如下: [t1,t2]=[0.708204,0.875388] 第 5 次迭代的过程如下: [t1,t2]=[0.604878,0.708204] 第 6 次迭代的过程如下: [t1,t2]=[0.541020,0.604878] 第 7 次迭代的过程如下: [t1,t2]=[0.604878,0.644345] 第 8 次迭代的过程如下:
printf("\nf1=%lf,f2=%lf,t0=%lf,t=%lf,h=%lf,k=%d",f0,f1,t0,t1,h,k); if(f1<f0) {
h=alpha*h; t=t0; t0=t1; f0=f1; k++; } else { if(k==0) {h=-h;t=t1;} else {