Trying to replicate Local density of states
11 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
SWASTIK SAHOO
am 8 Dez. 2023
Kommentiert: SWASTIK SAHOO
am 22 Dez. 2023
I am trying to replicate Fig. 3 (b). I am getting figure 3(a) but not getting fig 3(b). I have attached my code here. Please someone help me to solve the issue.
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/1563414/image.png)
For plotting I am following equation 7 and 8. The equations are attached here. ![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/1563419/image.png)
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/1563419/image.png)
The whole paper is attached here for any clarification.
clc;
clear all;
close all;
t = 1.03;% in eV (Electron Volts)
a = 3.82;%in Angstroms
ka = linspace(-pi,pi,1000);
k = linspace(-pi,pi,1000)/a;
% Zig Zag Graphene N = 4
A = zeros(8,8);
A(1,2) = t;
A(2,1) = t;A(2,3) = t;
A(3,2) = t;A(3,4) = t;
A(4,3) = t;A(4,5) = t;
A(5,4) = t;A(5,6) = t;
A(6,5) = t;A(6,7) = t;
A(7,6) = t;A(7,8) = t;
A(8,7) = t;
% Defining the Connectivity between the Unit Cells Matrix
B = zeros(8,8);
B(2,1) =t;
B(3,4) = t;
B(6,5) =t;
B(7,8) =t;
for k = 1:length(ka)
[V1,D1] = (eig(A + B*exp(1i.*ka(k))+ B'.*exp(-1i.*ka(k))));
eigE1(k,:) = diag(D1);
hold on
end
figure(1)
plot(ka,eigE1,ka,-eigE1,'linewidth',1.5)
xlabel('ka');
ylabel('Energy in eV');
title('Energy Vs Ka for N = 4 Z-SNR');
box on
grid on
set(gca,'XTick',[-ka(length(ka)),0,ka(length(ka))]);
set(gca,'XTickLabel',{'-\pi','0','\pi'});
line([ka(length(ka)) ka(length(ka))],[4 -4]);
line([-ka(length(ka)) -ka(length(ka))],[4 -4]);
% Density of states
% Define the size of the matrix
rows = 1000;
cols = 8;
% Create a matrix with zeros
E = zeros(rows, cols);
% Define the diagonal elements
diagonal_values = linspace(-3, 3, min(rows, cols));
% Assign the diagonal values to the matrix
for i = 1:length(diagonal_values)
E(i, i) = diagonal_values(i);
end
gam=0.05;
m=1;
syms m
DE1=symsum((2*gam)./((E-eigE1).^2+(gam).^2),m);
i=i+1;
%syms j
% sum_DOS=symsum(1/(2*pi)*DE1,j,1,1);
sum_DOS=(1/(2*pi)*sum(DE1,k));
hold off
figure(2)
plot(sum_DOS,E,'g');
xlabel('D(E)------>')
ylabel('E(eV)------>')
set(gca,'XLIM',[0,4])
box on;grid on
0 Kommentare
Akzeptierte Antwort
Avni Agrawal
am 19 Dez. 2023
Hi Swastik,
I understand that you want to density of states. The error message for second plot indicates that plot is being passed data that it cannot interpret as valid plotting data. Given that ‘sum_DOS’ is described as 1000*8 sym, it seems that ‘sum_DOS’is a symbolic matrix, not a numeric array. The plot function cannot handle symbolic expressions directly.
To resolve this issue, you'll need to convert the symbolic expressions to numeric values before plotting. You'll need to use the ‘subs’ function to replace all the symbolic variables in‘sum_DOS’ with their corresponding numerical values.
Before line 68 in your function, you can insert the following line to verify and modify the data accordingly:
figure(2)
% update sum_DOS using subs function for numerical values
sum_DOS = subs(sum_DOS, m, 1);
plot(sum_DOS,E,'g');
Please refer to the following documentation page for more information on the ‘subs’ function: https://www.mathworks.com/help/symbolic/subs.html
I hope this helps.
Weitere Antworten (0)
Siehe auch
Kategorien
Mehr zu Symbolic Math Toolbox finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!