私はまだC言語に慣れていないので、背景知識があまりありません。私はfabs関数を使用していましたが、EXC_BAD_ACCESSを取得しました。誰でも私を助けることができますか?
#include <stdio.h>
#include <math.h>
// declare all the variables needed
int a, b, d, i, j, column, row, node, counter1, counter2, V0;
double volt, C, h, resi, odd, even, alpha, simpson;
double V[1000][1000], resid[1000][1000], dif_V[1000]; //1000 is chosen to get better value
int main(void)
{
// insert code here...
// obtaining values of variables
V0 = 100;
printf("The potential V0 may be taken as 100\n");
printf("Enter the values for dimension\n");
printf("1.Width of capacitor, a=");
scanf("%d", &a);
printf("\n 2.Height of Capacitor, b=");
scanf("%d", &b);
printf("\n 3.Length of middle plate, d=");
scanf("%d", &d);
printf("\n 4.Length of square mesh grid, h=");
scanf("%lf", &h);
printf("\n 5.Value of the relaxation factor, alpha=");
scanf("%lf", &alpha);
column= a/(2*h)+1; //calculate the number of columns
row= b/(2*h)+1; //calculate number of rows
node= d/(2*h)+1; //calculate number of nodes
counter1=1;
counter2=1;
//counter1 and counter2 allows the data to be printed for each 10 scans
//define boundary conditions
//all values are set to zero
for(i=1;i<=column;i++)
{
for(j=1; j<=column;j++)
V[i][j] = 0;
}
//set middle nodes to 100 Volts
for(i=1;i<=node;i++)
V[i][j] = V0;
printf("\n No of scans\t");
printf("Potential at the middle\t\t");
printf("Maximum residual\n");
do
{
//calculation of potential for every node using the 5 points formula
resi=0;
for (i=1;i<=node;i++)
{
for(j=2;j<row;j++)
{
if(i==1)
{
V[i-1][j]=V[i+1][j];
//apply the 'fictitious' nodes formula for nodes at boundary
}
volt=V[i][j];
//stores previous value of voltage in 'volt'
V[i][j]=0.25*(V[i-1][j] + V[i][j-1] + V[i][j+1] + V[i+1][j]);
//apply 5 points formula
resid[i][j]= V[i][j]-volt;
//calculate the residual
V[i][j]= volt + alpha*resid[i][j];
//applying SOR scheme
}
}
for(i=node+1; i<column;i++)
{
for(j=1; j<row;j++)
{
if(j==1)
{
V[i-1][j]=V[i+1][j];
}
volt=V[i][j];
//stores previous value of voltage in 'volt
V[i][j]=0.25*(V[i-1][j] + V[i][j-1] + V[i][j+1] + V[i+1][j]);
//apply 5 points formula
resid[i][j]= V[i][j]-volt;
//calculate the residual
V[i][j]= volt + alpha*resid[i][j];
//applying SOR scheme
}
}
//compare the residuals
//the fabs functions compute the absolute value of a floating point number
for(i=1;1<=node;i++)
{
for(j=2;j<row;j++)
{
if(fabs(resid[i][j])>resi)
{
resi=fabs(resid[i][j]);
}
}
}
for(i=node+1;i<column;i++)
{
for(j=2;j<row;j++)
{
if(fabs(resid[i][j])>resi)
{
resi=fabs(resid[i][j]);
}
}
}
counter1+=1;
counter2+=1;
if(counter2==100)
{
printf("\t %3d\t\t",counter1);
printf("%lf\t\t\t", V[(column-1)/2][(row-1)/2]);
printf("%lf\n", resi);
counter2=0;
}
}
while(resi>0.0001 != counter1>(2*column*row));
printf("Number of scans = %d\n", counter1);
//calculation of dv/dy
for (i=1;i<=node;i++)
dif_V[i]= (4*V[i][2] - 3*V[i][1] - V[i][3])/(2*h);
odd = 0;
even = 0;
for(i=3; i<=node; i=i+2)
odd= odd + dif_V[i];
for(i=2;i<=node;i=i+2)
even= even + dif_V[i];
simpson= (h/3)*(dif_V[1] + dif_V[node] + 4*even +2*odd);
C=(-0.04)*simpson;
printf("The capacitance per unit length = %lf", C);
}