关于Godunov格式实现非线性LWR型方程的正确性咨询
看起来你对Godunov格式应用在LWR方程上的思路已经找对了方向,不过咱们可以仔细捋一捋你给出的通量定义是否完全准确——毕竟Godunov格式的核心就是Riemann问题的数值通量求解,这部分容不得半点马虎。
首先明确基础:你要解的LWR方程通量函数是$f(u)=u(1-u)$,这是一个凹函数(二阶导数$f''(u)=-2<0$),它的最大值出现在$u=1/2$处,对应通量值为$1/4$,这是分析所有情况的关键。你的时间更新步公式是完全正确的,初始条件取空间单元的平均值也是Godunov格式标准的初始离散方式,这两点没问题。
接下来重点说你定义的通量$F^n_j$:
第一种情况:$u_j^n \leq u_{j+1}^n$(稀疏波场景)
你取$\min\left{f(u_j^n), f(u_{j+1}^n)\right}$,这个只在部分子场景成立:- 如果$u_j^n \leq u_{j+1}^n \leq 1/2$:此时$f(u)$是递增函数,特征速度$f'(u)=1-2u>0$,稀疏波向右传播,x=0处的状态就是左单元的$u_jn$,通量取$f(u_jn)$,这时候$\min$刚好等于$f(u_j^n)$,是对的;
- 如果$1/2 \leq u_j^n \leq u_{j+1}n$:此时$f(u)$是递减函数,特征速度$f'(u)=1-2u<0$,稀疏波向左传播,x=0处的状态是右单元的$u_{j+1}n$,通量取$f(u_{j+1}n)$,这时候$\min$也刚好等于$f(u_{j+1}n)$,也是对的;
- 但如果$u_j^n < 1/2 < u_{j+1}n$:稀疏波会经过通量的最大值点,此时x=0处的状态是$u=1/2$,对应通量应该是$1/4$,而你取的$\min\left{f(u_jn), f(u_{j+1}^n)\right}$肯定小于$1/4$(因为$f(u)$在$u=1/2$处最大),这就出错了。
第二种情况:$u_{j+1}^n < u_jn$且$u_jn>1/2$(激波场景)
你直接取$1/4$是不对的。激波的通量要通过Rankine-Hugoniot条件计算激波速度$s=\frac{f(u_jn)-f(u_{j+1}n)}{u_jn-u_{j+1}n}=1-(u_jn+u_{j+1}n)$:- 如果$s\geq0$(即$u_jn+u_{j+1}n \leq1$):激波向右传播,x=0处的状态是左单元的$u_jn$,通量取$f(u_jn)$;
- 如果$s<0$(即$u_jn+u_{j+1}n>1$):激波向左传播,x=0处的状态是右单元的$u_{j+1}n$,通量取$f(u_{j+1}n)$;
- 只有当$s=0$($u_jn+u_{j+1}n=1$)时,通量才等于$1/4$,这只是特殊情况,不能直接覆盖所有$u_j^n>1/2$的激波场景。
第三种情况:$u_{j+1}^n < u_j^n < 1/2$(激波场景)
这部分你是对的:此时$f(u)$递增,特征速度$f'(u)>0$,激波速度$s=1-(u_jn+u_{j+1}n)$,因为$u_jn$和$u_{j+1}n$都小于$1/2$,所以$u_jn+u_{j+1}n<1$,$s>0$,激波向右传播,x=0处取左单元状态,通量为$f(u_j^n)$,和你定义的一致。
最后给你整理一下正确的Godunov通量定义,针对LWR方程的$f(u)=u(1-u)$:
对于左状态$u_L=u_jn$,右状态$u_R=u_{j+1}n$:
- 当$u_L \leq u_R$:
- 若$u_R \leq 1/2$:$F=f(u_L)$
- 若$u_L \geq 1/2$:$F=f(u_R)$
- 若$u_L < 1/2 < u_R$:$F=1/4$
- 当$u_L > u_R$:
- 计算激波速度$s=1-(u_L+u_R)$
- 若$s \geq 0$:$F=f(u_L)$
- 若$s < 0$:$F=f(u_R)$
这样就能覆盖所有场景啦,你可以根据这个调整你的通量计算逻辑~
备注:内容来源于stack exchange,提问作者math_is_fun

