有限差分法实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

工程电磁场

实验报告

——有限差分法

用超松弛迭代法求解 接地金属槽内电位的分布

一、实验要求

按对称场差分格式求解电位的分布

已知:

给定边值:如图1-7示 图1-7接地金属槽内半场域的网格 给定初值)()(.1j 40

100

1j p

1

2j i -=

--=

ϕϕϕ 误范围差: 510-=ε

计算:迭代次数N ,j i ,ϕ,将计算结果保存到文件中

二、实验思想

有限差分法

有限差分法(Finite Differential Method )是基于差分原理的一种数值计算法。其基本思想:将场域离散为许多小网格,应用差分原理,将求解连续函数ϕ的泊松方程的问题转换为求解网格节点上ϕ

=ϕ= V

100 ϕ 0

=ϕ0

的差分方程组的问题。

泊松方程的五点差分格式

)(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 为止。 (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 #include #include double A[5][5]; void main(void) {

double BJ[5][5];//数组B 用于比较电势 int s[100];//用于储存迭代次数

图1-4 高斯——赛德尔迭代法

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的所有元素是:"<

for(i=0;i<5;i++)

for(j=0;j<5;j++)

{

cout<

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<

// if(q%12==0)

// cout<<'\n';

if(min>s[q])

{

min=s[q];

p=q;

}

}

cout<

if(min==s[0])

p=0;

cout<<"最佳加速因子a=";

cout<

cout<<"迭代次数为:"<

cout<<"最佳收敛因子对应的各个格内点的电位为:"<<'\n';

for( i=1;i<10;i++)

{

cout<

if(i%3==0)

cout<<'\n';

}

cout<<'\n';

}

相关文档
最新文档