如何解决特征值解析求解很慢的问题?
How do I solve the problem the eigenvalue is very slow to be solved analytically?
我很不高兴这段代码没有 运行 结果,它只是 运行 宁所有 time.I 认为原因是需要分析的分析推导过程矩阵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
正如@Dev-iL 在 中所建议的那样,代码的问题在于它试图以符号方式计算非常复杂的表达式。相反,以数字方式评估表达式要简单得多。导数的数值近似将是唯一不能得到精确结果的地方,但正如我们稍后将看到的,误差非常非常小。
这就是我重写你的代码的方式。首先,我将您所有的代码带到 diff
行,并将其变成一个函数(为清楚起见略微简化)。此函数根本不使用符号数学,它只是在 B
的给定值处计算 f1
的值。请注意,它在问题中使用 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
接下来,我们通过在非常接近点 B
的两个位置计算 f1
的值来估计导数(但不要太近,因为我们会进入数值舍入误差):
B = 2;
delta = 1e-6;
(f1(B-delta) - f1(B+delta))/(2*delta)
我们更改 delta
的值以验证我们有一个很好的近似值。使用 1e-6
和 1e-4
以及 1e-3
我得到完全相同的值:1.6303。这表明函数在B
附近非常平滑,我们对导数的估计是正确的。
我很不高兴这段代码没有 运行 结果,它只是 运行 宁所有 time.I 认为原因是需要分析的分析推导过程矩阵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
正如@Dev-iL 在
这就是我重写你的代码的方式。首先,我将您所有的代码带到 diff
行,并将其变成一个函数(为清楚起见略微简化)。此函数根本不使用符号数学,它只是在 B
的给定值处计算 f1
的值。请注意,它在问题中使用 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
接下来,我们通过在非常接近点 B
的两个位置计算 f1
的值来估计导数(但不要太近,因为我们会进入数值舍入误差):
B = 2;
delta = 1e-6;
(f1(B-delta) - f1(B+delta))/(2*delta)
我们更改 delta
的值以验证我们有一个很好的近似值。使用 1e-6
和 1e-4
以及 1e-3
我得到完全相同的值:1.6303。这表明函数在B
附近非常平滑,我们对导数的估计是正确的。