(完整版)实验一用超松弛迭代法求解接地金属槽内电位分布
工程电磁场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)实验思路:类似与第一题的思路,但只计算一半的区域,对另一半进行对称性计算,减小计算量。
松弛迭代法

一、松弛迭代计算公式
松弛迭代法
赛德尔迭代法的迭代公式可表示为 i 1 n 1 xi( m +1) = (bi ∑ aij x (jm +1) ∑ aij x (jm ) ) aii j =1 j =i +1
=x
(m) i i 1 n 1 ( m +1) + (bi ∑ aij x j ∑ aij x (jm ) ) aii j =1 j =i
令Bω = ( D ωL) 1[(1 ω ) D + ωU ], gω = ( D ωL) 1 b, 则
x ( m +1) = Bω x ( m ) + gω
(m = 0,1,2, L)
三、松弛法算法 输入 方程组的阶数n, A的元素aij,≤ i, j ≤ n; b的分量bi ,1 ≤ i ≤ n; 1
在实际计算中,松弛法常采用以下形式:
x
( m +1) i
= (1 ω ) x
( m) i
+ ω (bi ∑ aij x
j =1
i 1
( m +1) j
∑ aij x (jm ) ) / aii (i = 1,2, L , n)
j =i
n
二、松弛法的矩阵形式 x (m +1) = ( D ωL) 1[(1 ω ) D + ωU ]x ( m ) + ω ( D ωL) 1 b (m = 0,1,2, L)
ri( m +1) → 0(i = 1,2, L , n)
在修正量前乘上一个参数,即
xi( m +1) = xi( m ) + ωri( m +1)
超松弛迭代法课程设计

超松弛迭代法课程设计一、课程目标知识目标:1. 学生能理解超松弛迭代法的概念,掌握其基本原理和应用场景。
2. 学生能够运用超松弛迭代法解决线性方程组问题,并理解其收敛性。
3. 学生能了解超松弛迭代法在工程和科学计算中的重要性。
技能目标:1. 学生能够独立进行超松弛迭代法的计算步骤,包括设定松弛因子、构造迭代矩阵等。
2. 学生能够运用数学软件(如MATLAB)实现超松弛迭代法的算法,并进行简单的程序调试。
3. 学生通过实际案例分析,培养运用超松弛迭代法解决实际问题的能力。
情感态度价值观目标:1. 学生通过学习超松弛迭代法,培养对科学计算和数学建模的兴趣,增强对数学学科的学习信心。
2. 学生在小组讨论和合作中,学会尊重他人意见,培养团队协作精神。
3. 学生能够认识到超松弛迭代法在科技发展中的重要作用,增强科技创新意识和社会责任感。
课程性质:本课程为高中数学选修课,以培养学生解决实际问题能力和数学思维能力为目标。
学生特点:学生具备一定的线性代数基础,具有较强的逻辑思维能力和动手操作能力。
教学要求:教师应注重理论与实践相结合,引导学生通过实际案例掌握超松弛迭代法的应用。
同时,注重培养学生的团队协作能力和创新意识。
在教学过程中,关注学生的学习进度,及时调整教学策略,确保课程目标的实现。
通过课堂讲解、上机实践和小组讨论等多种教学方式,提高学生的学习效果。
二、教学内容1. 引言:介绍超松弛迭代法的背景和在实际问题中的应用,激发学生学习兴趣。
相关教材章节:第二章第四节“迭代法及其应用”。
2. 基本概念:讲解超松弛迭代法的基本原理,包括迭代格式、松弛因子选取等。
相关教材章节:第二章第四节“超松弛迭代法”。
3. 算法实现:详细讲解超松弛迭代法的计算步骤,并通过实例进行演示。
相关教材章节:第二章第四节“超松弛迭代法的计算步骤”。
4. 实践应用:分析实际案例,让学生动手实践,运用超松弛迭代法解决线性方程组问题。
相关教材章节:第二章第五节“迭代法解决实际问题”。
南京理工大学工程电磁场实验报告

工程电磁场实验报告姓名:赵玲学号:1010200219指导老师:李强日期:2013.6.16实验一 用超松弛迭代法求解接地金属槽内电位分布一、实验内容与要求试用超松弛迭代法求解接地金属槽内电位分布已知:a=4 cm ,h=10 mm 给定边值如图所示。
给定初值:(0),0i j ϕ=误差范围:510ε-=计算迭代次数N ,,i j ϕ分布二、原理1、有限差分法(Finite Differential Method )有限差分法是基于差分原理的一种数值计算法。
其基本思想:将场域离散为许多小网格,应用差分原理,将求解连续函数ϕ 的泊松方程的问题转换为求解网格节点上ϕ 的差分方程组的问题。
2、超松弛迭代法式中:α ——加速收敛因子(1<α < 2) 迭代收敛的速度与α 有明显关系表1.1 迭代收敛的速度与α 的关系最佳收敛因子的经验公式:• 迭代收敛的速度与电位初始值的给定及网格剖分精细有关• 迭代收敛的速度与工程精度要求有关三、流程图四、源程序#include<iostream.h>void main(){ double a7,a8,a9,a12,a13,a14,a17,a18,a19,u7=0,u8=0,u9=0,u12=0,u13=0,u14=0,u17 =0,u18=0,u19=0,b=1.2,N=0;do{ a7=u7;a8=u8;a9=u9;a12=u12;a13=u13;a14=u14;a17=u14;a18=u18;a19=u19;u7=u7+b/4*(u8+u12-4*u7);u8=u8+b/4*(u9+u13+u7-4*u8);u9=u9+b/4*(100+u14+u8-4*u9);u12=u12+b/4*(u13+u17+u7-4*u12);u13=u13+b/4*(u14+u18+u8+u12-4*u13);u14=u14+b/4*(100+u19+u9+u13-4*u14);u17=u17+b/4*(u18+u12-4*u17);u18=u18+b/4*(u19+u13+u17-4*u18);u19=u19+b/4*(100+u14+u18-4*u19);N++;}while(u7-a7>1e-5||u8-a8>1e-5||u9-a9>1e-5||u12-a12>1e-5||u13-a13>1e-5||u14-a14>1e-5||u17-a17>1e-5||u18-a18>1e-5||u19-a19>1e-5);cout<<"u7="<<u7<<'\t'<<"u8="<<u8<<'\t'<<"u9="<<u9<<'\n';cout<<"u12="<<u12<<'\t'<<"u13="<<u13<<'\t'<<'\t'<<"u14="<<u14<<'\n'; cout<<"u17="<<u17<<'\t'<<"u18="<<u18<<'\t'<<"u19="<<u19<<'\n';cout<<"迭代次数N="<<N<<'\n';}五、求解结果六、实验总结通过工程电磁场这门课的学习,掌握了二维静电场边值问题的分析,但是对有限差分法的掌握还不够深入,所以这次实验还是有点难度的。
有限差分法计算金属槽内电位分布

班级:物理08-2B 姓名:胡艳学号:08070201010有限差分法计算金属槽内电位分布一、选题依据求解电位分布问题是物理学中最常见的问题之一,采用有限差分法解决此类问题是十分有效的。
差分方程确定之后,一般选用迭代法求解,这是由于方程组系数矩阵中有大量元素为零,并且系数矩阵形成比较简单,有规律和重复。
在迭代过程中常常可以一边形成系数矩阵一边计算,以节省内存,因而迭代法比直接法更常用。
迭代法中又以超松弛迭代法最常用,以下给出超松弛迭代方法的公式。
对于二维场泊松方程等距剖分差分格式公式为()()()()()()()⎪⎪⎭⎫ ⎝⎛Φ--+Φ+-+Φ++Φ++Φ+Φ=+Φj i n j i n j i n j i n j i n ji n ji n ,41,1,111,,14,,1α(2.67)式中α称为加速收敛因子或超松弛因子,它的数值决定超松弛程度,影响迭代解收敛的速度。
α取值范围是1 ≤ α <2 (2.68)加速收敛因子α取值因问题而异,对于第一类边值问题,若一方形场域由正方形网格划分,每边的节点数为(n+1),则加速收敛因子α可按下式计算:nπαs i n12+=(2.69)若一矩形场域由边长为h 的正方形网格划分为mh 和nh ,且m 和n 都很大(一般都要大于15),那么加速收敛因子α为n m 221122+-=πα (2.70)一般情况下,α的最佳值只能是凭经验选取。
对于其他形状的场域,也可用等效矩形面积的处理方法,即得出等效矩形面积后,再用式(2.70)求出最佳的α。
下面我们来看一个计算电位分布的实例。
二、处理过程实例:有一长接地金属槽,横截面积如图2.15所示,其侧壁与底面电位均为零,顶盖电位为100V ,求槽内电位分布。
分析:对于此槽中间区段电位分布,可理想化为二维问题。
选定直角坐标系,槽内电位函数Φ满足拉普拉斯方程,构成一类边值问题。
2222=∂Φ∂+∂Φ∂yxVay a x 1006.0,0=Φ=<<Vay a x y a x ay x 06.00,0,06.00,0=Φ=Φ=Φ≤==≤≤≤=<<按有限差分法计算步骤,解题过程如下。
超松弛迭代法求解接地金属槽内电位分布

实验一用超松弛迭代法求解接地金属槽内电位分布一、实验内容:试用超松弛迭代法求解接地金属槽内电位的分布。
已知:,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; 由高斯—塞德尔迭代公式写出相应公式。
南京理工大学工程电磁场实验报告
MATlAB 绘制等电位线视图如下:
三维图像:
100 80 60 40 20 0 4 3 2 1 1 3 2 4
8
二维图像:
4
3.5 3
2.5
2
1.5
1
0.5 0.5 1 1.5 2 2.5 3 3.5 4
五、实验总结:
通过本次实验,我们在很大程度上把书本上的知识应用于实践中去, 例如 VC++的应用, 是我们第一次把其应用到工程实验上去, 超越了以 往只限于基础原理的学习。另一方面,在画图方面对于 MATlAB 的应 用,让我们初步认识到这款软件功能的强大,也让我们意识到掌握这 门软件的重要性,其在可视化,仿真方面发挥了很大的作用,大大地 帮助我们更深刻地理解和把握工程电磁场这门课程的相关知识。
三、程序设计及其运行情况:
#include<stdio.h> #include<math.h> #include<windows.h> fun(float u[][41],float p) /*此函数即为差分求解的方 法过程*/ {long int i,j,flag=1,num=0;float t,e=p/4; /*定义变量,在此 p 为收敛 因子*/ while(flag) {flag=0; for(i=1;i<40;i++) {for(j=1;j<20;j++) { t=u[i][j]; u[i][j]=u[i][j]+e*(u[i][j-1]+u[i-1][j]+u[i][j+1]+u[i+1][j]4*u[i][j]); if(fabs(u[i][j]-t)>=1e-5) flag=1; /*该判断语句用于判断 u[i][j]前后两次计算之差绝对值是否符合实验误 差要求*/ }u[i][20]=u[i][19]; }num++; } return num; } int main(void) { long int i,j,num=0,min=100000;float q,p,t,eps=1,e=p/4,u[41][41]; for(i=0;i<41;i++) {u[0][i]=100;u[40][i]=0;} /*定义初值*/ for(i=1;i<40;i++) {u[i][0]=u[i][40]=0;} for(i=1;i<40;i++) for(j=1;j<21;j++) u[i][j]=2.5*(j-1); printf("左半边初始值如下:\n"); for(i=0;i<41;i++) {printf("\n"); for(j=0;j<21;j++) { printf("%-11.5f",u[i][j]);
项目训练二 求二维金属槽内的点位分布
将这几点的电位用泰勒级数展开,化简,近似可得:
1
0
1 ( ) 2 3 4 4 1
上式表明,任一点的电位等于它周围四个点电位的平均值。
图 3-1 差分网格
差分方程的数值解法: 平面内有多少个节点,就能得到多少个差分方程,当这些节点数目较大时,使用迭代 法求解差分方程组比较方便。 a. 简单迭代法: 用迭代法解二维电位分布时,将包含边界在内的节点均以下标(i,j)表示,i,j 分 别表示沿 x,y 方向的标点。次序是 x 方向从左到右,y 方向从上到下,我们用上标 n 表示 某点电位的第 n 次的迭代值。下式得出点(i,j)的第 n+1 次电位的计算公式:
n n 1 n 1 1 n ( ) i , j 1 i 1, j i , j 1 4 i 1, j
c. 超松弛迭代法:
n 1 i, j
此式也称为异步迭代法,异步迭代法比简单迭代法收敛速度加快一倍左右。
为了加快收敛速度,常采用超松弛迭代法。计算时,将某点的新老电位值之差乘以一
图 4-3 三维电位分布图 等位线分布图
4.6 中心点电位的数值解和精确解的比较
4.6.1 中心点 p ( , ) 的数值解:
因为电位是从上至下逐渐呈递减状,中间点的所在等位线的 a b 为 50V。
, 2 2
a b 2 2 a b 2 2
4.6.2 中心点 p ( , ) 的精确解:
在不同的 m 取值下, a b 的取值会不同。
, 2 2
m=1.2, a b =49.5133V
, 2 2 , 2 2
m=1.4, a b =49.5149V M=1.6, a b =49.5161V
工程电磁场报告
工程电磁场报告-------迭代法在计算电位中的应用所谓迭代法,是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的是直接法(或者称为一次解法),即一次性解决问题。
迭代法又分为精确迭代和近似迭代。
“二分法”和“牛顿迭代法”属于近似迭代法。
迭代算法是用计算机解决问题的一种基本方法。
它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。
在这次实验中是利用迭代法求出在二维场中的电位分布,相对于其他求解方法,虽然精确度存在误差,但是简单易行,充分利用计算机的高效,可以很快的得出大致的电位分布。
实验采用的是C++语言进行辅助。
一、初试牛刀-----计算5×5的电位分布;这个实验是用于实现超松弛法来求节点电位,考虑到要求的场是二维分布的,所以构造的基本数据为二维数组,套用的迭代公式为:a[i][j]=b[i][j]+( α/4)*(b[i+1][j]+b[i][j+1]+a[i-1][j]+a[i][j-1]-4*b[i][j]);迭代因子为α,可根据经验公式算出,直接赋值,考虑到计算机的高效性,在此可任取一大于1小于2的数,最后均能得出答案,只是迭代次数有所差异。
实现该功能的源程序如下:#include<iostream.h>#include<math.h>#include<iomanip.h>void main(){double a[5][5];double b[5][5];int i=0,j=0;static int M=0;bool N=true;for(j=1;j<=3;j++){for(i=1;i<=3;i++)a[i][j]=0;}{a[4][j]=0;a[0][j]=100;}for(i=1;i<=4;i++){a[i][0]=0;a[i][4]=0;}cout<<"各内节点上电位的初始迭代值为:"<<endl;//输出初始迭代值for(i=0;i<=4;i++){for(j=0;j<=4;j++){cout<<a[i][j]<<" ";}cout<<endl;}cout<<"\n";do{for(i=0;i<=4;i++){for(j=0;j<=4;j++){b[i][j]=a[i][j];}}{for(j=1;j<=3;j++){a[i][j]=b[i][j]+(1.2/4)*(b[i+1][j]+b[i][j+1]+a[i-1][j]+a[i][j-1]-4*b[i][j]);}}for(i=1;i<=3;i++) {for(j=1;j<=3;j++){if(fabs(a[i][j]-b[i][j])>0.00001){N=true;break;}elseN=false;}}M++;}while(N);cout<<"经迭代后,各节点电位的近似值为:"<<endl;for(i=0;i<=4;i++){for(j=0;j<=4;j++){cout<<setiosflags(ios::fixed)<<setprecision(5)<<a[i][j]<<" ";}cout<<endl;}cout<<endl;cout<<"迭代次数"<<M<<endl<<endl;}程序很短,但是实现了要求的功能,经运行可得出结果:电位大概的分布如左图所示,可以看出还是比较符合的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;
}
五.实验心得与思考
通过设计程序并进行完善调试,我对有限差分法有了进一步的认识,同时也已经掌握超松弛迭代法的运用。
对于这一类题型都可以运用同样方法予以解决。
这次的源程序是针对于特定题目编出的程序,如果边值条件有所改变那么源程序也得改变,显得不是很方便。
应该可以编出一种类,既将长和宽以及步距,靠输入其中来进行运算。
由于这种编程比较复杂,这次由于时间不充足当然自己能力有限,所以只好编出这种特定的程序,希望以后能够加强学习,充实自己,编出更加理想的程序。