非线性热导方程的数值解

计算科学 有限差分 非线性方程 数学 微分方程
2021-12-14 17:39:40

我必须找到并绘制以下方程的数值解(我必须编写一个求解器):

ut=(u2ux)x
符合以下条件u(0,t)=0,u(1,t)=2c2t,u(x,0)=0, 在哪里c是波的速度

我尝试使用以下方法:

umn+1umnτ=Fm+1/2nFm1/2nh
在哪里
Fm+1/2n=(um+1/2n)2(um+1num1nh)
在哪里
um+1/2n=um+1n+umn2

tt = 0.1;

tnn = 10000;

xnn = 20;

tau = tt/tnn;

h = 1/xnn;

u0[x_] := x;

Do[v[m, 0] = u0[h*m], {m, 0, xnn}]

Do[v[0, n] = 0; v[xnn, n] = 0;
 Do[v[m, n + 1] = 

v[m, n] + tau/h*( ((v[m + 1, n] - v[m, n])/h) (((v[m + 1, n])^2 + (v [m, n])^2)/ 2) - ((v[m, n] - v[m - 1, n])/h) (((v[m, n])^2 + (v[ m - 1, n])^2)/2) ), {m, 1, xnn - 1}], {n, 0, tnn - 1}]

u = ListInterpolation[
   Table[v[i, j], {i, 0, xnn}, {j, 0, tnn}], {{0, 1}, {0, tt}}];

Plot3D[u[x, t], {x, 0, 1}, {t, 0, tt}, PlotRange -> All]

我已经更改了代码并得到了正确的解决方案,但是对于 u(0,t)=u(1,t) = 0,u(x,0) = f(x)。我实际上不明白我应该如何编写像 u(1,t) = f(t) 这样的条件。

1个回答

您在评论中得到了很好的建议,但由于它只是一维问题,您可以使用完全显式的方法以非常小的时间步长来管理它。我在 Mathematica 中检查了你的代码,那里有几个误解。更正它们后,代码对我有用。

同样,我想您在问题中的描述包含一些错误。因为我猜这是一些学生项目,所以让我只指出应该更正的内容;-)。

您在问题中的方法可以被视为计算单元的有限体积方法(xm1/2,xm+1/2). 数量Fm+1/2n近似于正确点的通量,你的问题中的近似是不合适的,检查一下,它应该使用所谓的点中心差xm+1/2. 类似地,非线性电导系数um+1/2nxm+1/2被不恰当地近似。

无论如何,您的代码都没有实现您在问题中描述的内容。所以,检查方案并准确实施,我想你的代码可以工作。

请注意模型的正确输入数据。在您的实现中,您使用问题中描述的不同边界和初始条件。

我希望在这些迹象之后你能够完成任务,祝你好运!