我有波动方程
有边界条件
和初始条件
我试图通过有限差分法在 MATLAB 上实现这个问题,并使用该surf
函数将其绘制为 3D 波;但是,我遇到的问题是如何编写第一个初始条件。
我正在使用的功能是
function [u, q] = Wave(f1,f2,g0,g1,xspan,tspan,nx,nt,alpha)
x0 = xspan(1)
xf = xspan(2)
t0 = tspan(1)
tf = tspan(2)
dx = (xf - x0)/nx;
dt = (tf-t0)/nt;
x = [0:nx]'*dx;
t = [0:nt]*dt;
q = alpha*(dt/dx)^2;
q1 = q/2;
q2 = 2*(1-q);
u(:,1) = f1(x);
for k = 1:nt+1, u([1 nx+1],k) = [g0(t(k)); g1(t(k))]; end
u(2:nx,2) = q1*u(1:nx-1,1) + (1-q)*u(2:nx,1) + q1*u(3:nx+1,1) + dt*f2(x(2:nx));
for k = 3:nt+1
u(2:nx,k) = q*u(1:nx-1,k-1) + q2*u(2:nx,k-1) + q*u(3:nx+1,k-1) - u(2:nx,k-2);
end
surf(t,x,u)
xlabel('t')
ylabel('x')
zlabel('u(x,t)')
end
我知道在函数中,变量f1
是由第一个初始条件控制的。在函数中,我不知道如何将初始条件合并到方法中。我假设要使用 for 循环和 if 语句,但我尝试的任何方法都不起作用。
我用来绘制图表的脚本是
clc
clear all
f1 = @(x) ////;
f2 = @(x) (x.^2).*((sin(4.*x)).^2);
g0 = @(t) 0;
g1 = @(t) 0;
xspan = [0,2*pi];
tspan = [0,1];
nx = 20;
nt = 40;
alpha = 4;
[u,r] = Wave(f1,f2,g0,g1,xspan,tspan,nx,nt,alpha);
正如在脚本中看到的那样f1 = @(x) ////;
。我不确定在初始条件下放什么。任何帮助将不胜感激。