我正在研究一个项目,该项目与使用MATLAB中的中心差分近似以及以下边界条件在二维(x,y,t)数值中求解波动方程有关:
总装配方是:
我理解一些边界条件(BC),比如
du / dy = 0,j = m,
,
但我不确定如何在MATLAB中实现这些边界条件。
朋友给了我这些方程式:
这是我尝试使用MATLAB代码,
但我无法继续前进:
% The wave function
% Explicit
% Universal boundary conditions for all 3 cases:
% u=0 at t=0
% du/dt=0 at t=0
% Case 1 boundary conditions
% At x=0, u=2sin(2*pi*t/5);
% At y=0, du/dy=0;
% At y=2, du/dy=0;
% At x=5, du/dx=0;
% u=0 and du/dt=0 at t=0;
%-------------------------------------------------------------------------%
% Setting up
clc; clear all; close all;
% length, time, height
L = 5; % [m]
h = 2; % [m]
T = 10; % [s]
% Constants
c_x = 1; % arbitrary
c_y = 1; % arbitrary
dx = 0.1; % <x> increment
dy = 0.1; % <y> increment
dt = 0.1; % time increment
nx = L/dx + 1; % number of <x> samples
ny = h/dy + 1; % number of <y> samples
nt = T/dt + 1; % number of time samples
t(:,1) = linspace(0, T, nt);
theta_x = c_x*(dt^2)/(dx^2);
theta_y = c_y*(dt^2)/(dy^2);
% theta_x = theta_y
theta = theta_x;
%-------------------------------------------------------------------------%
% The matrix
U = zeros(nt, nx, ny);
% Setting up the <U> matrix with the boundary conditions - case 1
U(1, :, :) = 0; % U=0 at t=0
for tt=1:nt % U=2sin(2pi/5*t) at x=0
for jj=1:ny
U(tt, 1, jj)=2*sin(2*pi/5.*t(tt));
end
end
for it=2:t
for ix=2:nx-1
for iy=2:ny-1
% Boundary conditions
% General case (internal):
U1 = -U(it-1, ix, iy);
U2 = 2*(1-2*theta)*u(it, ix, iy);
U3 = theta*U(it, ix-1, iy);
U4 = theta*U(it, ix+1, iy);
U5 = theta*U(it, ix, iy-1);
U6 = theta*U(it, ix, iy+1);
end
end
end
答案 0 :(得分:0)
您有一般的装配公式也适用于边界。
复杂的是,当您在j = 1
和j = m
时应用公式时,您的网格中有j = 0
和j = m+1
字词。
为了改善这个问题,边界条件会给出网格和网格上的点之间的关系。
正如您所指出的,dudy = 0
条件已经为您提供了u(i,m-1) == u(u,m+1)
在边界上的关系。因此,您使用常规汇编公式并将所有m+1
项替换为边界上的m-1
。对于下边界,你也会有类似的关系。