(完整版)实验一用超松弛迭代法求解接地金属槽内电位分布
工程电磁场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.学会用有限差分法解简单的二维静电场边值问题,并编制计算程序。
二、方法原理有限差分法是数值计算中应用得最早而又相当简单、直观的一种方法。
应用有限差分法通常所采取的步骤是:⑴ 采用一定的网格分割方式离散化场域。
⑵ 进行差分离散化处理。
用离散的、只含有限个未知数的差分方程组,来近似代替场域内具有连续变量的偏微分方程以及边界上的边界条件(也包括场域内不同媒质分界面上的衔接条件)。
⑶ 结合选定的代数方程组的解法,编制计算机程序,求解由上面所得对应于待求边值问题的差分方程组,所得解答即为该边值问题的数值解。
现在,以静电场边值问题⎪⎩⎪⎨⎧==∂∂+∂∂)2()()1(02222s f D y x Lϕϕϕ中在为例,说明有限差分法的应用。
f (s )为边界点s 的点函数,二位场域D 和边界L 示于图5.1-1中。
x图5.1-1 有限差分的网格分割1. 离散化场域应用有限差分法时,首先需从网格划分着手决定离散点的分布方式。
通常采用完全有规律的方式,这样在每个离散点上可得出相同形式的差分方程,有效地提高解题速度。
如图5.1-1所示,现采用分别与x ,y 轴平行的等距(步距为h )网格线把场域D 分割成足够多的正方形网格。
各个正方形的顶点(也即网格线的交点)称为网格的结点。
这样,对于场域内典型的内结点0,它与周围相邻的结点1、2、3和4构成一个所谓对称的星形。
2.差分格式造好网格后,需把上述静电场边值问题中的拉普拉斯方程(1)式离散化。
设结点0上的电位值为ϕ0。
结点1、2、3和4上的电位值相应为ϕ1、ϕ2、ϕ3和ϕ4,则基于差分原理的应用,拉普拉斯方程(1)式在结点0处可近似表达为ϕ1+ϕ2+ϕ3+ϕ4-4ϕ1=0 (3)这就是规则正方形网格内某点的电位所满足的拉普拉斯方程的差分格式,或差分方程。
超松弛迭代法matlab程序
超松弛迭代法matlab程序超松弛迭代法是一种解线性方程组的迭代方法,其主要思想是在松弛因子的基础上,加入一些超松弛因子,使得迭代更加快速和稳定。
本文将介绍超松弛迭代法的原理,并给出相应的matlab程序实现。
一、超松弛迭代法的原理超松弛迭代法是通过将松弛因子ω加上一个超松弛因子λ,来加速收敛的一种迭代方法。
具体来说,对于一个线性方程组Ax=b,我们可以将其表示为:Ax(k)=b其中,x(k)表示第k次迭代的解向量,A表示系数矩阵,b表示右侧向量。
在超松弛迭代法中,我们将x(k)表示为:x(k)=x(k-1)+ωλ(k-1)其中,λ(k-1)是超松弛因子,ω是松弛因子,x(k-1)是上一次迭代的解向量。
将其代入原方程组,得到:(A-ωD)x(k)=ω(D+L)x(k-1)+ωUx(k-1)+b其中,D表示A的主对角线元素组成的对角矩阵,L表示A的下三角矩阵,U表示A的上三角矩阵。
将其化简为:x(k)=D^-1[(1-ω)D+ωL]x(k-1)+ωD^-1b其中,D^-1表示D的逆矩阵。
该式子即为超松弛迭代法的迭代公式。
二、matlab程序实现下面给出超松弛迭代法的matlab程序实现。
假设我们要解如下线性方程组:3x1+0x2+0x3=90x1+4x2+0x3=80x1+0x2+2x3=2其系数矩阵为:A=[3,0,0;0,4,0;0,0,2];右侧向量为:b=[9;8;2];我们可以通过如下matlab程序实现超松弛迭代法:function [x,iter]=sor(A,b,omega,tol,maxit)% A:系数矩阵% b:右侧向量% omega:松弛因子% tol:容差% maxit:最大迭代次数% x:解向量% iter:迭代次数n=length(b); % 系数矩阵的阶数x=zeros(n,1); % 初始化解向量iter=0; % 初始化迭代次数while iter<maxit % 迭代次数未达到最大值xold=x; % 记录上一次迭代的解向量for i=1:n % 按行迭代sigma=0;for j=1:nif j~=isigma=sigma+A(i,j)*x(j);endendx(i)=(1-omega)*x(i)+omega*(b(i)-sigma)/A(i,i); % 更新解向量enditer=iter+1; % 迭代次数加1if norm(x-xold)<tol % 当解向量的变化小于容差时,认为已收敛break;endend调用该函数,求解上述线性方程组,可以使用如下代码:A=[3,0,0;0,4,0;0,0,2];b=[9;8;2];omega=1.5;tol=1e-6;maxit=1000;[x,iter]=sor(A,b,omega,tol,maxit);disp(x);其中,omega为松弛因子,tol为容差,maxit为最大迭代次数。
用超松弛迭代法求解接地金属槽内电位分布
实验一用超松弛迭代法求解接地金属槽内电位分布一、实验原理(有限差分法介绍)有限差分法(Finite Differential Method)是基于差分原理的一种数值计算法。
其基本思想:将场域离散为许多小网格,应用差分原理,将求解连续函数ϕ的泊松方程的问题转换为求解网格节点上ϕ的差分方程组的问题。
二.实验内容与要求1. 试用超松弛迭代法求解接地金属槽内电位的分布。
已知:,cma4=mmah104/==给定边值如图所示。
给定初值:0)0(,=jiϕ误差范围:510−=ε计算迭代次数,ji,ϕ分布。
2、按对称场差分格式求解电位的分布(即求出D域的场分布,由对称性可得全域的场分布)已知,cma4=mmh14040==给定边值:如图1示给定初值)()(.1j401001jp12ji−=−−=ϕϕϕ误差范围: 510−=ε图1 接地金属槽内半场域的网格剖分计算:1)迭代次数,Nji,ϕ;2)按电位差10=Δϕ画出槽中等位线分布图。
图1.7 接地金属槽内网格0=ϕ=V 100 ϕ0=ϕ0=ϕ电磁场数值计算与仿真实验指导书63、分片场域的静电场分析(选做)用有限差分法计算区域内的电位、电场强度,绘制等位线。
并计算区域的电容,分析单元的大小对电容计算结果的影响,给出曲线。
100伏0伏εr1=2 εr2=4εr3=1εr4=3电磁场数值计算与仿真实验指导书7三、实验程序内容程序一:#include<iostream.h>#include<math.h>void main(){double m[5][5],n[5][5];int N=0,b=1;int i,j;double e=0.00001;double a=2/(1+sin(3.1415926/4));for(i=0;i<=4;i++)for(j=0;j<=4;j++){m[i][j]=0;n[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["<<i<<"]["<<j<<"]"<<"="<<m[i][j]<<'\t';cout<<endl;}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["<<i<<"]["<<j<<"]"<<"="<<m[i][j]<<'\t'; cout<<endl;}cout<<"N="<<N<<endl;}实验结果:N=13程序二:#include<iostream.h>#include<math.h>void main(){static double m[41][41],n[41][41];int N=0,b=1;int i,j;double e=0.00001;double a=2/(1+sin(3.1415926/4));for(i=2;i<=40;i++)for(j=2;j<=41;j++){m[i][j]=100*(j-1);m[i][j]=m[i][j]/40;n[i][j]=m[i][j];for(j=41;j>=1;j--){ for(i=1;i<=41;i++)cout<<m[i][j]<<'\t';cout<<endl;}while(b==1){b=0;N=N+1;for(i=2;i<=21;i++)for(j=2;j<=40;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=2;i<=21;i++)for(j=2;j<=40;j++){ if(abs(m[i][j]-n[i][j])>=e)b=1;n[i][j]=m[i][j];}}for(i=2;i<=21;i++)for(j=2;j<=40;j++)m[42-i][j]=m[i][j];cout<<endl;for(j=41;j>=1;j--){ for(i=1;i<=41;i++)cout<<m[i][j]<<'\t';cout<<endl;}cout<<"N="<<N<<endl;}实验结果:N=17等位线分布程序及图:(mathematic)。
第六章第三节逐次超松弛迭代法
则说 A 是具有相容次序的矩阵.
注意:
若矩阵 A aij 具有相容次序, 则属于同一子集的元素之间没有联系, 即若 i, j Wk , aij 则
0, , a ji 0 . 且
例3
0 0 1 4 1 4 1 0 A 0 1 4 0 0 4 1 0
x0i (i 1,, n) ;参数 ;容限 TOL ;最大迭代次数 m
输出 近似解 x1 , x2 , x n 或迭代次数超过 m 的信息.
step 1
对 k 1,, n 做 step2—4. 对 i 1,2,, n
step 2
xi (1 ) x0i
step 3 step 4 对 i 1,2,, n
定理 1 设方程组 Ax b 的系数矩阵 A 的主对角元素 aij 0, i 1,, n ,则 SOR 方法
收敛的充分必要条件为
(T ) 1
其中 T 是 SOR 方法的迭代矩阵.
定理 2
设方程组 Ax b 的系数矩阵 A 的主对角元素 aij 0, i 1,, n ,则 SOR 方法
2
x 我们把(3.1)式中的中间 ~i( k ) 消去,则有
i 1 ~ ( k ) (b a x ( k ) xi ij j i aii j 1
j i 1
a
n
ij
x (jk 1) ) (1 ) xi( k 1)
i 1,2,, n, k 1,2
3
例1 方程组
5 x1 x 2 x3 x 4 4 x 10 x x x 12 2 3 4 x1 x 2 5 x3 x 4 8 x1 x 2 x3 10 x 4 34
对称超松弛迭代法 概述及解释说明
对称超松弛迭代法概述及解释说明1. 引言1.1 概述本篇文章旨在介绍对称超松弛迭代法的概述及解释说明。
对称超松弛迭代法是一种用于求解线性方程组的数值方法,它结合了迭代法和超松弛方法,能够在求解大型稀疏线性方程组时展现出良好的效果。
本文将从原理、算法流程以及应用和效果等方面进行详细说明,以帮助读者更好地理解该方法。
1.2 文章结构本文共分为四个部分:引言、对称超松弛迭代法概述、解释说明和结论。
在引言部分,我们将简要介绍本篇文章的主题和目的,并提供文章整体结构;在对称超松弛迭代法概述部分,我们将对迭代法、超松弛方法和对称超松弛迭代法进行逐一讲解;接着,在解释说明部分,我们将详细阐释该方法的原理,并提供算法流程说明,最后通过应用实例和效果分析来展示其实际应用价值;最后,在结论部分,我们将总结回顾全文内容,并展望未来对该领域的研究方向。
1.3 目的介绍对称超松弛迭代法的目的是为了提供一种有效求解线性方程组的数值方法,特别适用于复杂、大规模和稀疏问题。
本文旨在向读者介绍其背后的原理,阐明其算法流程,并通过实际应用和效果分析来证明其可行性和优越性。
最终目标是为读者提供一个全面而清晰的概述,帮助读者理解和运用对称超松弛迭代法解决实际问题。
2. 对称超松弛迭代法概述:2.1 迭代法简介:在数值分析和计算数学中,迭代法是一种通过从一个初始猜测值开始反复应用一个递归公式来逼近方程解的方法。
它广泛应用于线性方程组的求解问题。
不论是在工程领域还是科学研究中,线性方程组求解都是一个常见且重要的问题。
2.2 超松弛方法简介:超松弛方法(SOR)是迭代法中的一种技术,旨在加速收敛速度。
其核心思想是通过引入松弛因子来加快解的收敛过程。
对于每次迭代,在计算新解的分量时,超松弛方法允许我们使用之前已经更新但尚未完成全部迭代的分量进行估计。
该技术通常用于缩小残差并提高数值精度。
2.3 对称超松弛迭代法概述:对称超松弛(SSOR)迭代法结合了对称后退向前(SWEEP)和超松弛(SOR)的思想。
工程电磁场实验报告用超松弛迭代法求解接地金属槽内的电位分布
南京理工大学工程电磁场实验报告班级:1m 班姓名:mmmm学号:mmm2013.06.16实验一 用超松弛迭代法求解接地金属槽内的电位分布 一、实验目的1、掌握如何使用超松弛法来近似求解金属槽内的电位值。
2、掌握利用C++来实现超松弛迭代法。
二、实验原理有限差分法是基于差分原理的一种计算方法。
对于下面的的一个二维泊松方程的差分格式,利用差分就可以得到每一个点的电位。
图1 有限法网格分割其电位值是: 2012341()4Fh ϕϕϕϕϕ=+++-其中F ρε=-, h 为网格间距。
若令F=0,则电位情况则变成了拉普拉斯的差分格式:012341()4ϕϕϕϕϕ=+++图2 迭代法求电位值1、高斯-赛德尔计算法:(1)112,1,,11,,11[]4k k k k k i j i j i j i j i j Fh ϕϕϕϕϕ+++--++=+++-直到(1)(),,k k i j i j ϕϕε+-<为止。
2、对于超松弛法,我们引入一个加速收敛因子α并且得到下面的计算公式:(1)()112(),,1,,11,,1,[4]4k k k k k k k i j i j i j i j i j i j i j Fh αϕϕϕϕϕϕϕ+++--++=++++--直到(1)(),,k k i j i j ϕϕε+-<为止。
借助计算机来求解的时候,其流程图如下:图3 迭代法求电位值的流程图三、实验内容(1)、题目要求利用超松弛迭代法求解接地金属槽内的电位分布,给定图如下。
已知a=4cm,h=a/4=10mm 。
给定初值(0),j 0i ϕ=,误差范围为510ε-=。
求迭代次数N=?以及电位分布,i j ϕ。
图4 超松弛法求接地金属槽内的电位值(2)、利用C++来编写计算机的求解程序,其程序如下:程序(3)、求解结果运行程序后,就能得到求解的结果。
图5 运行程序后的初始界面图6 求解结果(4)结果分析1、从实验结果可以看到,当加速收敛因子的大小不同的时候,两者的迭代次数是有差异,所以选取合适的最佳的收敛因子可以大大加速求解的速度,节省存储空间,提高效率。
电磁场与电磁波赛德尔法求电位编程-何梦-20160506
if(fabs(x-a[h1][l1])<1e-6) //判断每个值是否在精度要求的范围内 a[h1][l1]=x; } } sum=sum+1; } while(num<135); 不用循环 for(p=0;p<11;p++) { for( q=0;q<17;q++) { printf("%f 值 } printf("\n"); } printf("迭代次数=%d",sum); } ",a[p][q]);
//这是将中间的每个值用公式求出来 if (fabs(x - a[h1][l1])<1e-6) 精度要求的范围内 a[h1][l1] = x; } } sum = sum + 1; } while (num<135); for (p = 0; p<11; p++) { for (q = 0; q<17; q++) { outfile<< a[p][q] <<'\t'; } outfile<<endl; } //printf("迭代次数=%d", sum); } //输出循环次数 //输出数组的值 //计算循环次数 //当每个值满足精度范围时,就不用循环 num = num + 1; //判断每个值是否在
for( h10=10,l1=1;l1<17;l1++) a[h10][l1]=0; for( h1=1,l16=16;h1<11;h1++) a[h1][l16]=0; for( h1=1;h1<10;h1++) { for( l1=1;l1<16;l1++) a[h1][l1]=25; // 这里是给中间赋初
- 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;
}
五.实验心得与思考
通过设计程序并进行完善调试,我对有限差分法有了进一步的认识,同时也已经掌握超松弛迭代法的运用。
对于这一类题型都可以运用同样方法予以解决。
这次的源程序是针对于特定题目编出的程序,如果边值条件有所改变那么源程序也得改变,显得不是很方便。
应该可以编出一种类,既将长和宽以及步距,靠输入其中来进行运算。
由于这种编程比较复杂,这次由于时间不充足当然自己能力有限,所以只好编出这种特定的程序,希望以后能够加强学习,充实自己,编出更加理想的程序。