C语言高手请进 编程问题
以下是一段用黄金分割法求最优解的程序,请高手进来看看,错误在哪里。#include<stdio.h>
#include<math.h>
#define PI 3.1415926
#define E(b) fabs(A*(1/(PI*PI))*((PI-b)*(b/sin(b)+cos(b))+2*sin(b))-
(1/(2*PI))*((b/sin(b)+b/tan(b)+cos(b))+cos(b)*cos(b)-(PI*PI)/4-
(3*sin(b)*sin(b)/4)+(b*b)/4)))+2*fabs(A*((sin(b)/(16*PI)- b/(2*(pow(PI,2)))*(b/sin(b)
+cos(b))+sin(b)/pow(PI,2)+1/8-pow(b,2)*cos(b)/(8*PI*sin(b))))
#define z 1e-5
void sb(double*a,double*b)
{
double b0,b1,b,h,alpha,E0,E1;
int k=0;
printf("请输入初始点b0=");
scanf("%lf",&b0);
printf("\n请输入初始步长h=");
scanf("&lf",&h);
printf("\n请输入加步系数alpha(需大于1)=");
scanf("%lf",&alpha);
E0=E(b0);
b1=b0+h;
E1=E(b1);
while(1)
{
printf("\nE1=%lf,E0=%lf,b0=%lf,b1=%lf,h=%lf,k=%d",E1,E0,b0,b1,h,k);
if(E1<E0)
{
h=alpha*h;
b=b0;
b0=b1;
E0=E1;
k++;
}
else
{
if(k==0)
{h=-h,b=b1;}
else
{
*a=b<b1?b:b1;
*b=b>b1?b:b1;
break;
}
}
b1=b0+h;
E1=E(b1);
}
double hjfg()
{
double beta,b1,b2,b;
double E1,E2;
double e=PI/6,f=PI/3;
double *c,*d;
sb(c,d);
printf("\n[e,f]=[%lf,%lf]",e,f);
beta=((srqt(5)-1)/2);
b2=e+beta*(f-e);
E2=E(b2);
b1=e+f-b2;
E1=E(b1);
while(1)
{
printf("\n第%d次的迭代过程如下:",k+1);
printf("\n[b1,b2]=[%lf,%lf],b1,b2");
if(fabs(b1-b2)<z)
break;
else
{
if(E1<E2)
{
b=(b1+b2)/2;
f=b2;
b2=b1;
E2=E1;
b1=e+f-b2;
E1=E(b1);
}
else
{
e=b1;
b1=b2;
E1=E2;
b2=e+beta*(f-e);
E2=E(b2);
}
}
k++;
}
b=(b1+b2)/2;
printf("\nb=%f",b);
getch();
return(b);
}
main()
{
double b;
b=hjfg();
getch();
printf("\n函数的最优值为E(%lf)=%lf",E(b),b);
}
其中显示红色的一行老是错误,也不知道是什么原因。#define E(b)后是一个表达式,具体为(δAB的绝对值+2*δC的绝对值),其中δAB、
δC的具体表达式见公式图。
公式图.rar
(10.38 KB)
密码:123.