各位高手,帮帮小妹,周三前帮我搞定阿,不然我会死的很惨!!
以下程序总有问题,帮忙修改一下 M值大概都在-1到+1之间
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int initia(int c[][20],int n)
{
int i,j;
randomize();
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
c[i][j]=random(100); /*随机数产生*/
if (c[i][j]>=50)
c[i][j]=1;
else
c[i][j]=-1;
printf("%4d",c[i][j]); /*产生+1一1的随机矩阵*/ +1代表向上-1向下
}
}
return;
}
int sweep(int m[][20],int np1,int ndmn,int ds_mtx[][20]) /*子程序sweep调用*/
{
int msi[22][22]={0},i,j; sweep是对整个矩阵的扫描,判断向上向下是否要改变
double r,e,x,de;
for(i=1;i<np1;i++)
for(j=1;j<np1;j++)
{
msi[i][j]=m[i-1][j-1];
}
for(i=1;i<=ndmn;i++)
for(j=1;j<=ndmn;j++)
{
if(i==1) msi[i-1][j]=msi[ndmn][j]; /*实现周期性条件*/
if(i==ndmn) msi[i+1][j]=msi[1][j];
if(j==1) msi[i][j-1]=msi[i][ndmn];
if(j==ndmn) msi[i][j+1]=msi[i][1];
de=-2*msi[i][j]*(e*(msi[i-1][j]+msi[i+1][j]+msi[i][j-1]+msi[i][j+1])); /*构型选取*/
r=exp(-de);
x=random(100)/100;
if(r>1||x<=r) /*构型比较* r>1||x<=r时改变方向/
msi[i][j]=-1*msi[i][j];
}
for(i=1;i<=ndmn;i++)
for(j=1;j<=ndmn;j++)
ds_mtx[i-1][j-1]=msi[i][j]; /*放到结果矩阵中*/
return;
}
main()
{
int i,j,p,q,f,g,h,a,n=20,ntherm=20,nskip=5,nens=100,ngroup=100;
int ms[][20]={0},msj[][22]={0};
double e,E,M,Ts,Tb;
initia(ms,n); /*初始化矩阵*/ /* 这里好像有问题*/
e=0.3;
for(p=1;p<=40;p++)
{
for(q=1;q<ntherm;q++)
{
sweep(ms,n+1,n,ms); /*子程序sweep调用*/ /*先去掉开始的几个矩阵*/
}
for(a=1;a<=ngroup;a++) /*开始循环*/
{
for(f=1;f<=n;f++)
for(g=1;g<=n;g++)
{
msj[f][g]=ms[f-1][g-1];
}
for(i=1;i<=n;i++) /*实现周期性条件*/
for(j=1;j<=n;j++)
{
if(i==1) msj[i-1][j]=msj[20][j];
if(i==20) msj[i+1][j]=msj[1][j];
if(j==1) msj[i][j-1]=msj[i][20];
if(j==20) msj[i][j+1]=msj[i][1];
Ts+=msj[i][j]*(msj[i-1][j]+msj[i+1][j]+msj[i][j-1]+msj[i][j+1]); /*用来求E,M*/
Tb+=msj[i][j];
}
for(h=0;h<=nskip;h++) 每隔nskip次取一个矩阵
{
sweep(ms,n+1,n,ms); /*子程序sweep调用*/
}
E+=(-e*Ts);
M+=Tb;
}
E=E/nens; /* 求平均值*/
M=M/nens;
printf("%8.4",e); /* e的值总为0,有问题*/
printf("%8.4",E);
printf("%8.4",M);
e+=0.01;
}
}