在Matlab中求解一维波动方程的特征问题

时间:2014-06-25 11:11:40

标签: matlab numerical-methods derivative

我构造了以下代码来解决1D波动方程作为半径r从0到pi的函数。该等式如下图所示:

enter image description here

我已经在空间导数c前面取常数c等于1,但我一般编码了这个,因为我希望最终使这个变量依赖于r。通过假设平面波解决方案,解决方案可以减少到以下几点:

enter image description here

我现在使用有限差分并将右侧的二阶DE分离成矩阵A,以试图减少求解特征值和特征向量的问题,即:

我制作的代码如下所示:

%eigensolver code

clear
clc

%NOTE: place % in front of Neumann code when solving using Dirchlet
%condition and vise versa so that the code only inputs one type of boundary
%condition

%Specify initial variables
ri=0;               %inital radius             
rf=pi;               %final radius
Di=0;               %initial Direchlet point
Df=0;               %final Direchlet point
Ni=0;               %initial Neumann point
Nf=0;               %final Neumann point




Nr=5;
h=abs(rf-ri)/(Nr-1);  %step size
r=ri:h:rf;
A=zeros(Nr,Nr);
b=ones(size(r));
c=b;
%code inital/final point assuming Dirichlet condition
%initial
A(1,1)=-(2*(c(1)^2))/(h^2);
A(1,2)=(c(1)^2)/(h^2);
%final
A(Nr,Nr)=-(2*(c(Nr)^2))/(h^2);
A(Nr,Nr-1)=(c(Nr)^2)/(h^2);

%code initial and final points assuming Neumann condition
%initial
%A(1,1)=-(3.*(c(1)^2))./(2*h);
%A(1,2)=(2.*(c(1)^2))./h;
%A(1,3)=-(c(1)^2)/(2*h);
%final
%A(Nr,Nr-2)=(c(end)^2)/(2*h);
%A(Nr,Nr-1)=-(2*(c(end)^2))/h;
%A(Nr,Nr)=(3*(c(end)^2))/(2*h);

%interior points
for k=2:Nr-1
    A(k,k-1)=(c(k)^2)/(h^2);
    A(k,k)=-(2*(c(k)^2))/(h^2);
    A(k,k+1)=(c(k)^2)/(h^2);
end

[evec, eigval]=eig(A)

我的问题由几个部分组成:

1)我怎么知道我是否找到了数字问题的正确答案?我可以调用matlab中有一些预先指定的函数吗?我不是很精通特征问题所以我不知道如何解释我的答案。

2)如果您查看上面的代码,我可以改变Neumann边界条件的Dirichlet边界条件。这部分代码是否是为这个1D案例实现这些条件的正确方法?

1 个答案:

答案 0 :(得分:0)

您可以将PDE的特征问题想象如下。

如果A是有限维矩阵,v的一个特征向量和l对应的特征值,那么:

Av = lv

现在,您可以使用PDE的(无限维)微分算子而不是有限维矩阵A.在这种情况下,你的特征向量现在是一个特征函数,因为D在函数空间上工作(希望这有助于理解这一点)。

关于您的代码:您不应在刚度矩阵中包含边界条件。您想要解决离散问题

Ax = b的,

其中A是您的刚度矩阵,x是您的网格点,b是网格点的值。因此,您应该在b。

中实现边界条件

如果您想进一步阅读,请解释:

以下链接适用于TUM的数字PDE 1课程 Numerical methods for PDE。 在这里,您将找到有关finite differences method的一些解释。 课程网页将为您提供讲义,代码示例等。