📄 s04538.c
字号:
# include <stdio.h>
# include <math.h>
#define MAX_LEN 20
/* define variables */
int K,M ;
double Z[MAX_LEN] ;
double V[MAX_LEN] ;
double r1 , r2, e, v ;
double h ;
int M1, M2 ;
int N[MAX_LEN] ;
int NST, INS ;
double EV[MAX_LEN] ;
double c1[51][101],c2[51][101],c3[51][101],c4[51][101] ;
double HR[MAX_LEN] ;
double HZ[MAX_LEN] ;
int Left[MAX_LEN] ;
double w,w1;
int g,q,f1,f2;
double mk;
double mc;
double mb;
double me1,me2;
double mm;
double y;
double a[51][101];/*dian de dian wei*/
double b[51][101][6];/*0:z 1:r 2:h1 3:h2 4:h3 5:h4 */
int MAXR ;
int MAX_Z;
int loadData();
int calC();
int putIn();
int showData(); /* for test */
int print();
void main()
{ int i,j;
w=1;
mm=0;
loadData();
showData();
calC();
for(g=0;g<1;g++){
putIn();
}
w=1.375;
for(g=0;g<12;g++){
putIn();
if(g==10){
me1=mc;
}
if(g==11){
me2=mc;
}
}
y=me2/me1;
w=2/(1+sqrt(1-(y+w-1)*(y+w-1)/(y*w*w)));
w=1.25*w-0.5;
for(q=0;q<1000;q++){
w1=w;
for(g=0;g<12;g++){
putIn();
if(g==10){
me1=mc;
}
if(g==11){
me2=mc;
}
}
y=me2/me1;
w=2/(1+sqrt(1-(y+w-1)*(y+w-1)/(y*w*w)));
w=1.25*w-0.5;
if(fabs((w-w1)/(2-w1))<0.05){
break;
}
}
/*
for(i=0;i<MAXR;i++){
for(j=1;j<=MAX_Z;j++){
printf("%lf ",a[i][j]);
}
printf(" %d \n",i);
}*/
w=w;
q=q;
g=0;
q=1;
while(mm>e){
g++;
putIn();
while(g==12){
q++;
g=0;
}
}
/*
for(q=0;q<1000;q++){
for(g=0;g<12;g++){
putIn();
if(mm<e){
break;
}
}
}*/
/* fprintf */
print();
/* draw */
return ;
}
int loadData()
{
FILE * fp=NULL;
int k=0;
if( (fp=fopen("D:\\S04538\\S04538.txt","r")) == NULL)
{
printf("can not open file.\n");
return -1 ;
}
fscanf(fp,"K=%d;M=%d;\n",&K,&M);
fscanf(fp, "Z=");
for(k=0;k<K-1;k++)
fscanf(fp,"%lf,",&Z[k]);
fscanf(fp,"%lf;\n",&Z[K-1]);
fscanf(fp,"V=");
for(k=0;k<K-1;k++)
fscanf(fp,"%lf,",&V[k]);
fscanf(fp,"%lf;\n",&V[K-1]);
fscanf(fp,"r1=%lf;r2=%lf;e=%lf;v=%lf;\n",&r1,&r2,&e,&v);
fscanf(fp,"h=%lf;\n",&h);
fscanf(fp,"M1=%d;M2=%d;\n",&M1,&M2);
fscanf(fp,"n=");
for(k=0;k<K-1;k++)
fscanf(fp,"%d,",&N[k]);
fscanf(fp,"%d;\n",&N[K-1]);
fscanf(fp,"NST=%d;INS=%d;\n",&NST,&INS);
fscanf(fp, "EV=");
for(k=0;k<M-1;k++)
fscanf(fp,"%lf,",&EV[k]);
fscanf(fp,"%lf;\n",&EV[M-1]);
fclose(fp);
return 0 ;
}
int showData()
{
int i=0;
printf("K=%d;M=%d;\n",K,M);
for( i=0; i<K; i++ )
printf(" %.1lf ",Z[i]);
printf("\n");
for( i=0; i<K; i++ )
printf(" %.1lf ",V[i]);
printf("\n");
printf(" r1=%.1lf,r2=%.1lf,e=%lf,v=%.1lf \n",r1,r2,e,v);
printf(" h=%.1lf \n",h);
printf(" M1=%d,M2=%d\n",M1,M2);
for( i=0; i<K; i++ )
printf(" %d ",N[i]);
printf("\n");
printf(" NST=%d,INS=%d\n",NST,INS);
for( i=0; i<M; i++ )
printf(" %.1lf",EV[i]);
printf("\n");
return 0;
}
int calC()
{
/*qiu dian de zuo biao*/
/*a[r][z] b[r][z]*/
int i,j,l,m,k;
k=0;
MAXR=M1+M2;
MAX_Z=0;
for(i=0;i<K;i++){
MAX_Z=N[i]+MAX_Z;
}
MAX_Z=MAX_Z+K-1;
/*xian qiu r*/
for(i=0;i<=MAX_Z;i++){
b[0][i][1]=0;
}
for(j=1;j<=MAXR;j++){
for(i=0;i<=MAX_Z;i++){
if(j<=M1){
b[j][i][1]=j*r1/M1;
}
else{
b[j][i][1]=r1+(j-M1)*r2/M2;
}
}
}
/*ran hou qiu z*/
i=0;
j=1;
m=N[0];
for(l=0;l<=MAXR;l++){
for(i=0,m=N[0];i<K;i++,m=m+N[i]+1){
for(;j<=m;j++){
b[l][j][0]=b[l][j-1][0]+Z[i]/N[i];
}
if(i!=K-1){
b[l][j][0]=b[l][j-1][0]+h;
j++;
}
}
j=1;
}
/*chu shi hua ge dian dian wei*/
for(i=0;i<=MAXR;i++){
for(j=0;j<=MAX_Z;j++){
a[i][j]=0;
}
}
/*z zhou shang de dian de dian wei*/
for(l=1;l<=MAX_Z;l++){
a[0][l]=100*b[0][l][0]/b[0][MAX_Z][0];
}
/*yang ji shang dian wei*/
for(i=0;i<=MAXR;i++)
{
a[i][MAX_Z]=100;
}
/*qi yu ge dian ji shang de dian de dian wei*/
for(i=0,j=0;j<K-1;j++)
{
i=i+N[j];
for(l=M1;l<=MAXR;l++){
a[l][i]=V[j];
a[l][i+1]=V[j];
}
i++;
}
/*dian ji jian feng bi bian jie shang de dian wei*/
j=1;
for(i=0;i<K;i++){
k=k+N[i];
for(;j<k;j++){
if(i==0){
a[MAXR][j]=V[i]*j/N[i];
a[MAXR][j]=a[MAXR][j];
}
else{
a[MAXR][j]=(V[i]-V[i-1])/N[i]+a[MAXR][j-1];
a[MAXR][j]=a[MAXR][j];
}
}
k++;
j++;
j++;
}
/*ji suan bu chang*//*0:z 1:r 2:h1 3:h2 4:h3 5:h4 */
for(i=0;i<MAXR;i++){
for(j=1;j<MAX_Z;j++){
b[i][j][2]=b[i][j][0]-b[i][j-1][0];
b[i][j][3]=b[i][j+1][0]-b[i][j][0];
if(i==0){
b[i][j][4]=0;
}
else{
b[i][j][4]=b[i][j][1]-b[i-1][j][1];
}
b[i][j][5]=b[i+1][j][1]-b[i][j][1];
}
}
/*qiu c1 c2 c3 c4*/
for(i=0;i<MAXR;i++){
for(j=1;j<MAX_Z;j++){
if(i==0){
c3[0][j]=0;
c4[0][j]=4/(b[0][j][5]*b[0][j][5]);
}
else{
c3[i][j]=(2*b[i][j][1]-b[i][j][5])/(b[i][j][1]*b[i][j][4]*(b[i][j][4]+b[i][j][5]));
c4[i][j]=(2*b[i][j][1]+b[i][j][4])/(b[i][j][1]*b[i][j][5]*(b[i][j][4]+b[i][j][5]));
}
c1[i][j]=2/(b[i][j][2]*(b[i][j][2]+b[i][j][3]));
c2[i][j]=2/(b[i][j][3]*(b[i][j][2]+b[i][j][3]));
c1[i][j]=c1[i][j];
c2[i][j]=c2[i][j];
c3[i][j]=c3[i][j];
c4[i][j]=c4[i][j];
}
}
return 0;
}
int putIn(){
int i,j,l,k;
mc=0;
mb=0;
mm=0;
f1=0;
f2=0;
for(i=0;i<MAXR;i++){
for(j=1;j<MAX_Z;j++){
mk=a[i][j];
k=0;
if(i==0){
a[i][j]=(1-w)*a[i][j]+w*(c1[i][j]*a[i][j-1]+c2[i][j]*a[i][j+1]+c4[i][j]*a[i+1][j])/(c1[i][j]+c2[i][j]+c4[i][j]);
}
else{
if(i<M1){
a[i][j]=(1-w)*a[i][j]+w*(c1[i][j]*a[i][j-1]+c2[i][j]*a[i][j+1]+c3[i][j]*a[i-1][j]+c4[i][j]*a[i+1][j])/(c1[i][j]+c2[i][j]+c3[i][j]+c4[i][j]);
}
else{
k=j;
for(l=0;l<K-1;l++){
k=k-N[l];
switch(k){
case 0:a[i][j]=V[l];break;
case 1:a[i][j]=V[l];break;
default:k--;break;
}
if(a[i][j]==V[l]){
break;
}
}
if(l==K-1){a[i][j]=(1-w)*a[i][j]+w*(c1[i][j]*a[i][j-1]+c2[i][j]*a[i][j+1]+c3[i][j]*a[i-1][j]+c4[i][j]*a[i+1][j])/(c1[i][j]+c2[i][j]+c3[i][j]+c4[i][j]);}
}
}
mc=mc+fabs(mk-a[i][j]);
mb=fabs(mk-a[i][j]);
if(mb>mm){
mm=mb;
f1=i;
f2=j;
}
}
}
return 0;
}
int print()
{
int i,j;
FILE * fp;
if((fp=fopen("D:\\s04538\\s04538.res","w"))==NULL){
printf("can not open file.\n");
}
fprintf(fp," NUMERICAL SOLUTIONS OF ELECTROSTATIC POTENTIAL DISTRIBUTION\n");
fprintf(fp," IN AN IMAGING TUBE USING*SOR*METHOD\n");
fprintf(fp,"\n");
fprintf(fp," THE TUBE BOUNDARY AND DATATABLE\n");
fprintf(fp,"\n");
fprintf(fp," CATHODE ELECTRODS SCREEN\n");
fprintf(fp," |------|------|-----.....-----|-----|\n");
fprintf(fp," | | | | |\n");
fprintf(fp," | N1 | N2 | | N%d |\n",K-1);
fprintf(fp," | | | | |\n");
fprintf(fp," | V1 V2 | V%d\n",K-1);
fprintf(fp," | |\n");
fprintf(fp," %d STEPS %.2lfV\n",M1+M2,V[K-1]);
fprintf(fp," | |\n");
fprintf(fp," | |\n");
fprintf(fp,"\n");
fprintf(fp,"\n");
fprintf(fp,"K=%d;M=%d;\n",K,M);
for( i=0; i<K; i++ )
fprintf(fp," %.1lf ",Z[i]);
fprintf(fp,"\n");
for( i=0; i<K; i++ )
fprintf(fp,"%.1lf ",V[i]);
fprintf(fp,"\n");
fprintf(fp," r1=%.1lf,r2=%.1lf,e=%6lf,v=%.1lf \n",r1,r2,e,v);
fprintf(fp," h=%.1lf \n",h);
fprintf(fp," M1=%d,M2=%d\n",M1,M2);
for( i=0; i<K; i++ )
fprintf(fp," %d ",N[i]);
fprintf(fp,"\n");
fprintf(fp," NST=%d,INS=%d\n",NST,INS);
for( i=0; i<M; i++ )
fprintf(fp," %.1lf",EV[i]);
fprintf(fp,"\n");
fprintf(fp,"i=%d,j=%d\n",f1,f2);
fprintf(fp,"q=%d,g=%d\n",q,g);
for(i=MAXR;i>=0;i--){
for(j=0;j<=MAX_Z;j++){
fprintf(fp,"(%lf,%lf),%f ",b[i][j][0],b[i][j][1],a[i][j]);
}
fprintf(fp," 第%d行\n",i);
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -