波动方程的有限差分法,Matlab

波动方程的有限差分法,Matlab,matlab,differential-equations,numerical-analysis,Matlab,Differential Equations,Numerical Analysis,我正在尝试实现matlab代码来求解波动方程,我的函数如下所示: function [x,t,w] = wave_eqn(xl,xr,yb,yt,M,N,f,l,r,p) % input: space interval [xl,xr], time interval [yb,yt] % number of space steps M, number of time steps N % output: solution w D=2; % diffus

我正在尝试实现matlab代码来求解波动方程,我的函数如下所示:

function [x,t,w] = wave_eqn(xl,xr,yb,yt,M,N,f,l,r,p)
% input: space interval [xl,xr], time interval [yb,yt]
% number of space steps M, number of time steps N 
% output: solution w 
D=2;                        % diffusion coefficient
h=(xr-xl)/M; k=(yt-yb)/N; m=M-1; n=N;
sigma=D*k/(h*h);
a=diag(1-2*sigma*ones(m,1))+diag(sigma*ones(m-1,1),1);
a=a+diag(sigma*ones(m-1,1),-1); % define matrix a
lside=l(yb+(0:n)*k); rside =r(yb+(0:n)*k);
w(:,1)=f(xl+(1:m)*h)';  % initial conditions
for j=1:n
    w(:,j+1)=a*w(:,j)-w(:,j-1)+sigma^2*[lside(j);zeros(m-2,1);rside(j)];
end
w=[lside;w;rside];      % attach boundary conds
x=(0:m+1)*h;t=(0:n)*k;
% view(60,30);axis([xl xr yb yt -1 1])
end

%source: numerical analysis 2nd edition
我一直在for循环中得到一个错误,其中w(:,j-1)项表示:下标索引必须是实正整数或逻辑数


我不太清楚如何解决这个问题。还应注意,f、p、l、r都是x和t的输入函数。我使用了热方程的模板来编写这段代码,但我不确定如何实现第四个函数p。谢谢。

您正在循环
1:n
,因此
j-1=0
0
在Matlab中不是有效的索引

相反,从
2:n-1
循环,也可以解释
j+1

您已经声明了初始条件
w(:,1)
,但是您的数值方法需要前面的两个步骤,因此您还需要将初始条件分配给
w(:,2)
,可能简单到
w(:,2)=w(:,1)
。然后循环使用:

for j=2:n-1
    w(:,j+1)=a*w(:,j)-w(:,j-1)+sigma^2*[lside(j);zeros(m-2,1);rside(j)];
end 

您正在循环
1:n
,因此
j-1=0
0
在Matlab中不是有效的索引

相反,从
2:n-1
循环,也可以解释
j+1

您已经声明了初始条件
w(:,1)
,但是您的数值方法需要前面的两个步骤,因此您还需要将初始条件分配给
w(:,2)
,可能简单到
w(:,2)=w(:,1)
。然后循环使用:

for j=2:n-1
    w(:,j+1)=a*w(:,j)-w(:,j-1)+sigma^2*[lside(j);zeros(m-2,1);rside(j)];
end