超松弛迭代法求解接地金属槽内电位分布文档格式.docx
- 文档编号:18318342
- 上传时间:2022-12-15
- 格式:DOCX
- 页数:20
- 大小:148.94KB
超松弛迭代法求解接地金属槽内电位分布文档格式.docx
《超松弛迭代法求解接地金属槽内电位分布文档格式.docx》由会员分享,可在线阅读,更多相关《超松弛迭代法求解接地金属槽内电位分布文档格式.docx(20页珍藏版)》请在冰豆网上搜索。
intm,n;
doublex,e;
double**p,**q;
public:
intk;
overrei(intm0,intn0,doublee0)
{
inti;
e=e0;
k=0;
m=m0;
n=n0;
p=newdouble*[m];
for(i=0;
i<
m;
i++)
p[i]=newdouble[n];
q=newdouble*[m];
//迭代因子求解
q[i]=newdouble[n];
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<
endl;
}
voidInitialization();
//赋边界条件
voidCal();
//计算
voidDiedai();
//迭代函数
voidShow();
//输出部分
};
voidoverrei:
:
Initialization()//赋边界条件
inti,j;
for(i=0;
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;
}
初始点位:
Show();
}
Cal()//计算
intc=1;
while
(1)
c=1;
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();
Diedai()//迭代函数
doubley=x/4;
if(k%2)
for(i=1;
m-1;
for(j=1;
n-1;
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
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++;
Show()//输出部分
inti,j;
cout<
setw(12)<
setprecision(6)<
fixed<
q[i][j]<
ends;
intmain()
cout<
**************************************"
超松弛迭代法求解接地金属槽内电位的分布"
overreiA(5,5,1e-5);
A.Initialization();
A.Cal();
电位分布:
A.Show();
迭代次数:
A.k<
return0;
实验二按对称场差分格式求解电位的分布
只计算一半的区域,对另一半进行对称性计算,减小计算量。
选取二维数组,同样是两个数组a[41][41]、b[41][41],分别用于表示迭代前后的取值。
由此对第20列进行特殊处理。
即第21列是和第20列相等的,因为在第21列上标注了"
∂Φ/∂x=0,即要求每次迭后都要求u1[i][20]=u1[i][19],其余则同前。
当计算出了前21列的电位值时,根据对称性可得到右半边的电位值,即要求u1[i][40-j]=u1[i][j];
,直接赋值。
四周的电位值依旧保持不变,不能够参与迭代。
并且中间对称列上的电位值为零,故也不参与迭代。
由题意可知,只有第1列到第20列参与迭代。
在进行精度计算时,用数组b的值与相应数组a里的值进行比较,没迭代一次都要进行比较。
如果在误差允许的范围内,则继续迭代;
当超过误差标准的时候则停止迭代。
依旧按照比较得到最少收敛次数的方法在程序中计算出最佳收敛因子。
然后对对称列右边的点进行对称赋值。
最后输出输出最佳迭代因子、迭代的次数和迭代后各相应点的电位值。
二.源程序代码
iostream.h>
iomanip.h>
void
main()
{
double
u1[41][41],u2[41][41];
int
flag=10000,i,j,e,n;
a,d;
//a最佳加速收敛因子
for(j=0;
41;
j++)
u1[0][j]=100;
u1[40][j]=0;
}
for(i=1;
40;
i++)
u1[i][0]=0;
u1[i][40]=0;
//内部点赋初值
for(j=1;
21;
u1[i][j]=2.5*(j-1);
cout<
迭代前左半区域各电位点上的初始值:
for(i=0;
u1[i][j]<
;
//输出迭代初值
endl<
\n"
for(d=1;
d<
2;
d+=0.01)//取迭代次数最少的加速收敛因子
n=0;
do//迭代x次
22;
u2[i][j]=u1[i][j];
20;
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]);
u1[i][20]=u1[i][19];
i++)//判断精度
if(fabs(u1[i][j]-u2[i][j])>
1e-5)
e=1;
else
e=0;
if(e==1)
n++;
//迭代次数
}while(e);
if(n<
flag)
flag=n;
a=d;
i++)//对其对称点赋值
u1[i][40-j]=u1[i][j];
迭代后各节点上最终电位近似值:
setiosflags(ios:
fixed)<
setprecision(5)<
setw(8)<
//对齐输出
收敛因子:
a<
flag<
三.程序运行界面及结果
附录:
程序一:
voidmain()
{
doublem[5][5],n[5][5];
intN=0,b=1;
doublee=0.00001;
doublea=2/(1+sin(3.1415926/4));
=4;
m[i][j]=0;
n[i][j]=0;
m[1][4]=100;
m[2][4]=100;
m[3][4]=100;
n[1][4]=100;
n[2][4]=100;
n[3][4]=100;
for(j=4;
j>
=0;
j--)
m["
]["
]"
="
m[i][j]<
'
\t'
while(b=1)
b=0;
N=N+1;
=3;
for(j=1;
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;
if(fabs(m[i][j]-n[i][j])>
=e)
b=1;
n[i][j]=m[i][j];
cunt<
N="
N<
程序二:
x=2/(1+sin(3.141592653/(m-1)));
x=2-3.141592653*sqrt
(2)*sqrt(1/((m-1)*(m-1))+1/((n-1)*(n-1)));
Initialization()
//边界条件
voidoverrei:
Cal()
e)
Diedai()
Show()
overreiA(5,5,1e-6);
程序三
#include
i,j,N=0;
//N为迭代次数
u1[5][5];
//定义电位
u2[5][5];
e=0.00001;
//误差范围
a=1.5;
//加速收敛因子
finish();
//迭代结束函数
Nresult();
//求解迭代次数
print();
if(i==4){
5;
u1[i][j]=100;
}//边界值
u1[i][j]=0;
N=Nresult();
print()
迭代次数为:
{cout<
u2[4][j]<
u2[3][j]<
u2[2][j]<
u2[1][j]<
u2[0][j]<
finish()
b;
b=u2[i][j]-u1[i][j];
if((-e<
b)&
(b<
e))
return
1;
0;
Nresult()
do{N++;
4;
u1[i][j]=u2[i][j];
{u2[1][j]=u1[1][j]+a/4*(u2[0][j]+u2[1][j-1]+u1[2][j]+u1[1][j+1]-4*u1[1][j]);
{u2[2][j]=u1[2][j]+a/4*(u2[1][j]+u2[2][j-1]+u1[3][j]+u1[2][j+1]-4*u1[2][j]);
{u2[3][j]=u1[3][j]+a/4*(u2[2][j]+u2[3][j-1]+u1[4][j]+u1[3][j+1]-4*u1[3][j]);
}while(finish()==0);
N;
}
程序四
using
namespace
std;
class
cscdd
m,n;
x,e;
**p,**q;
k;
cscdd(int
m0,int
n0,double
e0)
i;
e=e0;
k=0;
m=m0;
n=n0;
p=new
*[m];
for(
i=0;
p[i]=new
double[n];
q=new
q[i]=new
x=2/(1+sin(3.141592654/(m-1)));
x=2-3.141592654*sqrt
(2)*sqrt(1/((m-1)*(m-1))+1/((n-1)*(n-1)));
bjtj();
//赋边界条件
jishuan();
//计算
Diedai();
//迭代函数
suchu();
//输出部分
cscdd:
bjtj()
i,j;
//边界条件
if(i==0)
p[i][j]=100;
q[i][j]=100;
else
p[i][j]=0;
q[i][j]=0;
endl
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 松弛 迭代法 求解 接地 金属 电位 分布