c程序问题:error C2059: syntax error : '{',求解!!!
程序为求解一函数的最小值,f(x1,x2)=x1*x1+x2*x2-x1*x2-10*x1-4*x2+60;ε<=0.001;
build时主函数中x[2][2]={1,1};s[2][2]={9,3};g[2][2]={-9,-3};g[1]={G1(x[i][0],x[i][1]),G2(x[i][0],x[i][1])};四句都提示是error C2059: syntax error : '{',求各位大侠指点!!!!
#include "stdio.h"
#include "math.h"
#define f(x1,x2) x1*x1+x2*x2-x1*x2-10*x1-4*x2+60
#define tdm(x1,x2) sqrt((2*x1-x2-10)*(2*x1-x2-10)+(2*x2-x1-4)*(2*x2-x1-4))
#define G1(x1,x2) 2*x1-x2-10
#define G2(x1,x2) 2*x2-x1-4
/*进退法求搜索区间*/
double qak(double x1[2],double s1[2],double B)
{
int k=1,i,j;
double a0=1,b0=0.5,a1,b1,a[3],f[3],y[3][2],m,n,ak2,c;/*a0为初始设定步长;b0为步长增量;m、n分别为确定的区间上下限;a1、b1为上下先限的输出值;ak2为最优步长返回值;*/
a[0]=a0;
a[1]=a0+b0;
for(i=0;i<2;i++)
for(j=0;j<2;j++) y[i][j]=x1[j]+a[i]*s1[j];
for(i=0;i<2;i++) f[i]=f(y[i][0],y[i][1]);
if(f[0]>f[1])
{
while(k)
{
b0=2*b0;
a[2]=a[1]+b0;
for(j=0;j<2;j++) y[2][j]=x1[j]+a[2]*s1[j];
f[2]=f(y[2][0],y[2][1]);
if(f[2]>f[1])
{
m=a[0];
n=a[2];
k=0;
}
else
{
k=1;
a[1]=a[2];
f[1]=f[2];
}
}
}
else
{
while(k)
{
b0=2*b0;
a[2]=a[0]-b0;
for(j=0;j<2;j++) y[2][j]=x1[j]+a[2]*s1[j];
f[2]=f(y[2][0],y[2][1]);
if(f[2]>f[0])
{
m=a[2];
n=a[1];
k=0;
}
else
{
k=1;
a[0]=a[2];
f[0]=f[2];
}
}
}
/*黄金分割法求最佳步长*/
a1=m;
b1=n;
a[0]=n-0.618*(n-m);
a[1]=(m+0.618*(n-m));
for(i=0;i<2;i++)
for(j=0;j<2;j++) y[i][j]=x1[j]+a[i]*s1[j];
for(i=0;i<2;i++) f[i]=f(y[i][0],y[i][1]);
do
{
if(f[0]<f[1])
{
n=a[1];
a[1]=a[0];
f[1]=f[0];
a[0]=n-0.618*(n-m);
for(j=0;j<2;j++) y[0][j]=x1[j]+a[0]*s1[j];
f[0]=f(y[0][0],y[0][1]);
}
else
{
m=a[0];
a[0]=a[1];
f[0]=f[1];
a[1]=n+0.618*(n-m);
for(j=0;j<2;j++)
y[1][j]=x1[j]+a[1]*s1[j];
f[1]=f(y[1][0],y[1][1]);
}
c=(n-m)/(b1-a1);
}while(fabs(c)>B);
ak2=(m+n)/2;
return ak2;
}
/*共轭梯度法*/
main()
{
double x[2][2],s[2][2],g[2][2],x0[2],s0[2],j=0.001,b=0,ak1; /*数组x第一行为第k-1个解,第二行为第k个解;数组s第一行为第k-1个搜索方向,第二行为第k个搜索方向;数组g第一行为第k-1个梯度,第二行为第k个梯度;j为精度;b为β;ak1为最佳步长;x0、s0为传值数组;*/
int i,flag;
double x1[2],s1[2],B;
x[2][2]={1,1};
s[2][2]={9,3};
g[2][2]={-9,-3};
if(tdm(x[0][0],x[0][1])<=j)
printf("最优解为:X={%d,%d};min=%d\n",x[0][0],x[0][1],f(x[0][0],x[0][1]));
else
{ do
{
k1=qak(x0,s0,b);
for(i=0;i<2;i++)
x[1][i]=x[0][i]+ak1*s[0][i];
if(tdm(x[1][0],x[1][1])<=j)
{
printf("最优解为:X={%d,%d};min=%d\n",x[1][0],x[1][1],f(x[1][0],x[1][1]));
flag=1;
}
else
{
flag=0;
g[1]={G1(x[i][0],x[i][1]),G2(x[i][0],x[i][1])};
b=(g[1][0]*g[1][0]+g[1][1]*g[1][1])/(g[0][0]*g[0][0]+g[0][1]*g[0][1]);
for(i=0;i<2;i++)
{
x[1][i]=(-g[1][i])+b*s[0][i];
x[0][i]=x[1][i];
x0[i]=x[0][i];
s[0][i]=s[1][i];
s0[i]=s[0][i];
g[0][i]=g[1][i];
}
}
}while(flag==0);
}
}