超松弛迭代法求解接地金属槽内电位分布_第1页
超松弛迭代法求解接地金属槽内电位分布_第2页
超松弛迭代法求解接地金属槽内电位分布_第3页
超松弛迭代法求解接地金属槽内电位分布_第4页
超松弛迭代法求解接地金属槽内电位分布_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验一用超松弛迭代法求解接地金属槽内电位分布1、 实验内容:试用超松弛迭代法求解接地金属槽内电位的分布。已知:,给定边值如图所示。给定初值:误差范围:计算迭代次数,分布。一.实验思路由边界条件用泊松方程的五点差分格式求得中央点的点位。再以所得点及边界再次利用泊松方程的五点差分格式求出另四个点,依照此方法求出其余点的电位分布。用最佳收敛因子的经验公式计算收敛因子。利用超松弛迭代法进行差分方程的求解,当遇到边界是采用边界值或者边界差分格式。直到所有节点电位满足误差条件。二实验设计原理:有限差分法有限差分法(Finite Differential Method)是基于差分原理的一种数值计算法。其基本

2、思想:将场域离散为许多小网格,应用差分原理,将求解连续函数的泊松方程的问题换为求解网格节点上的差分方程组的问题。编程时将边值编入到程序中,这样可以省略输入,从而直接输入迭代因子进行求解,可以减少编程的难度。迭代时所用公式是和书上一样,为aij=bij+w/4*(bi+1j+bij+1+aij-1+ai-1j-4*bij);其中a代表k+1,而b代表k。启动输出开始菜单(边值都已经给定)输入迭代因子w迭代次数n=0n+ 开始循环迭代函数判断相邻二次差值是否小于给定值输出n,电位aij终止三、程序运行界面及结果四源程序代码#include<iostream>#include<ma

3、th.h>#include<iomanip>using namespace std;classoverrei /over-relaxation iterative methodprivate: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+)pi=new doublen;q=new double *m;/迭代因子求解for(i=0;i<m;i+)qi=new

4、 doublen;if(m=n)x=2/(1+sin(3.141592654/(m-1);elsex=2-3.141592654*sqrt(2)*sqrt(1/(m-1)*(m-1)+1/(n-1)*(n-1);cout<<"最佳收敛因子:"<<x<<endl;void Initialization(); /赋边界条件void Cal(); /计算void Diedai(); /迭代函数void Show(); /输出部分;void overrei:Initialization() /赋边界条件inti,j; for(i=0;i<m

5、;i+) /边界条件for(j=0;j<n;j+)if(i=0)pij=100; qij=100;elsepij=0;qij=0;cout<<"初始点位:"<<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(pij-qij)>e|(qij-pij)>e) /相邻两次迭代误差是否小于1e-5c=0;break;if(c=0) break;if(c=1 && k!=0)

6、 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+)qij=pij+y*(qi-1j+qij-1+pi+1j+pij+1-4*pij);elsefor(i=1;i<m-1;i+)for(j=1;j<n-1;j+)pij=qij+y*(pi-1j+pij-1+qi+1j+qij+1-4*qij);k+;void overrei:Show() /输出部分inti,j;for(i=0;i<m;i+)for(j=0;j

7、<n;j+)cout<<setw(12)<<setprecision(6)<<fixed<<qij<<ends;cout<<endl;int main()cout<<" *"<<endl;cout<<" 超松弛迭代法求解接地金属槽内电位的分布"<<endl;cout<<" *"<<endl;overrei A(5,5,1e-5);A.Initialization();A.Cal();co

8、ut<<"电位分布:"<<endl;A.Show();cout<<"迭代次数:"<<A.k<<endl;return 0;实验二按对称场差分格式求解电位的分布一.实验思路只计算一半的区域,对另一半进行对称性计算,减小计算量。选取二维数组,同样是两个数组a4141、b4141,分别用于表示迭代前后的取值。由此对第20列进行特殊处理。即第21列是和第20列相等的,因为在第21列上标注了"/x=0,即要求每次迭后都要求u1i20=u1i19,其余则同前。当计算出了前21列的电位值时,根据对称

9、性可得到右半边的电位值,即要求u1i40-j=u1ij;,直接赋值。四周的电位值依旧保持不变,不能够参与迭代。并且中间对称列上的电位值为零,故也不参与迭代。由题意可知,只有第1列到第20列参与迭代。在进行精度计算时,用数组b的值与相应数组a里的值进行比较,没迭代一次都要进行比较。如果在误差允许的范围内,则继续迭代;当超过误差标准的时候则停止迭代。依旧按照比较得到最少收敛次数的方法在程序中计算出最佳收敛因子。然后对对称列右边的点进行对称赋值。最后输出输出最佳迭代因子、迭代的次数和迭代后各相应点的电位值。二.源程序代码#include<iostream.h> #include

10、<math.h> #include<iomanip.h> void main() double u14141,u24141; int flag=10000,i,j,e,n; double a,d; /a最佳加速收敛因子for(j=0;j<41;j+) u10j=100; u140j=0;  for(i=1;i<40;i+) u1i0=0; u1i40=0;  for(i=1;i&l

11、t;40;i+) /内部点赋初值for(j=1;j<21;j+) u1ij=2.5*(j-1); cout<<"迭代前左半区域各电位点上的初始值:"<<endl; for(i=0;i<41;i+) for(j=0;j<21;j+) cout<<u1ij<<" " /输出迭代初值 cout<<endl; cout<<endl<<"n"&#

12、160;for(d=1;d<2;d+=0.01)/取迭代次数最少的加速收敛因子n=0; for(j=0;j<41;j+) u10j=100; u140j=0;  for(i=1;i<40;i+) u1i0=0; u1i40=0; for(i=1;i<40;i+) for(j=1;j<21;j+) u1ij=2.5*(j-1);  do/迭代x次 for(i=0;i<41;i+) for(j=0;j<22;j+)&#

13、160;u2ij=u1ij; for(i=1;i<40;i+) for(j=1;j<20;j+) u1ij=u2ij+(d/4)*(u2i+1j+u2ij+1+u1i-1j+u1ij-1-4*u2ij); u1i20=u1i19; for(i=1;i<40;i+)/判断精度for(j=1;j<21;j+)  if(fabs(u1ij-u2ij)>1e-5) e=1; break; else e=0;  if(e=1) brea

14、k;  n+;/迭代次数while(e); if(n<flag) flag=n; a=d;  for(i=1;i<40;i+)/对其对称点赋值for(j=1;j<21;j+)u1i40-j=u1ij;  cout<<"迭代后各节点上最终电位近似值:"<<endl; for(i=0;i<41;i+) for(j=0;j<41;j+) cout<<setiosflags(ios:fixed)&l

15、t;<setprecision(5)<<setw(8)<<u1ij<<" "/对齐输出 cout<<endl; cout<<endl<<endl; cout<<"收敛因子:"<<a<<endl; cout<<endl; cout<<"迭代次数:"<<flag<<endl; cout<<endl;

16、  三.程序运行界面及结果附录:程序一:#include<iostream.h>#include<math.h>void main()double m55,n55;int N=0,b=1;inti,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+)mij=0;nij=0;m14=100;m24=100;m34=100;n14=100;n24=100;n34=100;for(j=4;j>=0;j-)for(i=0;i<=4;i

17、+)cout<<"m"<<i<<""<<j<<""<<"="<<mij<<'t'cout<<endl;while(b=1)b=0;N=N+1;for(i=1;i<=3;i+)for(j=1;j<=3;j+)mij=mij+a*(mi-1j+mij-1+mi+1j+mij+1-4*mij)/4;for(i=1;i<=3;i+)for(j=1;j<=3;j+)if(fabs

18、(mij-nij)>=e)b=1;nij=mij;for(j=4;j>=0;j-)for(i=0;i<=4;i+)cout<<"m"<<i<<""<<j<<""<<"="<<mij<<'t'cout<<endl;cunt<<"N="<<N<<endl;程序二:#include<iostream>#includ

19、e<math.h>#include<iomanip>using namespace std;classoverrei /over-relaxation iterative methodprivate: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+)pi=new doublen;q=new double *m;/迭代因子求解for(i=0;i<m;i+

20、)qi=new doublen;if(m=n)x=2/(1+sin(3.141592653/(m-1);elsex=2-3.141592653*sqrt(2)*sqrt(1/(m-1)*(m-1)+1/(n-1)*(n-1);cout<<"最佳收敛因子:"<<x<<endl;void Initialization(); /赋边界条件void Cal(); /计算void Diedai(); /迭代函数void Show(); /输出部分;void overrei:Initialization()inti,j; /边界条件for(i=0;i

21、<m;i+)for(j=0;j<n;j+)if(i=0)pij=100; qij=100;elsepij=0;qij=0;cout<<"初始点位:"<<endl;Show();voidoverrei:Cal()inti,j;int c=1;while(1) c=1;for(i=0;i<m;i+)for(j=0;j<n;j+)if(pij-qij)>e|(qij-pij)>e)c=0;break;if(c=0) break;if(c=1 && k!=0) break;Diedai();voidover

22、rei:Diedai()inti,j;double y=x/4;if(k%2)for(i=1;i<m-1;i+)for(j=1;j<n-1;j+)qij=pij+y*(qi-1j+qij-1+pi+1j+pij+1-4*pij);elsefor(i=1;i<m-1;i+)for(j=1;j<n-1;j+)pij=qij+y*(pi-1j+pij-1+qi+1j+qij+1-4*qij);k+;voidoverrei:Show()inti,j;for(i=0;i<m;i+)for(j=0;j<n;j+)cout<<setw(12)<<s

23、etprecision(6)<<fixed<<qij<<ends;cout<<endl;int main()cout<<" *"<<endl;cout<<" 超松弛迭代法求解接地金属槽内电位的分布"<<endl;cout<<" *"<<endl;overrei A(5,5,1e-6);A.Initialization();A.Cal();cout<<"电位分布:"<<end

24、l;A.Show();cout<<"迭代次数:"<<A.k<<endl;return 0;程序三#include <iostream.h>#include <math.h> int i,j,N=0;/N为迭代次数double u155;/定义电位double u255;double e=0.00001;/误差范围double a=1.5;/加速收敛因子int finish();/迭代结束函数int Nresult()

25、;/求解迭代次数void print();void main()   if(i=4)     for(j=0;j<5;j+)   u1ij=100; /边界值    else u1ij=0;     N=Nresult();      print();void print()cout

26、<<"迭代次数为:"<<N<<endl;   for(j=0;j<5;j+)   cout<<u24j<<'t'      cout<<endl;for(j=0;j<5;j+)   cout<<u23j<<'t'      cou

27、t<<endl;for(j=0;j<5;j+)   cout<<u22j<<'t'      cout<<endl;for(j=0;j<5;j+)   cout<<u21j<<'t'      cout<<endl;for(j=0;j<5;j+)   co

28、ut<<u20j<<'t'      cout<<endl;int finish()   double b;b=u2ij-u1ij;if(-e<b)&&(b<e)return 1;else return 0;int Nresult() doN+;for(i=1;i<4;i+)     for(j=1;j

29、<4;j+)     u1ij=u2ij;            for(j=1;j<4;j+) u21j=u11j+a/4*(u20j+u21j-1+u12j+u11j+1-4*u11j);        u1ij=u2ij;    for(j=1;j<4;j+) u22j=u12j+a/

30、4*(u21j+u22j-1+u13j+u12j+1-4*u12j);        u1ij=u2ij;    for(j=1;j<4;j+) u23j=u13j+a/4*(u22j+u23j-1+u14j+u13j+1-4*u13j);        u1ij=u2ij;while(finish()=0);return N; 程序四#include<iostream>

31、;#include<math.h>#include<iomanip>using namespace std;class cscddprivate:int m,n;double x,e;double *p,*q;public:int k;cscdd(int m0,int n0,double e0)int i;e=e0;k=0;m=m0;n=n0;p=new double *m;for( i=0;i<m;i+)pi=new

32、0;doublen;q=new double *m;for( i=0;i<m;i+)qi=new doublen;        if(m=n)     x=2/(1+sin(3.141592654/(m-1);else x=2-3.141592654*sqrt(2)*sqrt(1/(m-1)*(m-1)+1/(n-1)*(n-1);cout<<"最佳收敛因子:"<<x<

33、<endl;void bjtj();                    /赋边界条件void jishuan();                     /计

34、算void Diedai();                  /迭代函数void suchu();                   /输出部分;void  cscdd:bjtj()&

35、#160;                /赋边界条件int i,j; for(i=0;i<m;i+)                /边界条件for(j=0;j<n;j+)if(i=0)pij=100;   

36、0;qij=100;elsepij=0;qij=0;cout<<"初始点位:"<<endl;suchu();void cscdd:jishuan()                 /计算int i,j;int c=1;while(1)    c=1;    for(i=0;i<m;i+)     for(j=0;j<n;j+) 

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论