MATLAB에서 간단한 시뮬레이션을 해보세요.

소개



대학, 대학원에서는 수치 계산 소프트로서 MATLAB을 사용하는 분도 많은 것은 아닐까요.
역시 최근에는, python 인기라고 하는 일도 있어 MATLAB이 구별되지 않게 되어 있는 것 같지만, 수치 계산 전반에서는 코드가 매우 조립하기 쉽고, python에 비해도 구문을 간단하게 쓸 수 있는 일도 많다고 생각합니다 있습니다.
이번에는 MATLAB을 연구에서 사용하기 시작하는 사람이나 처음 사용하는 사람을 위해 구체적인 사용 예를 소개하고 싶습니다.

양자역학



MATLAB을 사용하는 예로는 "선형 대수 계산"과 "결과 시각화"의 가장 기본적인 예를 살펴 보겠습니다. 그 대상으로서 계의 에너지를 해밀턴으로 기술할 수 있는 양자역학을 예제로 들려고 합니다.

해밀턴



양자 역학에서 시스템의 에너지를 설명하는 것은 해밀턴이었다. 해밀턴의 고유치는 에너지입니다. 지금

「전자 스핀에 외부 자장을 인가했을 때에, 그 자장 강도와 자장 각도에 의해 어떠한 에너지를 취하는 것인가?」

를 시각화합니다. 여기에서는 MATLAB의 연습이 주제이므로 물리적 의미는 흥미 없으면 추구할 필요는 없습니다.
(※스핀의 양자화축을 $z$축 방향으로 취하고, $z$방향이 이루는 각도를 $\theta$로 정의합니다)

해밀턴은
H = DS_z^2\,+\,\gamma B_0S_{B_0} \\
S_{B_0} = S_z\cos\theta + S_x\sin\theta

로 나타냅니다. 문제는 자기장 각도 θ와 자기장 B입니다. 이것을 흔들어 H의 고유치를 구합시다(다른 파라미터는 모두 정수입니다).

tripletstate.m
clc
clear

Sx = 1/sqrt(2)*[0,1,0;1,0,1;0,1,0];
Sz = [1,0,0;0,0,0;0,0,-1];
Ns = size(Sz,1); 

% physical quantity
gamma = 2.8e+6;% Hz/G
Dgs = 2.87e+9;% GHz
Hdgs = Dgs*Sz.^2;

B0 = linspace(0,1200,1e+2); %等差数列を作る
Nb0 = length(B0);

theta = linspace(0,pi/2,1e+2);
Ntheta = length(theta);

Energy = zeros(Nb0,Ntheta,Ns); %3次元のゼロの配列
for refth = 1:Ntheta
    Sb0 = Sz*cos(theta(refth))+Sx*sin(theta(refth));
    for refb0 = 1:Nb0
        Hzeeman = gamma*B0(refb0)*Sb0;

        Htot = Hdgs+Hzeeman;

        E = eig(Htot);
        Energy(refb0,refth,1) = E(1);
        Energy(refb0,refth,2) = E(2);
        Energy(refb0,refth,3) = E(3);
    end
end

%グラフの描画
figure  
hold on
box on
for refl = 1:Ns
    surf(B0, theta/pi*180, Energy(:,:,refl)'*1e-9);
end
hold off

xlabel('B_0 (G)');
ylabel('\theta (deg)');
zlabel('Energy (GHz)');
shading('flat');
colorbar;


코드는 이것뿐입니다.
먼저 물리 상수 $ D $와 행렬 $ S_x, S_z $를 정의합니다. 여기에서는 파울리 행렬을 사용합니다.
for 문 직전에는 계산 영역을 확보합니다. 필요한 것은 2 변수에 대한 결과이므로 총 3 차원 영역이 필요하고 zeros를 사용하여 0 행렬을 만들어 둘 필요가 있습니다 (여기에 순차적으로 계산 결과를 저장합니다).

나머지는 for 문에서 $\theta $와 $ B_0 $의 각 요소에 대한 해밀턴을 계산합니다 (요소 수를 미리 Nb0, Ntheta로 얻는 것이 좋습니다).

해밀턴을 계산하고 마지막으로 eig를 사용하여 고유치를 계산합니다! 편리.

당연히, 각각의 $\theta$와 $B_0$에 대해서 계산하므로 for문내에서 Energy(refb0,refth,1)등에 차례차례 넣어 갈 필요가 있군요.

그래프 그리기



계산 결과를 토대로 그래프를 그립니다.
3차원에는 surf가 편리합니다. 또한 shading ( 'flat')을 넣으면 부드러운 곡선을 그릴 수 있습니다.

결과



이 해밀턴을 풀면 다음과 같은 그래프가 얻어졌다.


대학을 졸업 후, MATLAB은 사용할 수 없게 되어 버렸습니다 (웃음) 때문에, 이번은 Octave로 출력하고 있습니다. 그러나 코드는 정확히 동일하고 괜찮습니다. 3D도 그릴 수 있습니다.
물리적 의미는 자세히 설명하지 않지만 여기에서는 자기장과 각도를 변수로 하여 Energy(세로축)의 준위를 계산할 수 있었다. 고유치를 제대로 표현할 수 있었던 것 같습니다.

결론



이번에는 해밀턴의 고유치를 얻어 가시화했습니다.
그 과정에서,

1. 행렬 계산
2. 고유치 계산
3. 그래프 출력

는 매우 기본적인 것이지만, 계산 결과의 저장, for문이라고 하는 매우 중요한 요소도 사용되고 있습니다.

나는 코드를 작성하는 공부를 시작했을 때 무엇을해야할지 모르겠지만 처음에는 선배에게 썼다. 처음에는 모방에서 들어가는 것이 좋다고 생각합니다.
특히 물리를 시작한 학생들은 대학의 계산환경을 이용해 어떻습니까.

좋은 웹페이지 즐겨찾기