谁帮我看看这个程序的错误啊~我是win7 64位,编译无错误,每次运行都无响应。
程序:电磁学用有限差分法解静电场边值问题这里是方法原理:http://wenku.baidu.com/view/3590b8d726fff705cc170abd.html...
程序:电磁学用有限差分法解静电场边值问题
这里是方法原理:
http://wenku.baidu.com/view/3590b8d726fff705cc170abd.html
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define pi 3.1415926
double LV,RV,TV,DV,LH,WH;
double **a,w,SL,alfa=1.3;
int x,y,i,j;
static int flag=0;
//获得一行或一列的节点数
int fun4(double h,double sl)
{
int result=0;
while(h>0)
{
h=h-sl;
result++;
}
return result+1;
}
//检测是否达到制定精度
int fun3(double **a,double**b,double w)
{
if(fabs(**a-**b)<=w)
return 1;
else
return 0;
}
//进行逐次超松弛迭代
void fun2(double **u,double alfa,double w)
{
int i,j;
double **a={0},**b={0};
for(j=0;j<y;j++)
for(i=0;i<x;i++)
{
a[j][i]=u[j][i];
b[j][i]=u[j][i];
}
flag++;
for(j=1;j<y-1;j++)
for(i=1;i<x-1;i++)
{
b[j][i]=a[j][i]+(alfa*(a[j][i+1]+a[j+1][i]+b[j][i-1]+b[j-1][i]-4*a[j][i]))/4;
}
for(j=1;j<y-1;j++)
for(i=1;i<x-1;i++)
if(!fun3(a,b,w))
fun2(b,alfa,w);
else
u[j][i]=b[j][i];
}
//初始化(ui取0)
void fun1(double **u,int x,int y)
{
int i,j;
for(j=0;j<y;j++)
for(i=0;i<x;i++)
{
u[j][i]=0;
if(j==0)
u[j][i]=DV;
if(j==y-1)
u[j][i]=TV;
if(i==0)
u[j][i]=LV;
if(i==x-1)
u[j][i]=RV;
}
}
void main()
{
printf("学号:20104450320 班级:电力103班 姓名:陈敏林\n");
printf("请输入左端边界电压值:\n");
scanf("%lf",&LV);
printf("请输入右端边界电压值:\n");
scanf("%lf",&RV);
printf("请输入顶部边界电压值:\n");
scanf("%lf",&TV);
printf("请输入底部边界电压值:\n");
scanf("%lf",&DV);
printf("请输入矩形槽的宽度:\n");
scanf("%lf",&WH);
printf("请输入矩形槽的高度:\n");
scanf("%lf",&LH);
printf("请输入矩形的步距:\n");
scanf("%lf",&SL);
printf("请输入相邻两次迭代值的指定的最大允许误差:\n");
scanf("%lf",&w);
x=fun4(WH,SL);
y=fun4(LH,SL);
a=(void *)malloc(sizeof(double) * y);
if(a==NULL)
{
printf("内存分配不足!");
return;
}
for(i=0;i<y;i++)
{
a[i]=(double *)malloc(sizeof(double)* x);
if(a[i]==NULL)
{
printf("内存分配不足!");
return;
}
}
fun1(a,x,y);
fun2(a,alfa,w);
printf("迭代次数为:%d\n",&flag);
printf("计算结果如下:\n");
for(j=0;j<y;j++)
for(i=0;i<x;i++)
{
printf("%lf",a[j][i]);
}
} 展开
这里是方法原理:
http://wenku.baidu.com/view/3590b8d726fff705cc170abd.html
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define pi 3.1415926
double LV,RV,TV,DV,LH,WH;
double **a,w,SL,alfa=1.3;
int x,y,i,j;
static int flag=0;
//获得一行或一列的节点数
int fun4(double h,double sl)
{
int result=0;
while(h>0)
{
h=h-sl;
result++;
}
return result+1;
}
//检测是否达到制定精度
int fun3(double **a,double**b,double w)
{
if(fabs(**a-**b)<=w)
return 1;
else
return 0;
}
//进行逐次超松弛迭代
void fun2(double **u,double alfa,double w)
{
int i,j;
double **a={0},**b={0};
for(j=0;j<y;j++)
for(i=0;i<x;i++)
{
a[j][i]=u[j][i];
b[j][i]=u[j][i];
}
flag++;
for(j=1;j<y-1;j++)
for(i=1;i<x-1;i++)
{
b[j][i]=a[j][i]+(alfa*(a[j][i+1]+a[j+1][i]+b[j][i-1]+b[j-1][i]-4*a[j][i]))/4;
}
for(j=1;j<y-1;j++)
for(i=1;i<x-1;i++)
if(!fun3(a,b,w))
fun2(b,alfa,w);
else
u[j][i]=b[j][i];
}
//初始化(ui取0)
void fun1(double **u,int x,int y)
{
int i,j;
for(j=0;j<y;j++)
for(i=0;i<x;i++)
{
u[j][i]=0;
if(j==0)
u[j][i]=DV;
if(j==y-1)
u[j][i]=TV;
if(i==0)
u[j][i]=LV;
if(i==x-1)
u[j][i]=RV;
}
}
void main()
{
printf("学号:20104450320 班级:电力103班 姓名:陈敏林\n");
printf("请输入左端边界电压值:\n");
scanf("%lf",&LV);
printf("请输入右端边界电压值:\n");
scanf("%lf",&RV);
printf("请输入顶部边界电压值:\n");
scanf("%lf",&TV);
printf("请输入底部边界电压值:\n");
scanf("%lf",&DV);
printf("请输入矩形槽的宽度:\n");
scanf("%lf",&WH);
printf("请输入矩形槽的高度:\n");
scanf("%lf",&LH);
printf("请输入矩形的步距:\n");
scanf("%lf",&SL);
printf("请输入相邻两次迭代值的指定的最大允许误差:\n");
scanf("%lf",&w);
x=fun4(WH,SL);
y=fun4(LH,SL);
a=(void *)malloc(sizeof(double) * y);
if(a==NULL)
{
printf("内存分配不足!");
return;
}
for(i=0;i<y;i++)
{
a[i]=(double *)malloc(sizeof(double)* x);
if(a[i]==NULL)
{
printf("内存分配不足!");
return;
}
}
fun1(a,x,y);
fun2(a,alfa,w);
printf("迭代次数为:%d\n",&flag);
printf("计算结果如下:\n");
for(j=0;j<y;j++)
for(i=0;i<x;i++)
{
printf("%lf",a[j][i]);
}
} 展开
展开全部
这个程序真是害死人呀!你的程序fun2里面声明的a和b没有分配空间,直接拿来赋值,运行起来肯定有问题。另外,在fun2里重复迭代,如果申请空间的话,不好管理,不如在外围申请空间,用两个相同大小的二维数组,将里面的值倒来倒去。
下面的代码可以正常运行,而且满足你作业的要求。
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define pi 3.1415926
double LV, RV, TV, DV, LH, WH;
int x,y;
int flag = 0;
//获得一行或一列的节点数
int fun4(double h,double sl)
{
int result=0;
while(h>0)
{
h=h-sl;
result++;
}
return result+1;
}
//检测是否达到制定精度
int fun3(double **a,double **b,double w)
{
int i, j;
for(j=1; j<y-1; j++)
for(i=1; i<x-1; i++)
if(fabs(a[j][i]-b[j][i]) > w)
return 0;
return 1;
}
//进行逐次超松弛迭代
void fun2(double **in,double alfa,double w, double** out)
{
int i,j;
flag++;
for(j=1; j<y-1; j++)
for(i=1; i<x-1; i++)
out[j][i]=in[j][i]+(alfa*(in[j][i+1]+in[j+1][i]+out[j][i-1]+out[j-1][i]-4*in[j][i]))/4;
if(!fun3(in,out,w))
fun2(out,alfa,w,in);
return;
}
//初始化(ui取0)
void fun1(double **u,int x,int y)
{
int i,j;
for(j=0; j<y; j++)
for(i=0; i<x; i++)
{
u[j][i]=0;
if(j==0)
u[j][i]=DV;
if(j==y-1)
u[j][i]=TV;
if(i==0)
u[j][i]=LV;
if(i==x-1)
u[j][i]=RV;
}
}
int main()
{
double SL, w, alfa = 1.3;
double **a, **b;
int i,j,temp;
printf("学号:20104450320 班级:电力103班 姓名:陈敏林\n");
printf("请输入左端边界电压值:\n");
scanf("%lf",&LV);
printf("请输入右端边界电压值:\n");
scanf("%lf",&RV);
printf("请输入顶部边界电压值:\n");
scanf("%lf",&TV);
printf("请输入底部边界电压值:\n");
scanf("%lf",&DV);
printf("请输入矩形槽的宽度:\n");
scanf("%lf",&WH);
printf("请输入矩形槽的高度:\n");
scanf("%lf",&LH);
printf("请输入矩形的步距:\n");
scanf("%lf",&SL);
printf("请输入相邻两次迭代值的指定的最大允许误差:\n");
scanf("%lf",&w);
x=fun4(WH,SL);
y=fun4(LH,SL);
a=(double**)malloc(sizeof(double) * y);
b=(double**)malloc(sizeof(double) * y);
if(a==NULL || b==NULL)
{
printf("内存分配不足!");
return -1;
}
for(i=0; i<y; i++)
{
a[i]=(double*)malloc(sizeof(double) * x);
b[i]=(double*)malloc(sizeof(double) * x);
if(a[i]==NULL || b[i]==NULL)
{
printf("内存分配不足!");
return -1;
}
}
fun1(a, x, y);
fun1(b, x, y);
fun2(a, alfa, w, b);
printf("迭代次数为:%d\n", flag);
//最终结果,迭代偶数次,写在a里;奇数次写到b里了
temp = flag % 2;
printf("计算结果如下:\n");
for(j=0; j<y; j++)
{
for(i=0; i<x; i++)
{
if(temp)
printf("%lf ",b[j][i]);
else
printf("%lf ",a[j][i]);
}
printf("\n");
if (b[j])
free(b[j]);
if (a[j])
free(a[j]);
}
if (b)
free(b);
if (a)
free(a);
return 0;
}
下面的代码可以正常运行,而且满足你作业的要求。
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define pi 3.1415926
double LV, RV, TV, DV, LH, WH;
int x,y;
int flag = 0;
//获得一行或一列的节点数
int fun4(double h,double sl)
{
int result=0;
while(h>0)
{
h=h-sl;
result++;
}
return result+1;
}
//检测是否达到制定精度
int fun3(double **a,double **b,double w)
{
int i, j;
for(j=1; j<y-1; j++)
for(i=1; i<x-1; i++)
if(fabs(a[j][i]-b[j][i]) > w)
return 0;
return 1;
}
//进行逐次超松弛迭代
void fun2(double **in,double alfa,double w, double** out)
{
int i,j;
flag++;
for(j=1; j<y-1; j++)
for(i=1; i<x-1; i++)
out[j][i]=in[j][i]+(alfa*(in[j][i+1]+in[j+1][i]+out[j][i-1]+out[j-1][i]-4*in[j][i]))/4;
if(!fun3(in,out,w))
fun2(out,alfa,w,in);
return;
}
//初始化(ui取0)
void fun1(double **u,int x,int y)
{
int i,j;
for(j=0; j<y; j++)
for(i=0; i<x; i++)
{
u[j][i]=0;
if(j==0)
u[j][i]=DV;
if(j==y-1)
u[j][i]=TV;
if(i==0)
u[j][i]=LV;
if(i==x-1)
u[j][i]=RV;
}
}
int main()
{
double SL, w, alfa = 1.3;
double **a, **b;
int i,j,temp;
printf("学号:20104450320 班级:电力103班 姓名:陈敏林\n");
printf("请输入左端边界电压值:\n");
scanf("%lf",&LV);
printf("请输入右端边界电压值:\n");
scanf("%lf",&RV);
printf("请输入顶部边界电压值:\n");
scanf("%lf",&TV);
printf("请输入底部边界电压值:\n");
scanf("%lf",&DV);
printf("请输入矩形槽的宽度:\n");
scanf("%lf",&WH);
printf("请输入矩形槽的高度:\n");
scanf("%lf",&LH);
printf("请输入矩形的步距:\n");
scanf("%lf",&SL);
printf("请输入相邻两次迭代值的指定的最大允许误差:\n");
scanf("%lf",&w);
x=fun4(WH,SL);
y=fun4(LH,SL);
a=(double**)malloc(sizeof(double) * y);
b=(double**)malloc(sizeof(double) * y);
if(a==NULL || b==NULL)
{
printf("内存分配不足!");
return -1;
}
for(i=0; i<y; i++)
{
a[i]=(double*)malloc(sizeof(double) * x);
b[i]=(double*)malloc(sizeof(double) * x);
if(a[i]==NULL || b[i]==NULL)
{
printf("内存分配不足!");
return -1;
}
}
fun1(a, x, y);
fun1(b, x, y);
fun2(a, alfa, w, b);
printf("迭代次数为:%d\n", flag);
//最终结果,迭代偶数次,写在a里;奇数次写到b里了
temp = flag % 2;
printf("计算结果如下:\n");
for(j=0; j<y; j++)
{
for(i=0; i<x; i++)
{
if(temp)
printf("%lf ",b[j][i]);
else
printf("%lf ",a[j][i]);
}
printf("\n");
if (b[j])
free(b[j]);
if (a[j])
free(a[j]);
}
if (b)
free(b);
if (a)
free(a);
return 0;
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询