我希望在MatLab中解决一个线性系统(对应于一个写成有限差分格式的PDE系统的两个方程)。该系统矩阵的操作(对应于PDE系统的一种扩散项)可表示为符号形式(其中
而对于解决方案:
u
是一个未知场,n
是时间步长,j
是网格点):
完整表达式如下:
上述矩阵应被视为A
,其中A * U^n+1 = B 是该系统。 U
交替包含'u'和'v'(PDE系统的第二个未知场):U=[u_1,v_1,u_2,v_2,...,u_J,v_J]。
到目前为止,我一直在以以下昂贵的方式使用spdiags
和diag
填充该矩阵: E=zeros(2*J,1);
E(1:2:2*J) = 1;
E(2:2:2*J) = 0;
Dvec=zeros(2*J,1);
for i=3:2:2*J-3
Dvec(i)=D_11((i+1)/2);
end
for i=4:2:2*J-2
Dvec(i)=D_21(i/2);
end
A = diag(Dvec)*spdiags([-E,-E,2*E,2*E,-E,-E],[-3,-2,-1,0,1,2],2*J,2*J)/(dx^2);`
而对于解决方案:
[L,U]=lu(A);
y = L\B;
U(:) =U\y;
其中B
是右手边的向量。
显然,这种方法非常耗费资源,因为需要建立一个JxJ的矩阵,进行JxJ矩阵乘法等操作。
那么我的问题来了:是否有一种方法可以在不传递矩阵的情况下解决该系统,例如通过传递向量Dvec
或直接传递D_11
和D_22
?这将节省大量内存和处理时间!