前言
之前关于森林火灾蔓延模型小伙伴们反响都还不错,今天我们对海啸进行数学建模。
在文章初始,先喂自己袋盐。
以下是博主精心整理的两个matlab专栏,包含入门到精通及实战内容,需要的小伙伴可根据自己需求自行订阅。
MATLAB-30天带你从入门到精通
https://blog.csdn.net/wenyusuran/category_10614422.html
MATLAB深入理解高级教程(附源码)
https://blog.csdn.net/wenyusuran/category_2239265.html
在博主的资源中也有各种算法的应用实例源代码,需要的小伙伴自取哟。
文中涉及到的代码地址如下:
matlab源码集锦-海啸传播模型
https://download.csdn.net/download/wenyusuran/16237225
地震的形成是地壳在地球内动力地质作用下,地壳相邻地块发生缓慢的相对位移,地壳岩石发生变形,岩石应变量随地块逐步位移而增大。当岩石应变量大于岩石所能承受的强度时,岩石发生破裂,岩石弹性变形迅速恢复。这时储存于岩石中的弹性变形能突然释放,便形成地震。弹性变形地壳突然位移引起其上水体扰动,则形成涌浪、海啸。所以,海啸和地震在空间分布和发生时间上存在着密切的联系,破坏型海啸自然多分布在地震带上。
我们现在都非常清楚海啸是从深海开始的水波,通常是因为水下地震(虽然海啸也可能是由水下滑坡或火山造成的),然后向海岸传播。最初,海啸的振幅相对较小(典型的是一米左右),这似乎使它们像风浪一样无害。事实上,海啸经常在深海中通过船只,甚至没有人注意到。
海啸传播方式
由于海啸波的传播速度与海水深度的平方根有关,其传播速度降低到每小时几十公里,前进受到阻挡,就会形成十几米和几十米的浪高,冲向陆地.这种波长极长、速度极快的海啸波,一旦从深海到达了岸边,前进受到了阻挡,其全部的巨大能量,将变为巨大的破坏力量,摧毁一切可以摧毁的东西,造成巨大的灾难。
海啸是像地震一样大的事件,海啸的波长很大 - 典型的是200公里(与风浪相反,其波长通常接近100米)。特别是,海啸的波长远远大于海洋的深度(通常为2-3公里)。因此,即使在深海中,海啸的动态也基本上由浅水方程控制。这些方程的一个结果是海啸的传播速度,可以用公式近似:
是海洋的深度,是重力。因此,深水中的海啸移动速度非常快 - 例如每小时500公里(每小时300英里)的速度是非常典型的; 例如,在不到一天的时间内就可以从日本旅行到美国。这是由于水的不可压缩性(和质量守恒); 非常宽和深的水波的巨大净压力(或者更准确地说,这种压力的空间变化)迫使波浪的轮廓以很大的速度水平移动。(注意,这是海啸波的相速度,而不是水分子本身的速度,它们要慢得多。)
当海啸接近海岸时,深度当然会减少,导致海啸减速,速度与深度的平方根成正比,如(1)所示。不幸的是,波浪浅滩然后迫使振幅以由格林定律控制的反向速率增加,
至少直到幅度变得与水深相当(此时,上述近似结果会被破坏;同样,在两个(水平)空间维度中,当海啸向外扩散时,振幅会有一些衰减)。如果假设海啸开始,其初始振幅,处于深度,用比例关系计算振幅和深度,得海啸的振幅(和水的深度)。因此,例如,在2公里深度处初始幅度为1米的海啸最终可以在岸边附近达到约5米的最终幅度,同时仍然以每秒约10米的速度行进(每小时35公里,或22每小时英里数),我们现在就看到了当它到达岸边时可能产生的影响。
虽然海啸太大而无法控制(至少在深海),但我们至少可以在数学上对它们进行建模,从而可以高精度地预测它们在沿海各个地方的影响。用于执行此类模型的完整方程式和数值方法有些复杂,但是通过大量的简化假设,就相对容易地得出一个已经预测了海啸传播基本特征的粗糙模型,如速度公式(1)和幅度比例法(2)。我在下面给出了这个(标准)推导。这个论点在很大程度上是启发式的; 实际上,下面的许多步骤都是非常有趣的分析问题,我们这里不做讨论。
浅水波方程
当然,海洋是一种三维流体,但为了简化分析,我们将考虑一个二维模型,其中唯一的空间变量是水平变量和垂直变量,其中是平衡海平面。我们用曲线模拟海底
因此海洋深度的测量位置。在任何时间和位置,水的高度(与海平面相比)将由未知的高度函数给出; 因此,在任何时候,海洋都占据了该地区
现在,我们通过在每个时间和海洋中的每个点分配速度矢量来模拟海洋内水的运动
我们做了不可压缩性的基本假设,因此水的密度始终是恒定的。
根据牛顿第二定律,速度随时间而变化。为了将此定律应用于流体,我们考虑沿着速度场流动的无穷小量的水。因此,在时间上,我们假设这个水量占据了我们所拥有的某些无限小的区域和某个位置
由于不可压缩性,该区域保持不变,并且该无限小部分水的质量为。这个水体上会有两股力量; 重力和压力场的力,由压力场给出。在海啸的长度和时间尺度上,我们可以忽略其他力量的影响,如粘度或表面张力。然后牛顿定律给出了
这简化了不可压缩的欧拉方程
目前,没有给出压力。然而,我们可以通过假设(垂直)流体静力平衡来简化事物,即压力的垂直效应抵消了重力的影响。我们还假设水面上的压力为零。总之,这两个假设迫使压力成为静水压力
这反映了一个直观合理的事实,即海洋下一点的压力应该由该点以上的水的重量决定。
不可压缩的欧拉方程现在简化为
接下来我们将浅水近似表明水的波长远大于水的深度。特别是,我们不期望变量中的速度场发生显着变化,从而使ansatz成为可能
(这个ansatz应该用一粒盐,特别是当应用于速度的分量时,实际上必须波动以适应海洋深度和高度函数的变化。但是,主要成分是速度是水平分量,在实际海啸中,这确实表现为垂直不敏感。)
取的组分(4) ,和缩写为,我们得到第一浅水波方程
这在泰勒扩展到第二个浅水波方程后简化了
等式(6),(7)在未知数中是非线性的。然而,通过假设波的幅度与水的深度相比较小,可以近似线性化它们:
这个假设对于深海中的海啸,甚至是中等深度的海啸都是相当准确的,但是一旦海啸到达海岸(动力学模型更难以模拟),当然是不合理的。
假设(11)已经简化(7)到(近似)
至于(6),我们认为左侧的第二个词可以忽略不计,导致
为了解释为什么是启发式,我们希望这是情况,让我们做的是拟设,并有幅度,分别是传播相速度和波长; 让我们也做出(合理的)假设,即空间变化比变化慢得多(即在波长范围内大致恒定),因此我们可以(对于第一次近似)替换为。然后我们有
然后联立等式(12)
从(11)我们期望,因此; 波的传播速度比流体的速度快得多。特别是,我们预计会比小得多,这就解释了为什么我们希望在(6)中第二个任期减少以获得(13)。
如果我们现在将上述ansatz插入(13),我们就得到了
将其与(14)相结合,我们已经得到了速度关系(1)。
为了得到关系(2),我们必须更仔细地分析ansatz。首先,我们将(13)和(12)组合成高度函数的单个方程。实际上,在时间上区分(12)然后在(13)和(1)中代入
为了解决这个波动方程,我们使用标准的正弦曲线
是缓慢变化的功能,并且是一个小参数。插入此ansatz并提取项,我们得出了eikonal方程
和Hamilton-Jacobi方程
从eikonal方程我们看到它以速度传播。假设向右传播,我们就这样做了
对于Hamilton-Jacobi方程,我们使用特征方法来解决它。乘以等式,我们得到
插入(15)和,获得
这简化为
因此,我们看到它在特征上是不变的。在另一方面,区分(15)中,我们看到
因此也是不变的特征。我们看到这是不变的特征,导致比例关系
给出(2)。
源码
-
%Steven
McHale
-
%Tsunami
Model
-
%Shallow-Water
Wave
Equation
-
%Crank-Nicholson
Discretization
-
-
clear;
-
clf;
-
clc;
-
-
%
Constants
-
g
=
9.81
;
-
u0
=
0
;
-
v0
=
0
;
-
b
=
0
;
-
h0
=
5030
;
-
-
%
Define
the
x
domain
-
ni
=
151
;
-
xmax
=
100000
;
-
dx
=
xmax/(ni-1);
-
x
= [
0
:dx:xmax]
;
-
-
%
Define
the
y
domain
-
nj
=
151
;
-
ymax
=
100000
;
-
dy
=
ymax/(nj-1);
-
y
= [
0
:dy:ymax]
;
-
-
%
Define
the
wavespeed
-
wavespeed
=
u0
+
sqrt(g*(h0
-
b));
-
-
%
Define
time-domain
-
dt
=
0.68
*dx/wavespeed;
-
tmax
=
1500
;
-
%t
= [
0
:dt:tdomain]
;
-
t=[1:dt:tmax];
-
courant
=
wavespeed*dt/dx;
-
-
%
Build
empty
u,
v,
b
matrices
-
u=zeros(length(x),
length(y),
length(t));
-
v=zeros(length(x),
length(y),
length(t));
-
b=zeros(length(x),
length(y));
-
-
%
Define
h
-
h=zeros(length(x),
length(y),
length(t));
-
h(:,:,1)
=
5000
;
-
h((45000/100000*(length(x)-1)+1):floor(55000/100000*(length(x)-1)+1),(45000/100000*(length(y)-1)+1):floor(55000/100000*(length(y)-1)+1),1)
=
5030
;
-
-
%Define
b
-
for
i
=
1
:length(x)
-
if
x(i)
>
20001
-
b(:,i)
=
0
;
-
elseif
x(i)
<
20000
-
b(:,i)
=
5000
/20000*(20000-x(i));
-
end
-
end
-
-
%
Employ
Lax
-
for
n=1:(length(t)-1)
-
for
i=2:(ni-1)
-
for
j=2:(nj-1)
-
u(i,j,n+1)
=
((u(i+1,j,n)
+
u(i-1,j,n)
+
u(i,j+1,n)
+
u(i,j-1,n))/4)...
-
-
0.5
*(dt/dx)*((u(i+1,j,n)^2)/2
-
(u(i-1,j,n)^2)/2)...
-
-
0.5
*(dt/dy)*(v(i,j,n))*(u(i,j+1,n)
-
u(i,j-1,n))
-
0.5
*g*(dt/dx)*(h(i+1,j,n)-h(i-1,j,n));
-
-
v(i,j,n+1)
=
((v(i+1,j,n)
+
v(i-1,j,n)
+
v(i,j+1,n)
+
v(i,j-1,n))/4)...
-
-
0.5
*(dt/dy)*((v(i,j+1,n)^2)/2
-
(v(i,j+1,n)^2)/2)...
-
-
0.5
*(dt/dx)*(u(i,j,n))*(v(i+1,j,n)
-
v(i-1,j,n))
-
0.5
*g*(dt/dy)*(h(i,j+1,n)-h(i,j-1,n));
-
-
h(i,j,n+1)
=
((h(i+1,j,n)
+
h(i-1,j,n)
+
h(i,j+1,n)
+
h(i,j-1,n))/4)...
-
-
0.5
*(dt/dx)*(u(i,j,n))*((h(i+1,j,n)-b(i+1,j))
-
(h(i-1,j,n)-b(i-1,j)))...
-
-
0.5
*(dt/dy)*(v(i,j,n))*((h(i,j+1,n)-b(i,j+1))
-
(h(i,j-1,n)-b(i,j-1)))...
-
-
0.5
*(dt/dx)*(h(i,j,n)-b(i,j))*(u(i+1,j,n)-
u(i-1,j,n))...
-
-
0.5
*(dt/dy)*(h(i,j,n)-b(i,j))*(v(i,j+1,n)
-
v(i,j-1,n));
-
-
end
-
end
-
-
%
Define
Boundary
Conditions
-
u(1,:,n+1)
=
2.5
*u(2,:,n+1)
-
2
*u(3,:,n+1)
+
0.5
*u(4,:,n+1);
-
u(length(x),:,n+1)
=
2.5
*u(ni-1,:,n+1)
-
2
*u(ni-2,:,n+1)
+
0.5
*u(ni-3,:,n+1);
-
u(:,1,n+1)
=
2.5
*u(:,2,n+1)
-
2
*u(:,3,n+1)
+
0.5
*u(:,4,n+1);
-
u(:,length(y),n+1)
=
2.5
*u(:,nj-1,n+1)
-
2
*u(:,nj-2,n+1)
+
0.5
*u(:,nj-3,n+1);
-
-
v(1,:,n+1)
=
2.5
*v(2,:,n+1)
-
2
*v(3,:,n+1)
+
0.5
*v(4,:,n+1);
-
v(length(x),:,n+1)
=
2.5
*v(ni-1,:,n+1)
-
2
*v(ni-2,:,n+1)
+
0.5
*v(ni-3,:,n+1);
-
v(:,1,n+1)
=
2.5
*v(:,2,n+1)
-
2
*v(:,3,n+1)
+
0.5
*v(:,4,n+1);
-
v(:,length(y),n+1)
=
2.5
*v(:,nj-1,n+1)
-
2
*v(:,nj-2,n+1)
+
0.5
*v(:,nj-3,n+1);
-
-
h(1,:,n+1)
=
2.5
*h(2,:,n+1)
-
2
*h(3,:,n+1)
+
0.5
*h(4,:,n+1);
-
h(length(x),:,n+1)
=
2.5
*h(ni-1,:,n+1)
-
2
*h(ni-2,:,n+1)
+
0.5
*h(ni-3,:,n+1);
-
h(:,1,n+1)
=
2.5
*h(:,2,n+1)
-
2
*h(:,3,n+1)
+
0.5
*h(:,4,n+1);
-
h(:,length(y),n+1)
=
2.5
*h(:,nj-1,n+1)
-
2
*h(:,nj-2,n+1)
+
0.5
*h(:,nj-3,n+1);
-
-
end
-
-
figure(1)
-
-
%Animation
of
H
wave
propogating
-
for
index=1:length(t)
-
mesh(x,y,h(:,:,index))
-
axis
([0
100000
0
100000
4990
5010
])
-
title
('AERSP
423
Computer
Project
Part
II')
-
xlabel('X
Domain [
m]
')
-
ylabel('
Y
Domain [
m]
')
-
zlabel('
Height [
m]
')
-
pause(0.02)
-
end
-
转载:https://blog.csdn.net/wenyusuran/article/details/113879482