解决线性方程用LU分解和COLAMD

19日视图(30天)
我试图解决矩形/平方域上的泊松方程齐次纽曼边界条件。当使用中央有限差分离散,我得到一个方程Ax = b, A是稀疏和奇异的地方。可以通过以下呈现可逆的修改(1:)= 0;(1)=固定值(例如,1000),这样我们指定x的值在一个位置域。通常情况下,方程是有效解决前因子用LU分解。即。x = U \ \ b (L)。
通过排列的列(使用COLAMD),然而,结果L的代替者,U矩阵可以减少,从而加快解方程。所以,p = COLAMD (A),陆[L U] = ((:, p)); x (p) = U \ (L \ b (p))。在这里,p表示列排列。
这是我的问题。让x1和x2的解决方案没有计算和列排列。万博 尤文图斯我计算| | LU-A (: p) | | < 1平台以及测试COLAMD做它应该做什么。然而,解决方案x1和x2是万博 尤文图斯非常不同的。| | (x1, x2) | |。我粘贴以下代码。请让我知道。
nx = 10;纽约= 10;
%构造矩阵
d2Qdx2 = spdiags(的(nx 1) * (1、2、1) [1, 0, 1], ny, nx);
d2Qdx2 (1, - 1) = 1;d2Qdx2 (nx nx) = 1;
d2Qdx2 = kron (d2Qdx2 speye(纽约));
d2Qdy2 = spdiags(的(纽约,1)*(1、2、1)[1,0,1],纽约,纽约);
d2Qdy2 (1, - 1) = 1;d2Qdy2(纽约,纽约)= 1;
d2Qdy2 = kron (speye (nx) d2Qdy2);
= d2Qdx2 + d2Qdy2;
(1:)= 0;(1)= 1;
%生成右手边向量
B =兰特(纽约、nx);b = b(:)的意思(b (:));
%的解决方案没有COLAMD
陆[L U] =(一个);x1 = U \ (L \ b);
%的解决方案与COLAMD
p = colamd(一个);陆[L U] = ((:, p));x2 (p) = U \ (L \ b (p));
规范(L *你一个(:p),“摇来摇去”)
ans = 3.5425 e15汽油
规范(x1, x2),“摇来摇去”)
ans = 74.5403

接受的答案

约翰D 'Errico
约翰D 'Errico 2021年9月2日
编辑:约翰D 'Errico 2021年9月2日
首先,制作一个100 x100矩阵稀疏是愚蠢的。平的,愚蠢的。系统需要解决的时间很小,即使一个完整的矩阵。
不再是一个单一的你已经形成了吗?
气孔导度(全(A))
ans =
1043.6
甚至没有接近奇异。这意味着任何列排列没有影响的解决方案。
时间(@ ()\ B)
ans =
7.2113 e-05
几毫秒才解决。完整的形式,它是不同的吗?
房颤=全(A);
时间(@()房颤\ B)
ans =
7.734 e-05
事实上,没有。所以除非你真正的问题是非常大,那么你就是在浪费你的时间与整个努力使稀疏,或者就此而言,使用列排列减少填写。即使你做了这个1000 x1000问题,直接全部解决仍会快得多。
它将帮助如果你告诉我们你真正的问题是,多大或者为什么你迫切想要解决这个问题,你这样做。
即使没有,显然你仍然有一个问题在如何使用permutaiton列。
b = b(:)的意思(b (:));
陆[L U] =(一个);x1 = U \ (L \ b);
规范(x1 - A \ b)
ans =
0
x1计算正确。现在让我看看你是如何计算x2,使用列排列。
一个列排列是什么意思?
想象我们想解决这个问题一个* x = b。为此,我们将一个列的排列A。但这并不涉及交换b的行! ! ! ! ! ! !
的permutaiton相当于重新排序的列的元素x这个问题。我们预计,如果x是一个解决方案* x = b,和p是一个列排列的,然后我们会
* x = = (: p) * x (p)
不需要交换b的元素,也不是你想这样做。
x2 = 0(大小(x1));
p = colamd(一个);
陆[L U] = ((:, p));%这个构建排列成L和U。
x2 (p) = U \ (L \ b);
规范(x1, x2)
ans =
1.1414 e-13
工作的很好。的细微差别是气孔导度(A) *每股收益。
电导率(完整的(A)) *每股收益
ans =
2.3173 e-13
这就是为什么你有一个问题。由于某些奇怪的原因,你决定你需要交换的元素b。你还浪费时间与排列在第一时间在这个小问题,但也许你真正的问题是严重的,大规模的。谁知道呢?
1评论
巴拉苏瑞
巴拉苏瑞 2021年9月2日
编辑:约翰D 'Errico 2021年9月2日
在我的例子中是200000 x200000做colamd因此它使一个巨大的差异。我发布这个问题100 x100这样一个可以运行代码,问题是什么。现在,你能摆脱一些洞察问题?你可以更改代码,以nx = 400,纽约= 400并运行代码,查看不同。
我明白了,你更新的回答解决了我的问题。谢谢。这就是我的数学错误。我也排列b,这是不正确的。谢谢。

登录置评。

更多的答案(0)

类别

找到更多的在稀疏矩阵帮助中心文件交换

s manbetx 845


释放

R2021a

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!