有限差分法实验报告(参考)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
工程电磁场
实验报告
——有限差分法
用超松弛迭代法求解 接地金属槽内电位的分布
一、实验要求
按对称场差分格式求解电位的分布 已知:
给定边值:如图1-7示 图1-7接地金属槽内半场域的网格
=ϕ= V
100 ϕ 0
=ϕ0
=ϕ
给定初值)()(.1j 40
100
1j p
1
2j i -=
--=
ϕϕϕ 误范围差: 510-=ε
计算:迭代次数N ,j i ,ϕ,将计算结果保存到文件中
二、实验思想
有限差分法
有限差分法(Finite Differential Method )是基于差分原理的一种数值计算法。
其基本思想:将场域离散为许多小网格,应用差分原理,将求解连续函数ϕ的泊松方程的问题转换为求解网格节点上ϕ的差分方程组的问题。
泊松方程的五点差分格式
)(4
1
4243210204321Fh Fh -+++=⇒=-+++ϕϕϕϕϕϕϕϕϕϕ
当场域中,0=ρ得到拉普拉斯方程的五点差分格式
)(4
1
044321004321ϕϕϕϕϕϕϕϕϕϕ+++=⇒=-+++
差分方程组的求解方法(1) 高斯——赛德尔迭代法
][)(,)(,)(,)(,)(,2
k 1j i k j 1i 1k 1j i 1k j 1i 1k j i Fh 4
1
-+++=+++-+-+ϕϕϕϕϕ (1-14)
式中:⋅⋅⋅⋅⋅⋅=⋅⋅⋅⋅⋅⋅=,2,1,0,2,1,k j i ,
迭代顺序可按先行后列,或先列后行进行。
迭代过程遇到边界节点时,代入边界值或边界差分 格式,直到所有节点电位满足εϕϕ<-+)(,)(,k j i l k j i 为止。
图1-4 高斯——赛德尔迭代法
(2)超松弛迭代法
][)
(,)(,)(,)(,)(,)(,)(,k j i 2k 1j i k j 1i 1k 1j i 1k j 1i k j i 1k j i 4Fh 4
ϕϕϕϕϕαϕϕ--++++=+++-+-+ (1-15)
式中:α——加速收敛因子)21(<<α 可见:迭代收敛的速度与α有明显关系
三、程序源代码
#include<iostream.h> #include<math.h> #include<iomanip.h> double A[5][5]; void main(void) { double BJ[5][5];//数组B 用于比较电势 int s[100];//用于储存迭代次数
double d[100];//用于记录所有的加速因子 d[0]=1.0;
int i,j,N=0,M=0,x; for(i=0;i<100;i++)
d[i]=0.01*i+d[0];//加速因子从1.0到2.0之间的20个数!
double w[100][10];
int P,Q;
for(P=0;P<4;P++)
for(Q=0;Q<5;Q++)
A[P][Q]=0;
for(P=0;P<5;P++)
A[4][P]=100;
cout<<"数组A的所有元素是:"<<endl; for(i=0;i<5;i++)
for(j=0;j<5;j++)
{
cout<<A[i][j]<<setw(6);
if((5*i+j+1)%5==0)
cout<<'\n';
}
int pp=0;
for(x=0;x<100;x++)
{
do
{
for(i=0;i<5;i++)
for(j=0;j<5;j++)
BJ[i][j]=A[i][j];
for(i=1;i<4;i++)
for(j=1;j<4;j++)
A[i][j]=BJ[i][j]+(d[x]/4)*(BJ[i+1][j]+BJ[i][j+1]+A[i-1][j]+A[i][j-1]-4*BJ[i][ j]);//迭代公式
for(i=1;i<4;i++)
{
for(j=1;j<4;j++)
if(fabs(A[i][j]-BJ[i][j])<1e-5)
pp++;
}
N++;
}while(pp<=9);
pp=0;
for(i=0;i<3;i++)
w[M][i+1]=A[1][i+1];
for(i=3;i<6;i++)
w[M][i+1]=A[2][i-2];
for(i=6;i<9;i++)
w[M][i+1]=A[3][i-5];
s[M]=N;
M++;
N=0;
int P,Q;
for(P=0;P<4;P++)
for(Q=0;Q<5;Q++)
A[P][Q]=0;
for(P=0;P<5;P++)
A[4][P]=100;
}
int min=s[0];
int p,q;
cout<<"输出所有的加速因子的迭代次数:"<<'\n';
for(q=1;q<100;q++)
{
// cout<<s[q]<<setw(6);
// if(q%12==0)
// cout<<'\n';
if(min>s[q])
{
min=s[q];
p=q;
}
}
cout<<endl;
if(min==s[0])
p=0;
cout<<"最佳加速因子a=";
cout<<d[p]<<'\n';
cout<<"迭代次数为:"<<min<<'\n';
cout<<"最佳收敛因子对应的各个格内点的电位为:"<<'\n';
for( i=1;i<10;i++)
{
cout<<w[p][i]<<'\t';
if(i%3==0)
cout<<'\n';
}
cout<<'\n';
}
四、程序框图
迭代解程序框图五、结果分析
迭代收敛的速度与α的关系
收敛因子(α)
1.0 1.7 1.8 1.83 1.85 1.87 1.90
2.0 迭代次数(N )
>1000
269
174
143
122
133
171
发散
最佳收敛因子的经验公式:
)
sin(p
120π
α+=
(正方形场域、正方形网格)
2
20q 1
p 12
2+
-=πα(矩形场域、正方形网格) 程序执行结果如下。