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

合集下载

有限差分法实验报告(参考)

有限差分法实验报告(参考)

工程电磁场实验报告——有限差分法用超松弛迭代法求解 接地金属槽内电位的分布一、实验要求按对称场差分格式求解电位的分布 已知:给定边值:如图1-7示 图1-7接地金属槽内半场域的网格 给定初值)()(.1j 401001j p12j i -=--=ϕϕϕ 误范围差: 510-=ε计算:迭代次数N ,j i ,ϕ,将计算结果保存到文件中二、实验思想有限差分法有限差分法(Finite Differential Method )是基于差分原理的一种数值计算法。

其基本思想:将场域离散为许多小网格,应用差分原理,将求解连续函数ϕ的泊松方程的问题转换为求解网格节点上ϕ=ϕ V100 0=ϕ0=ϕ的差分方程组的问题。

泊松方程的五点差分格式)(414243210204321Fh Fh -+++=⇒=-+++ϕϕϕϕϕϕϕϕϕϕ当场域中,0=ρ得到拉普拉斯方程的五点差分格式)(41044321004321ϕϕϕϕϕϕϕϕϕϕ+++=⇒=-+++差分方程组的求解方法(1) 高斯——赛德尔迭代法][)(,)(,)(,)(,)(,2k 1j i k j 1i 1k 1j i 1k j 1i 1k j i Fh 41-+++=+++-+-+ϕϕϕϕϕ (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)图1-4 高斯——赛德尔迭代法{double BJ[5][5];//数组B用于比较电势int s[100];//用于储存迭代次数double d[100];//用于记录所有的加速因子d[0]=;int i,j,N=0,M=0,x;for(i=0;i<100;i++)d[i]=*i+d[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++){{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++;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';}四、程序框图迭代解程序框图五、结果分析迭代收敛的速度与α的关系最佳收敛因子的经验公式:)sin(p120πα+=(正方形场域、正方形网格)220q 1p 122+-=πα(矩形场域、正方形网格) 程序执行结果如下。

电磁场与电磁波实验报告

电磁场与电磁波实验报告

电磁场与电磁波实验报告09024126 张亦驰一.实验目的使用简单迭代法与超松弛迭代法求解电磁场金属槽边值问题二.实验步骤1.简单迭代法:源程序:#include<xxgc.h>main(){int i;double a[50][3][3];a[0][0][0]=a[0][1][0]=a[0][2][0]=25;a[0][0][1]=a[0][1][1]=a[0][2][1]=50;a[0][0][2]=a[0][1][2]=a[0][2][2]=75;for(i=0;i<50;i++){printf("a[%d][0][0]=%.3f,a[%d][1][0]=%.3f,a[%d][2][0]=%.3f\n",i,a[i][0][0],i,a[i][1][0],i,a[i ][2][0]);printf("a[%d][0][1]=%.3f,a[%d][1][1]=%.3f,a[%d][2][1]=%.3f\n",i,a[i][0][1],i,a[i][1][1],i,a[i ][2][1]);printf("a[%d][0][2]=%.3f,a[%d][1][2]=%.3f,a[%d][2][2]=%.3f\n\n",i,a[i][0][2],i,a[i][1][2],i,a[i][2][2]);getch();a[i+1][0][0]=0.25*(0+0+a[i][1][0]+a[i][0][1]);a[i+1][0][1]=0.25*(0+a[i][0][0]+a[i][1][1]+a[i][0][2]);a[i+1][0][2]=0.25*(0+a[i][0][1]+a[i][1][2]+100);a[i+1][1][0]=0.25*(a[i][0][0]+0+a[i][2][0]+a[i][1][1]);a[i+1][1][1]=0.25*(a[i][0][1]+a[i][1][0]+a[i][2][1]+a[i][1][2]);a[i+1][1][2]=0.25*(a[i][0][2]+a[i][1][1]+a[i][2][2]+100);a[i+1][2][0]=0.25*(a[i][1][0]+0+0+a[i][2][1]);a[i+1][2][1]=0.25*(a[i][1][1]+a[i][2][0]+0+a[i][2][2]);a[i+1][2][2]=0.25*(a[i][1][2]+a[i][2][1]+0+100);}getch();}实验结果如图2.超松弛迭代法源程序:#include<stdio.h>#include<math.h> #include<iostream> using namespace std;#define pi 3.1415926void Boundary_conditions_initialize(float Boundary_areas[5][5]) {for(int j=0;j<5;j++){ Boundary_areas[0][j]=0;Boundary_areas[4][j]=100; }for(int i=0;i<5;i++){Boundary_areas[i][0]=0;Boundary_areas[i][4]=0;j =100 Vj =0j =0}}void nodes_Field_region_Initialization(float Field_region[5][5]) {for(int i=1;i<4;i++){ for(int j=1;j<4;j++){Field_region[i][j]=0; }}}void Output_nodes_value (float all_nodes[5][5],int count){if(count==0){cout<<"场内各点的初始值为:"<<'\n' ;}else{cout<<"迭代次数N="<< count<<'\n'<<"迭代最终结果为:" <<'\n'; }for(int i=4;i>=0;i--){ for(int j=0;j<5;j++){cout<<all_nodes[i][j]<<'\t'<<'\t';}cout<<'\n';}}void main(void){int a=4 ;int h=a/4;float areas[5][5] ;int N=0 ;const float e=0.00001;float Maxerror ;float a0=2/(1+sin(pi/4));Boundary_conditions_initialize(areas);nodes_Field_region_Initialization(areas);Output_nodes_value (areas,N) ;cout<<"加速因子a="<<a0<<'\n';do{ N=N+1 ;for(int i=1;i<4;i++){ for(int j=1;j<4;j++){ float areasK=areas[i][j];areas[i][j]=areas[i][j]+(a0/4)*(areas[i-1][j]+areas[i][j-1]+areas[i+1 ][j]+areas[i][j+1]-4*areas[i][j]);float error=fabs(areas[i][j]-areasK);if(i==1&&j==1){Maxerror=error; }else{if (Maxerror<error) Maxerror=error ;}}}} while(Maxerror>e) ;Output_nodes_value(areas,N);}。

Matlab-求解金属槽槽内电位分布---副本培训讲学

Matlab-求解金属槽槽内电位分布---副本培训讲学

M a t l a b-求解金属槽槽内电位分布---副本Matlab 求解金属槽槽内电位分布摘要运用有限差分法将场域离散为许多小网格,将求解连续函数ϕ的泊松方程的问题换为求解网格节点上ϕ的差分方程组的问题。

用matlab程序计算出槽内电位分布的结果。

通过数值解和精确解的比较来验证有限差分法的可行性。

关键词:有限差分法; Matlab;金属槽槽内电位Solving the metal slots potential with MatlabAbstract:U sing the finite difference method (FDM)field is discreted into many small grid, transform ing the problem solving poisson equation with continuous function ϕ for solving the differential equations of grid node ϕ. We use Matlab program to calculate the potential distribution in slot results. The values got from these two methods are compared, which would be a validation of the feasibility of the Finite Difference Method.1 引言如图1所示,尺寸为a×a的正方形金属导体槽三面接地,上方是一块密实的但与之绝缘的金属盖板,其电位100Vϕ=,求槽内电位的分布情况。

这是二维静态场域的边值问题,在直角坐标系中,接地导体矩形槽中的电位函数p满足拉普拉斯方程2222x yϕϕ∂∂+=∂∂。

Xaa图1 正方形金属槽其边界条件满足第一类边界条件问题0(x,y)0x ϕ== (x,y)0x aϕ==(x,y)0y ϕ== (x,y)100y aϕ==我们由此可求出矩形导体槽内电位的分布数值解.将金属槽内场域D 用正方形网格进行粗略划分,其网格节点分布如图2所示网格间距为h=a/4,各边的节点数为L+1=5.234512345图2 网格划分2 求解2.1数值解求解过程由于本文采用的是超松弛迭代法的差分方程形式,现给出公式(n 1)(n)(n)(n)(n 1)(n 1)2(n),,1,,11,,1,,(4)4i ji ji ji j i ji j i j i jw h f ϕϕϕϕϕϕϕ+++++--=++++--(2.1)进行迭代,因为满足拉普拉斯方程故 f=0。

工程电磁场C++编程作业-一、用超松弛迭代法求解接地金属槽内电位的分布二、按对称场差分格式求解电位的分布

工程电磁场C++编程作业-一、用超松弛迭代法求解接地金属槽内电位的分布二、按对称场差分格式求解电位的分布

工程电磁场实验报告——C++编程课题一、用超松弛迭代法求解接地金属槽内电位的分布二、按对称场差分格式求解电位的分布一、用超松弛迭代法求解接地金属槽内电位的分布一、实验原理二、程序框图:三、实验内容:1、用超松弛迭代法求解接地金属槽内点位分布1)内容及要求:2)实验思路:由超松弛迭代法,将网格分成5*5列,边界点正好都是网格的节点,对所有的节点进行编号,并记录节点的坐标位置,并用一个二维数组进行表示u1[5][5],此数组表示的是迭代后的值。

考虑到迭代前后的数值不一样,再用一个二维数组表示迭代之前的数值u2[5][5]。

运用C++的知识在计算机上将边界值和内节点进行赋值,即将节点离散化。

然后开始迭代。

迭代开始之前将另一个数组b赋值,用数组a给其赋值,表示迭代之前的值,好用于后面精度的比较。

开始进行迭代时,根据超松弛公式将迭代方程编写输入。

每次迭代结束后将数组a和数组b对应的值进行比较,即是精度的计算。

如果误差大于所规定的误差0.00001,将a的值赋给b,然后继续进行迭代。

直到当迭代前后数值误差小于所规定的误差时停止迭代。

并比较迭代因子的大小对收敛次数的影响,选取最烧收敛次数的迭代因子作为实验最后的输出结果。

最后输出最适合迭代因子、迭代的次数和迭代后各点的电位值。

3)程序如下://********用超松弛迭代法求解接地金属槽内电位的分布********#include<iostream.h>#include<math.h>#include<iomanip.h>Void main(){double u1[5][5],u2[5][5];int flag=1000,i,j,e,n;double a,d;//a最佳加速收敛因子for(i=0;i<5;i++)for(j=0;j<5;j++){if(i==0)u1[i][j]=100;else u1[i][j]=0;}cout<<"迭代前各电位点上的初始值:"<<endl;for(i=0;i<5;i++){for(j=0;j<5;j++){cout<<u1[i][j]<<" ";//输出迭代初值}cout<<endl;}cout<<"\n";for(d=1;d<2;d+=0.01)//找取迭代次数最少的加速收敛因子{n=0;for(j=0;j<5;j++){u1[0][j]=100;}for(i=1;i<5;i++)for(j=0;j<5;j++){u1[i][j]=0;}do//迭代x次{for(i=0;i<5;i++){for(j=0;j<5;j++){u2[i][j]=u1[i][j];}}for(i=1;i<4;i++)for(j=1;j<4;j++){u1[i][j]=u2[i][j]+(d/4)*(u2[i+1][j]+u2[i][j+1]+u1[i-1][j]+u1[i][j-1]-4*u2[i][j]);}for(i=1;i<4;i++)//判断精度{{for(j=1;j<4;j++){if(fabs(u1[i][j]-u2[i][j])>1e-5){e=1; break; }else e=0; }if(e==1) break; }}n++;//迭代次数}while(e);if(n<flag) {flag=n; a=d; }}cout<<"收敛因子:"<<a<<endl;cout<<endl;cout<<"迭代次数:"<<flag<<endl;cout<<endl;cout<<"各节点上最终电位近似值:"<<endl;for(i=0;i<5;i++){for(j=0;j<5;j++){cout<<setiosflags(ios::fixed)<<setprecision(5)<<setw(8)<<u1[i][j]<<" ";//对齐输出}cout<<endl; }cout<<endl; }4)输出结果:5)总结:最佳收敛因子:1.18此时的最少迭代次数:102、按对称场差分格式求解电位的分布1)内容及要求:2)实验思路:类似与第一题的思路,但只计算一半的区域,对另一半进行对称性计算,减小计算量。

电磁场仿真实验-用超松弛法求二维静电场域的电位分布

电磁场仿真实验-用超松弛法求二维静电场域的电位分布

姓名:梁鸿宇学号:19 班级:10通信实验目的:通过用MATLAB等软件编程计算电磁场问题,掌握有限差分法的基本思想,掌握电磁场数值计算的基本思想和方法,掌握MATLAB等软件编程技巧,学会用MATLAB等软件应用于有限差分法的数值解。

实验内容:用MATLAB等软件编程计算电磁场问题,给出有关波形和图表。

分析数值解和解析解的优缺点。

题目如下:实验程序与结果分析:程序(MATLAB)%电位函数为φ(x,y) ,边界条件φ(x,y)=0(x=0);φ(x,y)=50(y=0);% φ(x,y)=100(x=a);φ(x,y)=100(y=a);hx=11;hy=11; %设置网格节点数v1=ones(hy,hx); %设置行列二维数组m=10;n=10; %横纵向网格数%上下两行的Dirichlet条件边界值:v1(1,:)=ones(1,hx)*50;v1(hy,:)=ones(1,hx)*100;%左右两列的Dirichlet条件边界值:for i=1:hyv1(i,1)=0;v1(i,hx)=100;end%计算松弛因子t1=(cos(pi/m)+cos(pi/n))/2;w=2/(1+sqrt(1-t1^2));v2=v1;maxt=1;t=0; %初始化k=0while(maxt>1e-6) %由V1迭代V2.迭代精度为k=k+1 %计算迭代次数maxt=0;for i=2:hy-1 %从2到hy-1行循环for j=2:hx-1 %从2到hx-1列循环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;% 拉普拉斯方程差分式t=abs(v2(i,j)-v1(i,j));if(t>maxt) maxt=t;endendendv1=v2endcontour(v2,20) %画等电位线图hold onx=1:1:hx;y=1:1:hy[xx,yy]=meshgrid(x,y); %形成栅格[Ex,Ey]=gradient(v2,,; %计算梯度AE=sqrt(Ex.^2+Ey.^2);Ex=Ex./AE;Ey=Ey./AE; % 场强归一化,使箭头等长quiver(xx,yy,Ex,Ey, %根据梯度数据画箭头axis([,hx+,-2,13]) %设置坐标边框plot([1,1,hx,hx,1],[1,hy,hy,1,1],'k') %画导体边框text(hx/,hy+,'100V','fontsize',11); %上标注text(hx/2,,'50V','fontsize',11); %下标注text,hy/2,'0V','fontsize',11); %左标注text(hx+,hy/2,'100V','fontsize',11); %右标注hold offhx=11;hy=11;输出图形(MATLAB)总结和体会:这次仿真实验,是自己学习NATLAB的基本操作的,在了解这个全英版的软件之前,觉得很茫然。

电磁场数值计算上机题报告

电磁场数值计算上机题报告

电磁场数值计算上机题报告第一题计算长直接地金属槽中的电场分布。

金属槽横截面如图1所示,其侧壁与底面电位均为零,顶盖电位相对值为10。

槽内电位函数满足拉普拉斯方程。

计算槽内电位分布。

要求:(1)先用正方形网格粗分,每边取4个网格计算,取不同的松弛因子,比较其收敛速度。

取计算精度为千分之一。

(2)划分网格加倍,计算电位分布,并与上面计算结果比较。

(一)建立问题的数学物理模型首先列出方程及其边界条件 槽内的电位满足二维的拉普拉斯方程:222220x y ϕϕϕ∂∂∇=+=∂∂其中,x y 的范围是:0,0x a y a <<<<边界条件是:0000;10x x ay y aϕϕϕϕ========图1 (二)算法设计及其实现在本题中,因为区域为正方形区域,网格采用正方形网格,每边四个网格,因此,每边要有5个结点, 网格数m=n=4,比较少,不能用课本中的公式计算收敛因子,取收敛因子为 1.4α=,计算的程序的流程为:①选取计算的场域,并划分网格,网格划分如右图2所示:右图表示网格的划分,共16个网格,一共划分了25个结点,每个节点用相应的下标(i,j )来表示,对应的电位为(,)u i j 。

根据题意,边界条件的 处理如下: 图 2(1,)(,1)(,1)0(,)10(21)u j u i u n u k j k n ===⎧⎨=≤≤-⎩其中n 为一行对应的节点数,根据题意,这里n=5② 用(,)u i j 表示节点的电位,设经过第n 次迭代之后的结点电位用(),n i j u 来表示,则超松弛迭代法的差分格式(记,(,)i j u u i j =)为:(1)()()()(1)(1)(),,1,,11,,1,(4)4n n n n n n n i j i j i j i j i j i j i j u u u u u u u α+++++--=++++- 边界条件前面已经给出 ③给各个节点赋初值,对于非边界上的点(对于边界点的值前面已经赋过初值),如下10(,)(1)1u i j j n =--④迭代计算,直到已经满足精度条件为止,这里精度为0.0001,最后输出计算的结果,输出结果见生成的数据文件shuju.txt 中 ⑤计算框图如图3所示图 3 计算框图⑥用fortran90语言编写计算机程序,计算各点的电位,程序清单如下:(三)计算结果及数据分析当网格数目为4(节点数目为5),加速收敛因子为1.4,计算精度为0.0001时,计算出各结点电位如下所示(对不同的收敛因子的比较后面进行)不可能完全对称,只能是近似对称的),这点不难从理论上进行分析得到。

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

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

实验一用超松弛迭代法求解接地金属槽内电位分布一、实验内容:试用超松弛迭代法求解接地金属槽内电位的分布。

已知:,mm?410h?a/4a?cm给定边值如图所示。

给定初值:)0(?0?ji,误差范围:5??10?计算迭代次数,分布。

?ji,一.实验思路由边界条件用泊松方程的五点差分格式求得中央点的点位。

再以所得点及边界再次利用泊松方程的五点差分格式求出另四个点,依照此方法求出其余点的电位分布。

用最佳收敛因子的经验公式计算收敛因子。

利用超松弛迭代法进行差分方程的求解,当遇到边界是采用边界值或者边界差分格式。

直到所有节点电位满足误差条件。

二.实验设计原理:有限差分法有限差分法(Finite Differential Method)是基于差分原理的一种数值计算法。

其基本思想:将场域离散为许多小网格,应用差分原理,将求解连续函数?的泊松方程的问题换为求解网格节点上?的差分方程组的问题。

编程时将边值编入到程序中,这样可以省略输入,从而直接输入迭代因子进行求解,可以减少编程的难度。

迭代时所用公式是和书上一样,为a[i][j]=b[i][j]+w/4*(b[i+1][j]+b[i][j+1]+a[i][j-1]+ a[i-1][j]-4*b[i][j]);。

k代表b,而k+1代表a其中启动输出开始菜单(边值都已经给定)输入迭代因w迭代次n=0n++开始循环迭函数判断相邻二次差值是否小于给定输n电a[i][j]终止.三、程序运行界面及结果四.源程序代码#include<iostream>#include<math.h>#include<iomanip>using namespace std;classoverrei //over-relaxation iterative method{private:intm,n;doublex,e;double **p,**q;public:int k;overrei(int m0,int n0,double e0){inti;e=e0;k=0;m=m0;n=n0;p=new double *[m];for(i=0;i<m;i++)p[i]=new double[n];q=new double *[m];//迭代因子求解for(i=0;i<m;i++)q[i]=new double[n];if(m==n)/(m-1))); x=2/(1+sin(3.141592654 elsex=2-3.141592654*sqrt(2)*sqrt(1/((m-1)*(m-1))+1/((n-1)*(n-1))); :<<x<<endl;潣瑵?最佳收敛因子}void Initialization(); //赋边界条件void Cal(); //计算void Diedai(); //迭代函数void Show(); //输出部分};void overrei::Initialization() //赋边界条件{inti,j;for(i=0;i<m;i++) //边界条件for(j=0;j<n;j++){if(i==0){p[i][j]=100;q[i][j]=100;}else{p[i][j]=0;q[i][j]=0;}}潣瑵?初始点位:<<endl;Show();}void overrei::Cal() //计算{inti,j;int c=1;while(1){c=1;for(i=0;i<m;i++){for(j=0;j<n;j++){if((p[i][j]-q[i][j])>e||(q[i][j]-p[i][j])>e) //相邻两次迭代误差是否小于1e-5 {c=0;break;}}if(c==0) break;}if(c==1 && k!=0) break;Diedai();}}void overrei::Diedai() //迭代函数{inti,j;double y=x/4;if(k%2){for(i=1;i<m-1;i++)for(j=1;j<n-1;j++){q[i][j]=p[i][j]+y*(q[i-1][j]+q[i][j-1]+p[i+1][j]+p[i][j+1]-4*p[i][j]);}}else{for(i=1;i<m-1;i++)for(j=1;j<n-1;j++){p[i][j]=q[i][j]+y*(p[i-1][j]+p[i][j-1]+q[i+1][j]+q[i][j+1]-4*q[i][j]);}}k++;}void overrei::Show() //输出部分{inti,j;for(i=0;i<m;i++){for(j=0;j<n;j++){cout<<setw(12)<<setprecision(6)<<fixed<<q[i][j]<<ends;}cout<<endl;}}int main(){cout<< **************************************<<endl; cout<< 超松弛迭代法求解接地金属槽内电位的分布<<endl; cout<< **************************************<<endl; overrei A(5,5,1e-5);A.Initialization();A.Cal();潣瑵?电位分布:<<endl;A.Show();潣瑵?迭代次数:<<A.k<<endl;return 0;}实验二按对称场差分格式求解电位的分布一.实验思路只计算一半的区域,对另一半进行对称性计算,减小计算量。

利用超松弛迭代法求解问题

利用超松弛迭代法求解问题

利用超松弛迭代法求解问题在电场中,利用有限差分法求解场域中各个节点的点位。

其中求解差分方程组的解运用到了超松弛方法。

超松弛方法是高斯—塞德尔迭代法的变形。

它在迭代过程中,为了加速收敛,再把所得结果依次带入进行计算的同时,还使用把每一次迭代的变化量加权后再代入的方法。

运用超松弛迭代法求解下述问题:试用超松弛迭代法求解接地金属槽内的电位的分布。

已知:A=4CM,H=A\4=10CM给定边值:如图示;给定初值:Φ=0误差范围:E=10^-5计算:迭代次数N=?,Φ的分布。

分析:(1)、节点按从下到上,从左到右的顺序排列。

(2)、按高斯—塞德尔迭代公式进行迭代。

(3)、选择加速因子Α,且A在1到2之间。

以下为该题程序段:#INCLUDE <IOSTREAM.H>#INCLUDE<MATH.H>#INCLUDE<IOMANIP.H>BOOL SUCCESS(DOUBLE A[5][5][2], DOUBLE B) 构建函数其中DOUBLE A 代表记录数据前后两次的值。

{INT I,J;FOR (I=1;I<5;I++)FOR (J=1;J<5;J++) 依次对定义数组赋值{IF ( FABS(A[I][J][1]-A[I][J][0]) > B ) 误差在题设范围内则返回值TRUERETURN TRUE;} 否则返回FALSE RETURN FALSE;}INT MAIN(){INT N,I,J;DOUBLE A[5][5][2];DOUBLE B;B=0.00005;DOUBLE S=1.21;WHILE (1){N=0;COUT<<"输入加速因子数值(1<= A < 2 ) "<<ENDL; 输入题设CIN>>S;FOR(I=0;I<5;I++)FOR(J=0;J<5;J++){A[I][J][0]=0;A[I][J][1]=0;}FOR (I=0;I<5;I++){A[I][4][0]=100;A[I][4][1]=100;}WHILE ( N==0 || SUCCESS(A,B)){FOR(I=1;I<4;I++)FOR(J=1;J<4;J++){A[I][J][0]=A[I][J][1];A[I][J][1]=A[I][J][1]+(A[I-1][J][1]+A[I+1][J][1]+A[I][J+1][1]+A[I][J-1][1] [I][J][1]*4)*S/4; 由高斯—塞德尔迭代公式写出相应公式。

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

实验一 用超松弛迭代法求解接地金属
槽内电位分布
学院:自动化学院
姓名:
学号:
一、实验内容:
试用超松弛迭代法求解接地金属槽内电位的分布。

已知:cm a 4=,mm a h 104/==
给定边值如图所示。

给定初值:0)0(,=j i ϕ
误差范围:510-=ε
计算迭代次数,j i ,ϕ分布。

二.实验设计原理:有限差分法
有限差分法(Finite Differential Method )是基于差
分原理的一种数值计算法。

其基本思想:将场域离散为许多
小网格,应用差分原理,将求解连续函数ϕ的泊松方程的问
题换为求解网格节点上ϕ的差分方程组的问题。

编程时已经考虑到题目要求,所以直接将边值编入到程
序中,这样可以省略输入,从而直接输入迭代因子进行求解,可以减少编程的难度。

这次编程和以前不同的是将数组和正0=ϕ= V 100 ϕ 0=ϕ0=ϕ
交函数图像结合起来,所以在考虑输入和输出的时候会有一些难度,因为数组是上面是小的而图像上面越在上,代表坐标就越大。

所以在输入和输出的时候要谨慎对待。

迭代时所用公式是和书上一样,为
a[i][j]=b[i][j]+w/4*(b[i+1][j]+b[i][j+1]+a[i][j-1 ]+a[i-1][j]-4*b[i][j]);
其中a代表k+1,而b代表k。

以上分析了迭代程序的实现,但是迭代循环如何终止并未说明。

题目中的误差范围ε=0.00001,即当两次迭代结果相差不超过ε时停止,这里只得是九点都满足不超过ε,而并不是其中某一点达到即可。

这样可以保证不是陷入死循环,从而输出结果。

这样可以画出流程图如下所示:
三、程序运行界面及结果
1:开始界面:要求输入迭代因子
2:输入迭代因子进行计算:如输入1.18
可以求出结果,得知要进行12次迭代。

四.源程序代码
#include<iostream.h>
#include<math.h>
int n=0,m=0,k=0,i=0,j=0;
float w;
float a[5][5],b[5][5];
void cjc() //定义函数名
{
while(1)
{
for( j=1;j<4;j++)
for( i=1;i<4;i++)
{
a[i][j]=b[i][j]+w/4*(b[i+1][j]+b[i][j+1]+a[i][j-1]+a[i-1][j]-4*b[i][j]);
} //函数运算迭代公式
n++;
for(i=1;i<4;i++)
for(j=1;j<4;j++)
{
if(fabs(a[i][j]-b[i][j])<0.00001) //保证误差,从而能够确保输出,不必陷入死循环
k++;
}
if(k==9)
break;
else
{
k=0;
for( i=1;i<4;i++)
for( j=1;j<4;j++)
{
b[i][j]=a[i][j];
}
}
}
}
void main()
{
cout<<" 工程电磁场逐次超松弛法求解电位
\n";
cout<<endl;
for(int i=0;i<5;i++ )
for (j=0;j<5;j++)
{
b[i][j]=a[i][j]=0;
b[i][j]=a[i][j]=0;
}
for(int j=0;j<5;j++)
b[j][4]=a[j][4]=100;//输入函数边值
cout<<"请输入“加速收敛因子(大于等于1小于2):”\n";
while(1)
{
cin>>w;//输入迭代因子
if(w>2||w<1)
{
cout<<"输入错误,请重新输入\n";
}
else
break;
}
cjc();
cout<<"电位分布如下:\n";
for(j=4;j>=0;j--)
{
for(i=0;i<5;i++)
cout<<a[i][j]<<" ";
cout<<endl; //输出结果
}
cout<<"迭代次数为:\n";
cout<<"n="<<n<<endl;
}
五.实验心得与思考
通过设计程序并进行完善调试,我对有限差分法有了进一步的认识,同时也已经掌握超松弛迭代法的运用。

对于这一类题型都可以运用同样方法予以解决。

这次的源程序是针对于特定题目编出的程序,如果边值条件有所改变那么源程序也得改变,显得不是很方便。

应该可以编出一种类,既将长和宽以及步距,靠输入其中来进行运算。

由于这种编程比较复杂,这次由于时间不充足当然自己能力有限,所以只好编出这种特定的程序,希望以后能够加强学习,充实自己,编出更加理想的程序。

相关文档
最新文档