所以我试图创建一个脚本,它将获取一个数组,将其转换为打包形式,然后针对它运行Cholesky因子分解,最后使用前向和后向替换来解决它(Ax=b
) 。
我遇到的麻烦是为打包数组创建正向替换(列式)算法。我已经正确地完成了向后替换,但是我似乎无法正确地转换算法。
这是我当前的后向替换算法(这是完美的)
x = b;
p = n*(n+1)/2;
for j = n:-1:1
x(j) = x(j) / u(p);
p = p - 1;
for i = j-1:-1:1
x(i) = x(i) - u(p) * x(j);
p = p - 1;
end
end
其中n
是原始A
矩阵(正方形和SPD)的大小。从A
矩阵到u
的映射如下:
A(i,j) = u(i+j*(j-1)/2)
我当前正向替换算法的迭代如下:
x = b;
p = 1;
for j = 1:n
x(j) = x(j) / u(p);
p = p + 1;
for i = j+1:n
x(i) = x(i) - u(p) * x(j);
p = p + 1;
end
end
我似乎无法弄清楚我做错了什么。无论我尝试什么,最后只是给我NaN
或Inf
作为x
的答案。任何比我聪明的人都可以找出算法的样子吗?
答案 0 :(得分:0)
根据我的理解,您正试图解决导致Ax = b
解决方案的两个问题。
其中A = LL'
表示A
等于下三角矩阵(L
)乘以其转置(L'
)
首先通过正向替换来解决Ly = b
。
最后通过反向替换来解决L'x = y
。
你的后方替代你的u(p)
被定义为(n = 3):
| u(1) u(2) u(4) |
L' = | 0 u(3) u(5) |
| 0 0 u(6) |
我认为你遇到前向替代的问题来自L
定义为:
| u(1) 0 0 |
L = | u(2) u(3) 0 |
| u(4) u(5) u(6) |
你的价值p
需要有以下进展才能通过前方替代完成你想要的东西:
{1, 2, 4, 3, 5, 6}
我修改了您当前的代码以进行转发,以实现此模式。
x = b;
p = 1;
for j = 1:n
d = j-1;
p = j + (d^2+d)/2;
x(j) = x(j) / u(p);
d = d + 1;
for i = j+1:n
p = j + (d^2+d)/2;
x(i) = x(i) - u(p) * x(j);
d = d + 1;
end
end
我能够测试它,并产生预期的结果。 我希望这对你有帮助。