浅水波matlab实验

clf; 
% define the grid size 
n = 50; 
dt = 0.05; 
dx = 2; 
dy = 2; 
g = 9.8; 

H = ones(n+2,n+2);  % displacement matrix (this is what gets drawn) 
U = zeros(n+2,n+2); % x velocity 
V = zeros(n+2,n+2); % y velocity 

% draw the mesh 
grid = surf(H); 
axis([1 n 1 n 1 2]); 
hold all; 

% create initial displacement 
[x,y] = meshgrid( linspace(-3,3,10) ); 
R = sqrt(x.^2 + y.^2) + eps; 
Z = (sin(R)./R); 
Z = max(Z,0); 

% add displacement to the height matrix 
w = size(Z,1); 
i = 10:w+9; 
j = 20:w+19; 
H(i,j) = H(i,j) + Z; 

% empty matrix for half-step calculations 
Hx = zeros(n+1,n+1); 
Hy = zeros(n+1,n+1); 
Ux = zeros(n+1,n+1); 
Uy = zeros(n+1,n+1); 
Vx = zeros(n+1,n+1); 
Vy = zeros(n+1,n+1); 
while 1==1 
   % redraw the mesh 
   set(grid, 'zdata', H); 
   drawnow 

   % blending the edges keeps the function stable 
   H(:,1) = H(:,2); 
   H(:,n+2) = H(:,n+1); 
   H(1,:) = H(2,:); 
   H(n+2,:) = H(n+1,:); 

   % reverse direction at the x edges 
   U(1,:) = -U(2,:); 
   U(n+2,:) = -U(n+1,:); 

   % reverse direction at the y edges 
   V(:,1) = -V(:,2); 
   V(:,n+2) = -V(:,n+1); 

   % First half step 
   i = 1:n+1; 
   j = 1:n+1; 

   % height 
   Hx(i,j) = (H(i+1,j+1)+H(i,j+1))/2 - dt/(2*dx)*(U(i+1,j+1)-U(i,j+1)); 
   Hy(i,j) = (H(i+1,j+1)+H(i+1,j))/2 - dt/(2*dy)*(V(i+1,j+1)-V(i+1,j)); 

   % x momentum 

    Ux(i,j) = (U(i+1,j+1)+U(i,j+1))/2 - dt/(2*dx)*( U(i+1,j+1).^2./H(i+1,j+1) - U(i,j+1).^2./H(i,j+1) +g/2*H(i+1,j+1).^2 - g/2*H(i,j+1).^2  ); 
    Uy(i,j) = (U(i+1,j+1)+U(i+1,j))/2 -dt/(2*dy)*( (V(i+1,j+1).*U(i+1,j+1)./H(i+1,j+1)) - (V(i+1,j).*U(i+1,j)./H(i+1,j)) ); 

   % y momentum 
   Vx(i,j) = (V(i+1,j+1)+V(i,j+1))/2 -dt/(2*dx)*((U(i+1,j+1).*V(i+1,j+1)./H(i+1,j+1)) - (U(i,j+1).*V(i,j+1)./H(i,j+1))); 

   Vy(i,j) = (V(i+1,j+1)+V(i+1,j))/2 - dt/(2*dy)*((V(i+1,j+1).^2./H(i+1,j+1) + g/2*H(i+1,j+1).^2) -(V(i+1,j).^2./H(i+1,j) + g/2*H(i+1,j).^2)); 

   % Second half step 
   i = 2:n+1; 
   j = 2:n+1; 

    % height 
   H(i,j) = H(i,j) - (dt/dx)*(Ux(i,j-1)-Ux(i-1,j-1)) -(dt/dy)*(Vy(i-1,j)-Vy(i-1,j-1)); 
   % x momentum 
   U(i,j) = U(i,j) - (dt/dx)*((Ux(i,j-1).^2./Hx(i,j-1) + ...
            g/2*Hx(i,j-1).^2) -(Ux(i-1,j-1).^2./Hx(i-1,j-1) + ...
            g/2*Hx(i-1,j-1).^2))- (dt/dy)*((Vy(i-1,j).*Uy(i-1,j)./Hy(i-1,j)) - ... 
             (Vy(i-1,j-1).*Uy(i-1,j-1)./Hy(i-1,j-1))); 
   % y momentum 
   V(i,j) = V(i,j) - (dt/dx)*((Ux(i,j-1).*Vx(i,j-1)./Hx(i,j-1)) - ... 
                (Ux(i-1,j-1).*Vx(i-1,j-1)./Hx(i-1,j-1))) ... 
               - (dt/dy)*((Vy(i-1,j).^2./Hy(i-1,j) + g/2*Hy(i-1,j).^2) - ... 
                (Vy(i-1,j-1).^2./Hy(i-1,j-1) + g/2*Hy(i-1,j-1).^2)); 

end 
 



  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Dora算法是一种求解一维浅水方程的数值方法。其基本思想是将PDE离散化,转化为差分方程,然后利用差分方程在有限的网格上进行迭代求解。 要编写一个使用Dora算法求解一维浅水方程MATLAB程序,我们需要以下几个步骤: 1. 首先定义模拟区域的空间范围、时间步长和时间范围等参数。 2. 创建一个矩阵来存储每个时刻每个空间点的水位值,初始化水位矩阵。 3. 在时间范围内进行迭代,对于每个时间步长计算水位值。 4. 使用差分方程将水位的时间导数和空间导数近似为有限差分。 5. 根据差分方程更新每个时刻每个空间点的水位值。 6. 重复步骤3-5,直到达到所需的时间范围。 下面是一个简单的示例代码: ```MATLAB % 定义参数 L = 10; %空间范围 T = 10; %时间范围 dx = 0.1; %空间步长 dt = 0.01; %时间步长 Nt = T / dt; %时间步数 Nx = L / dx; %空间步数 % 初始化水位矩阵 h = zeros(Nx, 1); % 迭代求解 for n = 1:Nt hn = h; %保存上一时刻的水位矩阵 for i = 2:Nx-1 h(i) = hn(i) - (dt/dx)*(sqrt(g)*hn(i+1) - sqrt(g)*hn(i-1)); %差分方程 end % 边界条件 h(1) = h(Nx-1); h(Nx) = h(2); % 绘制水位图像 plot(linspace(0, L, Nx), h); ylim([-1, 1]); xlabel('Space'); ylabel('Water level'); title(['Time step ', num2str(n)]); pause(0.01); %为了观察效果,加入短暂的暂停 end ``` 这只是一个简单的示例代码,具体的实现可能需要根据具体问题调整参数和边界条件。但是,以上代码可以帮助您理解如何使用Dora算法来求解一维浅水方程

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值