求解Poisson方程yxyxcossin2222,10x,10y,0|0x,yx1|2cos1siny,0|y2sinx,xy1|21cossinx,:PDELnnψ=fψ=ψ+wψw其中为近似解,为误差LLLLnnψwfwfψR离散nψw和Aψ=BfAw=BR误差和原函数满足相同的PDE本题使用简单的二层网格粗网格修正格式V循环来求解,具体可分为4个步骤:(1)在细网格上迭代求解Lψf迭代1步后,计算所得近似值nψ的残差(n表示在细网格上)nnnnLγfψ(2)在粗网格上精确求解误差方程(2n表示在粗网格上)222nnnnnLwIγ(3)进行粗网格修正22nnnnnψψIw(4)然后回到(1),以新的nψ为初值,开始下一个V循环,直到达到一定的收敛标准为止。上述循环叫做二层网格V循环。2nnI是把细网格上的残差限制到粗网格上的算子,称之为“限制算子”。2nnI是把粗网格上的结果差值到细网格上的算子,称之为“差值算子”。下面是C++代码//多重网格法求解泊松方程voidCFDtest::solveByMG(Matrix&psi,Matrixf)//多重网格法{doublestep3=step2*ui.comboBox_stepRatio-currentText().toInt();intn1=(int)(1.0/step2+0.5);intn2=(int)(1.0/step3+0.5);Matrixgama1(n1,n1);//细网格残差Matrixw(n2+1,n2+1);//粗网格节点误差Matrixpsi_old(psi);boolisOK=false;boolisOK2=false;while(!isOK){//细网格上G-S迭代3步for(intk=0;k3;k++){isOK=true;intNum++;for(inti=1;in1;i++){for(intj=1;jn1;j++){doubleold_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;}}}