我没有从数学方面处理你的问题的知识,但从编程的角度来看,有一点我可以注意到.
确实你是对的.在获得结果之前需要进行太多次迭代:
Elapsed time is 6.487824 seconds.
count =
292945
定义步长以接近最终结果时,必须优化步长.否则你要么接近答案要么太慢,要么你已经多次通过最佳答案并绕着它做一个曲折,因为你的步长太大了.
为了优化步长,我首先根据你的脚本形成一个函数(加上一些小的修改):
function [solution, count, T] = SDhilb(d, step)
h = hilb(d);
tic
b = ones(d, 1);
solution = zeros(d, 1);
residual = h * solution - b;
res2 = residual' * residual;
tol = 10^(-6);
count = 0;
while res2 > tol;
roe = res2/(residual' * h * residual);
solution = solution - step * roe * residual; % here the step size appears
residual = h * solution - b;
count = count + 1;
res2 = residual' * residual; % let's calculate this once per iteration
end
T = toc;
现在将此函数用于一系列步长(0.1:0.1:1.3)和一对希尔伯特矩阵(d = 2,3,4,5),显然1不是有效的步长:
相反,步骤= 0.9似乎更有效率.让我们看看hilb(5)的效率如何:
[result, count, T] = SDhilb(5, 0.9)
result =
3.1894
-85.7689
481.4906
-894.8742
519.5830
count =
1633
T =
0.0204
这比两个数量级快了两个数量级.
以类似的方式,你可以尝试不同的tol值来看看它对速度的影响有多大.在这种情况下,没有最佳值:公差越小,您需要等待的时间越长.