在(不连续)区域中绘制多变量方程

计算科学 matlab 绘图 八度
2021-12-15 08:18:07

目标是在以下等式中显示 K 和 E 之间的关系:

cos(K)=5sinc(5.12E)cos(5.12E)

预期的结果是:

在此处输入图像描述

但是,使用以下代码:

k = linspace(0, 3*pi, 99);  % 0 < k < 3pi , crystal momentum.
E = linspace(0.1,  3.5, 99);% Energy.
[X, Y] = meshgrid(k, E);

P = 5;                      % 2mU_0b/hbar^2.
Z = cos(X)  - ( P * sinc( 5.12 * sqrt(Y) ) )  - cos( 5.12 * sqrt(Y) );

contour(X, Y, Z);

xlabel('k')
ylabel('E(k)')
legend('cos(K) - P * sin(E) - cos(E)')
title('Dispersion relation for periodic potential in extended zone.')

不幸的是,我目前得到的完全没有相似之处:

在此处输入图像描述

我只是看不到如何将图形分成三个(不连续)区域,K=[0,π],[π,2π],[2π,3π],以及什么值E应该用于这些区域中的每一个。

如何以与第一张图中相同的方式绘制方程?


第一个情节是从这里开始的,他们通过添加来做一些模算术技巧ifloor(k./π)在 lhs 和ifloor(5.12E./π)在 rhs 这里有类似的东西

2个回答

首先,您最初写道,您的方程式是cos(K)=5 sinc(5.12E)cos(5.12E),但你的意思很明显cos(K)=5 sinc(5.12E)+cos(5.12E)

二、sinc()函数有不同的约定。另一个问题是基于 Mathematica,它使用约定 sinc(x)sinxx, 而 Matlab/Octave 使用约定 sinc(x)sin(πx)πx. (准确地说当然需要单独定义sinc(0)1.) 这就是为什么你的第一个等高线图显示“完全没有相似之处”。

补偿这些不同的约定并稍微更改您的代码,使其仅显示 Z=0 的轮廓(如 Biswajit Banerjee 的评论中所建议的那样)产生

k = linspace(0, 3*pi, 99);  % 0 < k < 3pi , crystal momentum.
E = linspace(0.1,  3.5, 99);% Energy.
[X, Y] = meshgrid(k, E);

P = 5;                      % 2mU_0b/hbar^2.
Z = cos(X)  - ( P * pi * sinc( 5.12 * sqrt(Y)/pi ) )  - cos( 5.12 * sqrt(Y) );
contour(X, Y, Z,[0,0],'linewidth',2,'linecolor','k');
for i=1:3
  line(i*[pi,pi],[0,3.5],'color','k','linestyle','--')
end

xlabel('k')
ylabel('E(k)')
legend('cos(K) - P * sin(E) - cos(E)')
title('Dispersion relation for periodic potential in extended zone.')

产生情节

等高线图

我能想出的隔离这些曲线部分的最佳方法是简单地运行contour单独的区域并将它们绘制在一起。下面的代码实现了这一点并将其概括为N部分。

P = 5;                      % 2mU_0b/hbar^2.
a=5.12;
N=3;

hold on;


for i=1:N
    k = linspace((i-1)*pi, i*pi, 1000);  % 0 < k < 3pi , crystal momentum.
    E = linspace(((i-1)*pi/a)^2,  (i*pi/a)^2, 1000);% Energy.
    [X, Y] = meshgrid(k, E);

    Z = cos(X)  - ( P * pi * sinc( a * sqrt(Y)/pi ) )  - cos( a * sqrt(Y) );
    contour(X, Y, Z,[0;0],'linewidth',2,'linecolor','k');

    line(i*[pi,pi],[0,(N*pi/a)^2+0.2],'color','k','linestyle','--')
end

xlabel('k')
xlim([0,N*pi+0.2])
ylim([0,(N*pi/a)^2+0.2])
ylabel('E(k)')

等高线图分段

这是接近预期目标的东西:

在此处输入图像描述

但是代码很丑:

k = linspace(0,  3*pi, 100);   

hbar = 1;
m = 1;
E =  ( (hbar^2) .* (k.^2) ) ./  (2*m);

E(33:66) = E(33:66) + 3;
E(66:100) = E(66:100) + 6;

E(33) = E(32);
E(66) = E(65);

E(34) = NaN;
E(67) = NaN;

hold on
plot(k,  E, [pi pi], [0 60], '--k', [2*pi 2*pi], [0 60], '--k');
plot(k(34), E(33), 'ob', 'MarkerFaceColor','b',...
        k(67), E(66), 'ob',  'MarkerFaceColor', 'b',...
        k(34), E(35), 'ob', 'MarkerFaceColor', 'b',...
        k(67), E(68), 'ob' , 'MarkerFaceColor', 'b');
hold off

xlabel('k')
ylabel('E(k)')
legend('E = hbar^2 k^2 / 2m', 'x = pi', 'x = 2pi')
title('Dispersion relation for periodic potential in extended zone.')

txt = '<- Band Gap';
text(k(35), E(33) +2, txt)