如何使用 MATLAB 求解此 PDE
How do I use MATLAB to solve this PDE
我在模拟考试中有以下问题:
我需要用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,不是 u(0,t) = 1/5t
首先认识到你要解的方程是线性波动方程,给你的数值方案可以改写为
( 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
是 space 中的 delta x
。
重新制定的数值方案清楚地表明,左侧和右侧是二阶中心有限差分逼近u_tt
和u_xx
分别。
但是,要用数值方法解决问题,您需要使用给定的形式,因为它是您需要用数值方法实现的显式更新公式:它在时间 n+1
给您解决方案作为前两次n
和n-1
的函数。您需要从初始条件开始,及时推进解决方案。
观察到在域(x=0
和 x=1
)的边界上 分配了 解,因此离散化解的值 [=对于任何 n
(t=n*k
),22=] 和 u^(n)_10
是 已知的 。在第 n
个时间步,您的未知数是向量 [u^(n+1)_1, u^(n+1)_2, ..., u^(n+1)_9]
。
还请注意,要使用更新公式在 n+1
步找到解决方案,需要了解前 两个 步的解决方案。那么,如果你需要之前两次的信息,你如何从n=0
开始呢?这是初始条件发挥作用的地方。
您在 n=0
(t=0
) 处有解决方案,但在 t=0
处也有 u_t
。结合这两条信息可以为您提供 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
同时求解.
--从那里开始,使用给定的数字方案及时行进。
如果您完全迷失了方向,请查看以下内容:有限差分格式、平流方程的有限差分格式、双曲方程的有限差分格式、时间推进。
正在编辑:
对于 u_x
上的边界条件,您通常使用 ghost cell 方法:
在m=-1
处引入一个幻影单元,即用于处理边界条件的虚拟(或辅助)网格点,但这不是解决方案的一部分。
第一个节点 m=0
返回到您的未知向量中,即您现在正在使用 [u_0 u_1 ... u_9]
.
使用左侧边界条件关闭系统。
具体来说,通过写下边界条件的中心近似值
u^n_(1) - u^n_(-1) = 2*h*u_x(0,k*n)
上面的等式允许您用内部真实节点上的解决方案来表达幽灵节点上的解决方案。因此,您可以将时间推进数字方案(给定的方案)应用于 m=0
节点。 (应用于 m=0
的数字方案将包含来自 m=-1
幽灵节点的贡献,但现在您可以用 m=1
节点表示。)
我在模拟考试中有以下问题:
我需要用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,不是 u(0,t) = 1/5t
首先认识到你要解的方程是线性波动方程,给你的数值方案可以改写为
( 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
是 space 中的 delta x
。
重新制定的数值方案清楚地表明,左侧和右侧是二阶中心有限差分逼近u_tt
和u_xx
分别。
但是,要用数值方法解决问题,您需要使用给定的形式,因为它是您需要用数值方法实现的显式更新公式:它在时间 n+1
给您解决方案作为前两次n
和n-1
的函数。您需要从初始条件开始,及时推进解决方案。
观察到在域(x=0
和 x=1
)的边界上 分配了 解,因此离散化解的值 [=对于任何 n
(t=n*k
),22=] 和 u^(n)_10
是 已知的 。在第 n
个时间步,您的未知数是向量 [u^(n+1)_1, u^(n+1)_2, ..., u^(n+1)_9]
。
还请注意,要使用更新公式在 n+1
步找到解决方案,需要了解前 两个 步的解决方案。那么,如果你需要之前两次的信息,你如何从n=0
开始呢?这是初始条件发挥作用的地方。
您在 n=0
(t=0
) 处有解决方案,但在 t=0
处也有 u_t
。结合这两条信息可以为您提供 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
同时求解.
--从那里开始,使用给定的数字方案及时行进。
如果您完全迷失了方向,请查看以下内容:有限差分格式、平流方程的有限差分格式、双曲方程的有限差分格式、时间推进。
正在编辑:
对于 u_x
上的边界条件,您通常使用 ghost cell 方法:
在
m=-1
处引入一个幻影单元,即用于处理边界条件的虚拟(或辅助)网格点,但这不是解决方案的一部分。第一个节点
m=0
返回到您的未知向量中,即您现在正在使用[u_0 u_1 ... u_9]
.使用左侧边界条件关闭系统。 具体来说,通过写下边界条件的中心近似值
u^n_(1) - u^n_(-1) = 2*h*u_x(0,k*n)
上面的等式允许您用内部真实节点上的解决方案来表达幽灵节点上的解决方案。因此,您可以将时间推进数字方案(给定的方案)应用于
m=0
节点。 (应用于m=0
的数字方案将包含来自m=-1
幽灵节点的贡献,但现在您可以用m=1
节点表示。)