我在练习考试中有以下问题:
我需要使用MATLAB来解决它。问题是,我之前没有看到这样的问题而且我很难开始。
我有1x1网格,分成10x10。我知道我可以使用1/10 * x * 2计算角落以外的整个底行。我也知道我可以使用(1/10)(1 + t)^ 2计算整个右行。但是,我无法弄清楚如何获得足够的分数来填充整个网格的值。我知道它必须与问题中给出的偏导数有关,但我不太确定它们在哪里发挥作用(尤其是u_x方程)。有人可以帮助我从这里开始吗?
我不需要整个解决方案。一旦我有足够的积分,我就可以轻松编写一个matlab程序来解决剩下的问题。真的,我想我只需要解决x = 0轴,然后我就填写网格的中间部分。
我计算了底行,减去两个角,为0.001,0.004,0.009,0.016,0.025,0.036,0.049,0.064,0.081。类似地,使用给定的边界条件计算整个右行是很简单的。我无法拼凑到哪里去。
编辑:第三个边界条件方程输入错误。它应该是:
u_x(0,t)= 1 / 5t,NOT u(0,t)= 1 / 5t
答案 0 :(得分:1)
首先要意识到你必须解决的方程是线性波方程,你给出的数值方案可以改写为
( u^(n+1)_m - 2u^n_m + u^(n-1)_m )/k^2 = ( u^n_(m-1) - 2u^n_m + u^n_(m+1) )/h^2
其中k
是时间步长,h
是空间中的delta x
。
重新拟定的数值方案清楚地表明,左侧和右侧分别是u_tt
和u_xx
的二阶中心有限差分近似。
然而,要以数字方式解决问题,您需要使用给定的表单,因为它是您需要以数字方式实现的显式更新公式:它为您提供时间n+1
处的解决方案作为函数的函数前两次n
和n-1
。您需要从初始条件开始并及时推进解决方案。
观察解决方案已分配在域的边界(x=0
和x=1
),因此离散化解决方案的值u^(n)_0
和{任何u^(n)_10
(n
){1}} 已知。在t=n*k
时间步,您的未知数是向量n
。
另请注意,要使用更新公式在[u^(n+1)_1, u^(n+1)_2, ..., u^(n+1)_9]
步骤中查找解决方案,需要了解两个之前步骤中的解决方案。那么,如果您以前需要来自两个的信息,如何从n+1
开始?这是初始条件发挥作用的地方。
您可以在n=0
(n=0
)获得解决方案,但t=0
也有u_t
。这两条信息的组合可以为您提供t=0
和u^0
,让您入门。
我会使用以下启动方案:
u^1
与u^0_m = u(h*m,0) // initial condition on u
(u^2_m - u^0_m)/(2k) = u_t(h*m,0) // initial condition on u_t
使用的数值方案相结合,为n=1
提供了为u^1_m
和u^2_m
定义线性系统所需的一切。
总结:
- 使用启动方案同时在m=1,...,9
和n=1
找到解决方案。
- 从那时开始使用你给出的数值方案。
如果你完全迷失了,请查看:有限差分格式,平流方程的有限差分格式,双曲线方程的有限差分格式,时间推进等。
编辑:
对于n=2
上的边界条件,您通常使用 ghost单元格方法:
在u_x
处引入一个鬼影单元,即用于处理边界条件的虚拟(或辅助)网格点,但这不是解决方案的一部分。
第一个节点m=-1
又回到了您的未知向量中,即您正在使用m=0
。
使用左侧边界条件关闭系统。 具体来说,通过记下边界条件的居中近似值
[u_0 u_1 ... u_9]
上面的等式允许您根据内部实节点上的解决方案在ghost节点上表达解决方案。因此,您可以将时间推进的数值方案(您给出的方案)应用于u^n_(1) - u^n_(-1) = 2*h*u_x(0,k*n)
节点。 (应用于m=0
的数值方案将包含来自m=0
ghost节点的贡献,但现在您已根据m=-1
节点表示。)