c程序问题:error C2059: syntax error : '{',求解!!!

y3453993 2011-01-06 03:40:20
程序为求解一函数的最小值,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);
}
}
...全文
277 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
可乐崽 2011-01-07
  • 打赏
  • 举报
回复
x[2][2] 只是一个元素,怎么可以写成 x[2][2] = {1, 1}

只能这样: x[2][2] = 1;
y3453993 2011-01-07
  • 打赏
  • 举报
回复
我知道了!多谢!!
[Quote=引用 18 楼 snowwhite1 的回复:]
x[2][2]={1,1};
s[2][2]={9,3};
g[2][2]={-9,-3};
这些数组不能这样赋值,只能初始化时整体赋值。如果没有初始化,在下面赋值时只能对数组里的单个元素进行赋值,一般通过循环实现。
初始化时如果没有全部赋值,则没有赋值的那些元素自动用0赋值。
[/Quote]
y3453993 2011-01-07
  • 打赏
  • 举报
回复
多谢大虾啦!!!
[Quote=引用 8 楼 mnbqwe1 的回复:]
初始化
才能用{}
http://topic.csdn.net/t/20041020/17/3474839.html
[/Quote]
flysnowhite 2011-01-07
  • 打赏
  • 举报
回复
x[2][2]={1,1};
s[2][2]={9,3};
g[2][2]={-9,-3};
这些数组不能这样赋值,只能初始化时整体赋值。如果没有初始化,在下面赋值时只能对数组里的单个元素进行赋值,一般通过循环实现。
初始化时如果没有全部赋值,则没有赋值的那些元素自动用0赋值。
y3453993 2011-01-07
  • 打赏
  • 举报
回复
哪来的元素x[2][2][?
Quote=引用 10 楼 diamont1001 的回复:]
x[2][2] 只是一个元素,怎么可以写成 x[2][2] = {1, 1}

只能这样: x[2][2] = 1;
[/Quote]
y3453993 2011-01-07
  • 打赏
  • 举报
回复
那是你没看到吧!
[Quote=引用 2 楼 bdmh 的回复:]
你在哪声明的x,s,g 呢
[/Quote]
y3453993 2011-01-07
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 diamont1001 的回复:]
x[2][2] 只是一个元素,怎么可以写成 x[2][2] = {1, 1}

只能这样: x[2][2] = 1;
[/Quote]我定义的数组是x[2][2],哪来的元素x[2][2];我给整个数组赋值怎么不能那样写?
xpston008 2011-01-07
  • 打赏
  • 举报
回复
写一部分编译部分。别一下子写完再编译


double x[2][2]={1,1};
double s[2][2]={9,3};
double g[2][2]={-9,-3};


g[1]={G1(x[i][0],x[i][1]),G2(x[i][0],x[i][1])};
改为
g[1][0]=G1(x[i][0],x[i][1]);
g[1][1] =G2(x[i][0],x[i][1]);

arong1234 2011-01-07
  • 打赏
  • 举报
回复
f[0]=f(y[0][0],y[0][1]);

不清楚这是不是问题,f是宏,f[0]可能是非法的
某某9 2011-01-07
  • 打赏
  • 举报
回复
句法错误
括号不配?
magicrobot 2011-01-07
  • 打赏
  • 举报
回复
是啊,二唯数组杂这样给值呢
[Quote=引用 10 楼 diamont1001 的回复:]
x[2][2] 只是一个元素,怎么可以写成 x[2][2] = {1, 1}

只能这样: x[2][2] = 1;
[/Quote]
mnbqwe1 2011-01-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 bdmh 的回复:]
而且也没有这么赋值的 x[2][2]={1,1};
倒是可以这样 int x[2][2]={1,1,1,1}
[/Quote]
x[2][2]={1,1};可以的吧,其他缺省为0
mnbqwe1 2011-01-06
  • 打赏
  • 举报
回复
初始化
才能用{}
http://topic.csdn.net/t/20041020/17/3474839.html
luciferisnotsatan 2011-01-06
  • 打赏
  • 举报
回复
double x[2][2]={1,1};
double s[2][2]={9,3};
double g[2][2]={-9,-3};


另外,为什么给二维数组这么赋值??
bdmh 2011-01-06
  • 打赏
  • 举报
回复
而且也没有这么赋值的 x[2][2]={1,1};
倒是可以这样 int x[2][2]={1,1,1,1}
yuppy 2011-01-06
  • 打赏
  • 举报
回复

double x[2][2] = {1,1},s[2][2] = {9,3},g[2][2] = {-9,-3},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};
luciferisnotsatan 2011-01-06
  • 打赏
  • 举报
回复
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};


只有在初始化时,才能用{}给数组赋值
ryfdizuo 2011-01-06
  • 打赏
  • 举报
回复
大括号的问题 '{'
是不是不匹配?
bdmh 2011-01-06
  • 打赏
  • 举报
回复
你在哪声明的x,s,g 呢
colorfulcode 2011-01-06
  • 打赏
  • 举报
回复
看着有点晕

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧