为什么我的matlab代码不能生成正确的答案?

up9lanfz  于 2023-06-30  发布在  Matlab
关注(0)|答案(1)|浏览(182)

执行应用于18阶希尔伯特矩阵的QR方法的6次迭代。用λ_i表示A的特征值的近似值,用λ表示由命令eig计算的特征值,最大绝对误差max| λ_i- λ|近似为:
A)7.4495e-03 B)7.4321e-01 C)7.8451e-05 D)7.1563e-08 E)7.9932e-10
对于以上问题的Matlab代码,和Matlab函数(qr_base)我自己用过的问题,由于某种原因我不明白我有一个完全不同的答案。
你能帮我看看我的问题是什么吗?我使用的代码描述如下:

close all;clear;clc;
m_max = 6;
A = hilb(18);
[d,m] = qr_base(A,m_max)
val = eig(A)
err = max(abs(d-val))

function [d,m] = qr_base(A,m_max)
%convergence is guaranteed only if A has eigenvalues with distinct absolute value
for m = 1:m_max
   [Q,R] = qr(A);
   A = R*Q;
end
d = diag(A);
end

我希望在使用QR方法对函数的特征值进行近似后得到答案(这是正确的),并从中减去MATLAB函数eig生成的默认特征值。但我得到了一个不同的值,这不是答案。

b4lqfgs4

b4lqfgs41#

eig返回从最小到最大排序的特征值。你的函数qr_base返回它们,从大到小排序。
因此,如果你翻转函数的结果,你会得到一个正确的误差测量:

function [d,m] = qr_base(A,m_max)
for m = 1:m_max
   [Q,R] = qr(A);
   A = R*Q;
end
d = diag(A);
d = flip(d);  % Added line
end

我现在得到的输出是err = 7.1563e-08
请注意,在查看脚本中的dval时,我意识到了问题所在。这些是你要比较的数字,如果比较没有产生预期的结果,看看你要比较的是什么。MATLAB很容易入门,因为它很容易检查变量的值,看看正在计算什么,以及如何计算。你可以很容易地运行一个脚本一行一行地通过复制粘贴命令窗口中的每一行,你甚至不需要学习使用调试器(虽然这将是强烈建议!).

相关问题