MatLab元素矩阵分配不起作用

时间:2016-12-08 01:42:03

标签: matlab matrix precision numerical

我正在研究一个相当复杂的问题而且出现了一些错误,我已经缩小了错误,我发现的内容对我来说没有意义。

我有一个维D = 6的矩阵H0,它依赖于一个参数,在循环中我计算它的特征值并绘制它们,这是我正确解决的问题的一部分。

some of the eigenvalues as a function of said parameter

我还需要计算另一个与H0非常相似的矩阵,我们称之为Hren。这个Hren依赖于H0和一些参数alpha,而对于alpha = 0,我们有Hren = H0。在尝试alpha的任何值之前我测试alpha = 0因为它应该给我与H0相同的结果而且它不会。

我已经非常容易地缩小了循环这一部分的错误:

Hren = zeros(D);
    for i = 1:D
        for j = i+1:D
            Hren(i,j) = H0(i,j);%*renormfunction(H0(i,j),0.5*alpha*(f(i)-f(j))^2,freqcutoff);
            Hren(j,i) = H0(j,i);%Hren(i,j);
            Hren(i,i) = H0(i,i);
        end
    end

在评论中,我提供了代码,我希望它如何工作,并简化和显示我的问题我已经做了一个简单的Hren = H0但元素到元素,仍然是我的参数的一些值(x轴在情节)我没有得到Hren = H0。这怎么可能?

如果在循环结束时我写Hren=H0我没有得到这个错误,事实上两个矩阵都是相同的,应该是这样。

我现在将向您展示上面的相同情节,但对于Hren而不是H0,如果两个矩阵相等,它应匹配。

enter image description here

我的完整代码,脚本和辅助功能:

功能:

function result = Hrabi(w,W,g,dim)
a = ladder(dim);
Z = [1,0;0,-1];
X = [0,1;1,0];
result = w*kron(a'*a,eye(2)) + 0.5*W*kron(eye(dim),Z) + g*kron(a'+a,X);
end

maint脚本:

dim = 50;
freqTLS = 1;
freqCAVITY = 1;
freqcutoff = 100;
D = 6;
glist = linspace(1E-6,2.5,200);
alphalist = 0;
X = kron(eye(dim),[0,1;1,0]);
gaps = zeros(length(glist),D-1);
debug = [];
gindex = 0;
alphaindex = 0;
for g = glist
    gindex = gindex + 1;
    for alpha = alphalist
        alphaindex = alphaindex + 1;
        HS = Hrabi(freqTLS,freqCAVITY,g,dim);
        [vecsHS,valsHS] = eigs(HS,D,'sa');
        FenbaseHS = zeros(D);
        for i = 1:D
            for j = 1:D
                FenbaseHS(i,j) = vecsHS(:,i)'*X*vecsHS(:,j);
            end
        end
        [vecsF,valsF] = eig(FenbaseHS);
        H0 = vecsF'*valsHS*vecsF;
        f = diag(vecsF'*FenbaseHS*vecsF);
        Hren = zeros(D);
        for i = 1:D
            for j = i+1:D
            Hren(i,j) = H0(i,j);                
            Hren(j,i) = H0(j,i);
            Hren(i,i) = H0(i,i);
        end
    end
    %Hren = H0;
    energies = eig(Hren);
    energies = sort(energies-0*min(energies));
    energies = energies(2:length(energies));
    gaps(gindex,:) = energies;
end

figure();
plot(glist,gaps,'.b')

0 个答案:

没有答案