我构造了以下代码来解决1D波动方程作为半径r从0到pi的函数。该等式如下图所示:
我已经在空间导数c前面取常数c等于1,但我一般编码了这个,因为我希望最终使这个变量依赖于r。通过假设平面波解决方案,解决方案可以减少到以下几点:
我现在使用有限差分并将右侧的二阶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案例实现这些条件的正确方法?
答案 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的一些解释。 课程网页将为您提供讲义,代码示例等。