泊松方程的多重网格法(两层)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
求解Poisson 方程
y x y
x cos sin 2222=∂∂+∂∂ψψ, 10≤≤x ,10≤≤y ,
0|0==x ψ,y x ==1|ψ2cos 1sin y -
, 0|y ψ==2sin x -
,x y ==1|ψ2
1cos sin x -, :PDE L n n ψ=f ψ=ψ+w ψw 其中为近似解,为误差 L L L L ⇒+=⇒=-=n n ψw f w f ψR
离散n ψw 和⎧⇒⎨⎩A ψ=Bf Aw =BR
误差和原函数满足相同的PDE
本题使用简单的二层网格粗网格修正格式V 循环来求解,具体可分为4个步骤:
(1) 在细网格上迭代求解
L =ψf
迭代1υ步后,计算所得近似值n
ψ的残差(n 表示在细网格上) n n n n L =-γf ψ
(2) 在粗网格上精确求解误差方程(2n 表示在粗网格上)
222n n n n n L =w I γ
(3) 进行粗网格修正
22n n n n n ←+ψψI w
(4) 然后回到(1),以新的n
ψ为初值,开始下一个V 循环,直到达到一定的收敛标准为止。
上述循环叫做二层网格V 循环。
2n
n I 是把细网格上的残差限制到粗网格上的算子,称之为“限制算子”。
2
n n I 是把粗网格上的结果差值到细网格上的算子,称之为“差值算子”。
下面是C++代码
//多重网格法求解泊松方程
void CFDtest::solveByMG(Matrix &psi,Matrix f)//多重网格法
{
double step3 = step2 * boBox_stepRatio->currentText().toInt();
int n1 = (int)(1.0/step2+0.5);
int n2 = (int)(1.0/step3+0.5);
Matrix gama1(n1,n1);//细网格残差
Matrix w(n2+1,n2+1);//粗网格节点误差
Matrix psi_old(psi);
bool isOK = false;
bool isOK2 = false;
while (!isOK)
{
//细网格上G-S迭代3步
for (int k=0;k<3;k++)
{
isOK = true;
intNum++;
for (int i=1;i<n1;i++)
{
for (int j=1;j<n1;j++)
{
double old_data = psi[i][j];
psi[i][j] = 0.25*(psi[i-1][j] + psi[i+1][j] + psi[i][j-1] + psi[i][j+1] - step2*step2*f[i][j]);
if (abs(psi[i][j] - old_data) > intError)
{
isOK = false;
}
}
if (isOK)//如果达到允许误差范围,跳出for循环
{
break;
}
}
}。