实验一用超松弛迭代法求解接地金属槽内电位分布.docx
《实验一用超松弛迭代法求解接地金属槽内电位分布.docx》由会员分享,可在线阅读,更多相关《实验一用超松弛迭代法求解接地金属槽内电位分布.docx(11页珍藏版)》请在冰点文库上搜索。
实验一用超松弛迭代法求解接地金属槽内电位分布
用超松弛迭代法求解接地金属槽内电位分布
一、实验内容:
用超松弛迭代法求解接地金属槽内电位的分布。
已知:
,
给定边值如图所示。
给定初值:
误差范围:
计算迭代次数,
分布。
二.实验设计原理:
有限差分法
α称为松弛因子。
不同的α值,可以有不同的收敛速度,其值范围一般为1与2之间。
通常α会有一个最佳值。
最佳α的确定与具体问题有关,显然,如果α选择合适,超松弛迭代法收敛速度最快。
(1)划分网格:
节点编号、坐标的形成。
(2)赋初值:
随意,尽可能靠近真实解。
比如本题u7=2.0,u8=7.5,u9=10。
(3)边界条件:
给电位值,找规律。
u1,u2,u3,u4,u6,u11,u12,u13,u14=0;u5,u10,u15=100。
(4)迭代u7=(u2+u6+u8+u12)/4;
u8=(u3+u7+u9+u13)/4;
u9=(u4+u8+u10+u14)/4。
(5)反复迭代,给定某一误差
有限差分法是基于差分原理的一种数值计算法。
其基本思想:
将场域离散为许多小网格,应用差分原理,将求解连续函数ϕ的泊松方程的问题换为求解网格节点上ϕ的差分方程组的问题。
编程时已经考虑到题目要求,所以直接将边值编入到程序中,这样可以省略输入,从而直接输入迭代因子进行求解,可以减少编程的难度。
这次编程和以前不同的是将数组和正交函数图像结合起来,所以在考虑输入和输出的时候会有一些难度,因为数组是上面是小的而图像上面越在上,代表坐标就越大。
所以在输入和输出的时候要谨慎对待。
Editor中源代码为:
1.clc
2.clear
3.closeall
4.hx=5;
5.hy=5;
6.v1=ones(hy,hx);
7.v1(hy,:
)=ones(1,hx)*100;
8.v1(1,:
)=ones(1,hx)*0
9.fori=1:
hy;
10.v1(i,1)=0;
11.v1(i,hx)=0;
12.end
13.m=4;
14.w=2/(1+sqrt(1-cos(pi/m)*cos(pi/m)));
15.maxt=1;t=0;
16.v2=v1;n=0
17.while(maxt>1e-5)
18.n=n+1
19.maxt=0;
20.fori=2:
hy-1;
21.forj=2:
hx-1;
22.v2(i,j)=v1(i,j)+(v1(i,j+1)+v1(i+1,j)+v2(i-1,j)+v2(i,j-1)-4*v1(i,j))*w/4;
23.t=abs(v2(i,j)-v1(i,j));
24.if(t>maxt)maxt=t;end
25.end
26.end
27.v1=v2;
28.end
29.subplot(1,2,1),mesh(v2)
30.axis([0,5,0,5,0,100]);
31.subplot(1,2,2),contour(v2,20);
三、程序运行界面及结果
电压分布:
改变收敛因子,α取接近1的数,α计算次数越少,迭代效果越好;α越接近2,计算次数越多,迭代效果越差。
收敛因子不同,得出的电位不会有很大的差距,只是对迭代的次数会有影响。
四.实验心得与思考
通过设计程序并进行完善调试,我对有限差分法有了进一步的认识,同时也已经掌握超松弛迭代法的运用。
对于这一类题型都可以运用同样方法予以解决。
就我个人而言,我觉得自己对matlab的使用还不是很了解,尽管算法能够理解,但真正到了运用的时候仍然在纠结下一句要怎么写。
接触这个软件不到半个月,提升空间还有很多。
比如在设计迭代时,该怎样命名参数,怎么重复运算。
这个题里还涉及了有关x,y的坐标问题,如果再进一步学习,我想会写的再清晰一些。
尽管我不清楚最终的结果是否正确,我认为我已经将我所理解的问题表达出来了。
我想我会继续思考这个问题,继续完善的。
附:
c++代码(用于验证结论)
#include
#include
voidmain()
{
doublem[5][5],n[5][5];
intN=0,b=1;
inti,j;
doublee=0.00001;
doublea=2/(1+sin(3.1415926/4;
for(i=0;i<=4;i++)
for(j=0;j<+4;j++)
{
m[i][j]=0;[i][j]=0;
}
m[1][4]=100;
m[2][4]=100’
m[3][4]=100;
n[1][4]=m[1][4];
n[2][4]=m[1][4];
n[3][4]=m[1][4];
for(j=4;j>=0;j--)
{
for(i=0;i<=4;i++)
cout<<”m[“<
cout<}
while(b==1)
{
b=0;
N=N+1;
for(i=1;i<=3;i++)
for(j=1;j<=3;j++)
m[i][j]=m[i][j]+a*(m[i-1][j]+m[i][j-1]+m[i+1][j]+m[i][j+1]-4*m[i][j])/4;
for(i=1;i<=3;i++)
for(j=1;j<=3;j++)
{
if(fabs(m[i][j]-n[i][j]>=e)
b=1;
n[i][j]=m[i][j];
}
}
for(j=4;j>=0;j--)
{
for(i=0;i<=4;i++)
cout<<”m[<
cout<}
cout<<”N=”<