双网格法与误差估计问题:参数λ收敛率未达预期求助
带积分边界条件的一阶非线性奇异摄动参数化问题:参数λ收敛率不符合预期的排查
我正在编写Matlab代码求解带积分边界条件的一阶非线性奇异摄动参数化问题,已实现解u(x)的预期二次收敛阶,但参数λ未达到预期收敛效果。由于问题无精确解,采用双网格原理进行误差估计:
- 先在N=32时求解得到{u(x),λ},构造双网格求解得到{U,Λ},存储对应误差;
- 固定N=64重复上述步骤。
结果显示u的收敛率为二次,但λ的收敛率不符合预期,求排查操作错误。
附Matlab代码:
for r=1:1 epsln=2^(-2*r); for n=1:1 N=32*2^(n); %% Shishkin Mesh alph=2;%min. value of g_u sigm=min(0.5,2*(epsln/alph)*log(N));%Transition Point t=unique([linspace(0,sigm,N/2+1),linspace(sigm,1,N/2+1)]); h=diff(t);%step-size % Initial Solution u=1-t.^2; l=-0.4; %% Iterated Solution errU=1; errL=1; iter=1; while (errU > Tol || errL>Tol) [U,l_new]=Solution_Fun_ex1_Kudu(N,t,u,h,l,epsln); errU=max(abs(u-U)); errL=abs(l-l_new); u=U; l=l_new; iter=iter+1; end iter; %Final Solution is stored in [u,l] %%Doublemesh Function z=Doublemesh_Fun_kudu(t,N); hh=diff(z); %Initial Solution y=1-z.^2; ll=-0.4; %%Iterated Solution errY=1; errLd=1; iterr=1; while (errY>Tol || errLd>Tol) [Y,ll_new]=Solution_Fun_ex1_Kudu(2*N,z,y,hh,ll,epsln); errY=max(abs(y-Y)); errLd=abs(ll-ll_new); y=Y; ll=ll_new; iterr=iterr+1; end %Final Double mesh Solution is stored in [y,ll] %%Calculating Errors Err=zeros(1,N+1); for i=1:N+1 Err(i)=abs(u(i)-y(2*i-1)); end E(r,n)=max(Err); E_l(r,n)=abs(l-ll); %%Calculating Rate of Convergence if n>1 R(r,n-1)=log(E(r,n-1)/E(r,n))/log(2); R_l(r,n-1)=log(E_l(r,n-1)/E_l(r,n))/log(2); end Meshpoints(n)=N; end Val_epsln(r)=epsln; end
可能的错误排查点
- 收敛率计算样本缺失:代码中
n的循环仅执行1次(n=1),if n>1分支从未触发,无法计算相邻网格的收敛率。需要至少运行N=32、64、128三组数据,才能得到有效的λ收敛率。 - 细网格λ初始值未利用粗网格结果:求解细网格时,λ的初始值固定为
ll=-0.4,而非粗网格得到的l。这会导致迭代收敛效率低,甚至可能收敛到精度不足的解,影响误差估计。 - 双网格构造方式不合理:当前通过
Doublemesh_Fun_kudu直接加密粗网格,但Shishkin网格的过渡点sigm是依赖网格规模N的。细网格应重新基于2N计算过渡点生成,而非直接加密粗网格,否则边界层附近的网格精度不匹配,会影响λ的计算(λ对边界层区域的解敏感)。 - λ的误差估计逻辑可能有误:λ通常由积分边界条件定义,其误差不仅取决于粗/细网格解的差,还需要考虑积分在不同网格上的精度差异。直接取
abs(l-ll)可能无法准确反映λ的真实误差,需结合积分项的误差分析。 - 迭代终止条件的一致性:需确认粗、细网格的迭代终止阈值
Tol是否一致,且是否足够小。若Tol过大,会导致λ的迭代解精度不足,无法支撑收敛率计算。
内容的提问来源于stack exchange,提问作者Shashikant Maurya
相关产品推荐
相关产品推荐

