【发布时间】:2014-06-25 11:11:40
【问题描述】:
我构建了以下代码来求解一维波动方程作为半径 r 从 0 到 pi 的函数。该等式如下图所示:
我已经将空间导数 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) 如果您查看上面的代码,我可以将 Dirichlet 边界条件更改为 Neumann 边界条件。这部分代码是为这个一维案例实现这些条件的正确方法吗?
【问题讨论】:
-
狄利克雷*。也不要使用“eval”作为变量名,因为它是 Matlab 内置函数,而您正在覆盖它。
-
问题已针对您建议的更改进行了修改@ander-biguri
标签: matlab numerical-methods derivative