我该如何解决特征值非常慢而无法解析的问题?

问题描述 投票:0回答:1

我很不高兴这段代码不会一直运行,而是一直运行。我认为原因是解析推导过程需要矩阵W的解析解。希望有人能给我一些帮助或指出问题,我将不胜感激。

tic;
clc;
clear;
syms B
W11=fa(B,1,1,1,1);W12=fa(B,1,1,1,0);W13=fa(B,1,1,0,1);W14=fa(B,1,1,0,0);
W21=fa(B,1,0,1,1);W22=fa(B,1,0,1,0);W23=fa(B,1,0,0,1);W24=fa(B,1,0,0,0);
W31=fa(B,0,1,1,1);W32=fa(B,0,1,1,0);W33=fa(B,0,1,0,1);W34=fa(B,0,1,0,0);
W41=fa(B,0,0,1,1);W42=fa(B,0,0,1,0);W43=fa(B,0,0,0,1);W44=fa(B,0,0,0,0);
W=simplify([W11,W12,W13,W14;W21,W22,W23,W24;W31,W32,W33,W34,W41,W42,W43,W44]);
E1=eig(W);
E2=sort(E1);
E3=E2(4);
T=1;
be=1/T;
f1=-1/be*log(E3);
ma=-diff(f1);
m1=subs(ma,{B},2)
toc;

function s1=fa(B,m1i,m1j,m2i,m2j)
JH=2;J=1;T=1;de=0.2;
sx=1/2*[0 1;1 0];
sy=1/2*[0 -1i;1i 0];
sz=1/2*[1 0;0 -1];
u=eye(2);
be=1/T;
H11=kron(sx,kron(sx,kron(u,u)))+kron(sy,kron(sy,kron(u,u)))...
+de*kron(sz,kron(sz,kron(u,u)));
H12=kron(u,kron(sx,kron(sx,u)))+kron(u,kron(sy,kron(sy,u)))...
+de*kron(u,kron(sz,kron(sz,u)));
H2=kron(sz,kron(u,kron(u,u)))+kron(u,kron(sz,kron(u,u)));
H3=kron(u,kron(u,kron(u,u)));
H=-JH*(H11+H12)+J*H2*(m1i+m1j)+1/2*J*H3*(m1i+m2i+m1j+m2j)...
    -B*1/2*H3*(m1i+m2i+m1j+m2j);
va=eig(H);
s1=sum(exp(-be*va));
end
matlab derivative eigenvalue
1个回答
1
投票

正如[Dev-iL在a comment中提出的建议,该代码的问题在于,它试图以符号方式计算非常复杂的表达式。取而代之的是,用数字来评估表达式要简单得多。导数的数值逼近将是唯一无法获得确切结果的地方,但是正如我们稍后将看到的,误差非常非常小。

这就是我重写您的代码的方式。首先,我将所有代码都带到diff行,并将其变成一个函数(为清晰起见,略有简化)。此函数完全不使用符号数学,它只是以给定的f1值计算B的值。请注意,它在问题未更改的情况下使用fa函数。

function out = f1(B)
W = [fa(B,1,1,1,1), fa(B,1,1,1,0), fa(B,1,1,0,1), fa(B,1,1,0,0);...
     fa(B,1,0,1,1), fa(B,1,0,1,0), fa(B,1,0,0,1), fa(B,1,0,0,0);...
     fa(B,0,1,1,1), fa(B,0,1,1,0), fa(B,0,1,0,1), fa(B,0,1,0,0);...
     fa(B,0,0,1,1), fa(B,0,0,1,0), fa(B,0,0,0,1), fa(B,0,0,0,0)];
E = sort(eig(W));
E = E(4);
T = 1;
be = 1/T;
out = -1/be*log(E);
end

接下来,我们通过在确实接近点f1的两个位置上计算B的值,以数值方式估计导数(但不太接近,因为我们将陷入数字舍入误差):

B = 2;
delta = 1e-6;
(f1(B-delta) - f1(B+delta))/(2*delta)

我们更改delta的值以验证我们有一个很好的近似值。使用1e-61e-41e-3,我得到的值完全相同:1.6303。这表明函数在B附近非常平滑,我们对导数的估计是正确的。

© www.soinside.com 2019 - 2024. All rights reserved.