Cartoon of the formation of a bonding and an antibonding molecular orbital from the convergence of two atomic orbitals  

Matlab code 

% Program to generate a cartoon of two 1s atomic orbitals converging to

% produce bonding and antibonding orbitals

 

clear; close all;

 

vid = VideoWriter('bondingAntibonding.mp4','MPEG-4');

vid.Quality = 100;

vid.FrameRate = 60;

open(vid);

figure('units','pixels','position',[0 0 1920 1080],'ToolBar','none');

set(0,'defaultfigurecolor',[1 1 1]);

set(gca,'linewidth',10); 

 

myBlue = [0.25 0.28 0.5];

grey = [0.5 0.5 0.5]; 

 

resn = 0.01;

plotHalfWidth = 3; % Relative halfwidth from atom centre that wavefunction is plotted

plottedDataPts = 1 + plotHalfWidth/resn;

rao = 8; % Right atom origin at start

lao = -rao; % Left atom origin at start

vmoveMax = 7.1; 

L = (0:resn:2*rao+plotHalfWidth);

bondLength = 2.5; 

nuclearRadius = 0.2; 

I0 = 3.5; % Height of isolated wavefunction

 

theta = (0:pi/45:2*pi);

x = nuclearRadius*sin(theta);

y = nuclearRadius*cos(theta);

 

% Creation of bonding orbital 

% ___________________________

 

for move = 0:0.025:rao-bondLength/2 % For loop converging two atomic orbitals 

    hold off

    % Decay of atom wavefunction to right

    Int1 = exp(-(L));

    % Decay of atom wavefunction to left

    Int2 = exp(L-plotHalfWidth);

    % Component due to right atom wavefunction bleeding in to right part of

    % left atom wavefunction

    Int3 = exp(L-2*(rao-move));

    % Component due to right atom wavefunction bleeding in to left part of

    % left atom wavefunction

    Int4 = exp(L-2*(rao-move)-plotHalfWidth);

    

    IntLR1 = I0*(Int1 + Int3); % Righthand side of left wavefunction 

    IntLL1 = I0*(Int2 + Int4); % Lefthand side of left wavefunction     

    decayRange1 = L(1:plottedDataPts)+lao+move; 

    m1 = (decayRange1 <= 0);

    plot(decayRange1(m1),IntLR1(m1),'lineWidth',4,'Color',myBlue);

    hold on

    line([lao-plotHalfWidth lao+plotHalfWidth],[0 0],'Color',grey,'linewidth',8) 

    line([rao-plotHalfWidth rao+plotHalfWidth],[0 0],'Color',grey,'linewidth',8)  

    plot(L(1:plottedDataPts)+lao+move-plotHalfWidth,IntLL1(1:plottedDataPts),...

        'lineWidth',4,'Color',myBlue);

 

    % Repeat mirror image wavefunction on right hand side 

    plot(-decayRange1(m1),IntLR1(m1),'lineWidth',4,'Color',myBlue);

    plot(-L(1:plottedDataPts)-lao-move+plotHalfWidth,IntLL1(1:plottedDataPts),...

        'lineWidth',4,'Color',myBlue);

 

    presentAtomOrigin = L(1)+lao+move;

    fill(x+presentAtomOrigin,y,myBlue,'linestyle','none')

    fill(x-presentAtomOrigin,y,myBlue,'linestyle','none')

    axis equal 

    axis off 

    xlim([lao-plotHalfWidth rao+plotHalfWidth]);

    ylim([-7.3 11]);

    frame = getframe(gcf);

    writeVideo(vid,frame);

end

pauseMov(vid,60) 

for vmove = 0:vmoveMax/120:vmoveMax % Move resulting molecular orbital down by vmoveMax 

    hold off 

    plot(decayRange1(m1),IntLR1(m1)-vmove,'lineWidth',4,'Color',myBlue); 

    hold on

    line([lao-plotHalfWidth lao+plotHalfWidth],[0 0],'Color',grey,'linewidth',8) 

    line([rao-plotHalfWidth rao+plotHalfWidth],[0 0],'Color',grey,'linewidth',8)  

    plot(L(1:plottedDataPts)+lao+move-plotHalfWidth,IntLL1(1:plottedDataPts)-vmove,...

        'lineWidth',4,'Color',myBlue);

    if (vmove == vmoveMax) 

        plotx1 = decayRange1(m1); % x-values associated with IntLR1 in final molecular orbital 

        plotx2 = L(1:plottedDataPts)+lao+move-plotHalfWidth; % x-values associated with IntLL1 in final molecular orbital

        ploty1 = IntLR1(m1); 

    end 

 

    % Repeat mirror image wavefunction on right hand side 

    plot(-decayRange1(m1),IntLR1(m1)-vmove,'lineWidth',4,'Color',myBlue);

    plot(-L(1:plottedDataPts)-lao-move+plotHalfWidth,IntLL1(1:plottedDataPts)-vmove,...

        'lineWidth',4,'Color',myBlue);

    fill(x+presentAtomOrigin,y-vmove,myBlue,'linestyle','none')

    fill(x-presentAtomOrigin,y-vmove,myBlue,'linestyle','none')

    axis equal 

    axis off 

    xlim([lao-plotHalfWidth rao+plotHalfWidth]);

    ylim([-7.3 11]);

    frame = getframe(gcf);

    writeVideo(vid,frame);

end 

for fadeIn = 0:0.025:1 % Fade in molecular orbital energy level 

    hold off 

    plot(decayRange1(m1),IntLR1(m1)-vmove,'lineWidth',4,'Color',myBlue); 

    hold on

    line([lao-plotHalfWidth lao+plotHalfWidth],[0 0],'Color',grey,'linewidth',8) 

    line([rao-plotHalfWidth rao+plotHalfWidth],[0 0],'Color',grey,'linewidth',8)  

    plot(L(1:plottedDataPts)+lao+move-plotHalfWidth,IntLL1(1:plottedDataPts)-vmove,...

        'lineWidth',4,'Color',myBlue);

 

    % Repeat mirror image wavefunction on right hand side 

    plot(-decayRange1(m1),IntLR1(m1)-vmove,'lineWidth',4,'Color',myBlue);

    plot(-L(1:plottedDataPts)-lao-move+plotHalfWidth,IntLL1(1:plottedDataPts)-vmove,...

        'lineWidth',4,'Color',myBlue);

    bond = line([-plotHalfWidth-bondLength/2 plotHalfWidth+bondLength/2],...

        [-vmove -vmove],'Color',grey,'linewidth',8); 

    bond.Color(4) = fadeIn;

    fill(x+presentAtomOrigin,y-vmove,myBlue,'linestyle','none')

    fill(x-presentAtomOrigin,y-vmove,myBlue,'linestyle','none')

    axis equal 

    axis off 

    xlim([lao-plotHalfWidth rao+plotHalfWidth]);

    ylim([-7.3 11]);

    frame = getframe(gcf);

    writeVideo(vid,frame);

end 

pauseMov(vid,60)

 

% Creation of antibonding orbital 

% _______________________________

 

 

for fadeIn = 0:1/90:1 % For loop fading in out-of-phase orbitals 

    hold off

    % Decay of atom wavefunction to right

    Int1 = exp(-(L));

    % Decay of atom wavefunction to left

    Int2 = exp(L-plotHalfWidth);

    % Component due to right atom wavefunction bleeding in to right part of

    % left atom wavefunction

    Int3 = -exp(L-2*(rao));

    % Component due to right atom wavefunction bleeding in to left part of

    % left atom wavefunction

    Int4 = -exp(L-2*(rao)-plotHalfWidth);

    

    IntLR2 = I0*(Int1 + Int3); % Righthand side of left wavefunction 

    IntLL2 = I0*(Int2 + Int4); % Lefthand side of left wavefunction     

    decayRange1 = L(1:plottedDataPts)+lao; 

    m1 = (decayRange1 <= 0);

    plot(decayRange1(m1),IntLR2(m1),'lineWidth',4,'Color',[0.25 0.28 0.5 fadeIn]);

    hold on

    line([lao-plotHalfWidth lao+plotHalfWidth],[0 0],'Color',grey,'linewidth',8) 

    line([rao-plotHalfWidth rao+plotHalfWidth],[0 0],'Color',grey,'linewidth',8)  

    plot(L(1:plottedDataPts)+lao-plotHalfWidth,IntLL2(1:plottedDataPts),...

        'lineWidth',4,'Color',[0.25 0.28 0.5 fadeIn]);

 

    % Repeat mirror image wavefunction on right hand side 

    plot(-decayRange1(m1),-IntLR2(m1),'lineWidth',4,'Color',[1 0 0 fadeIn]);

    plot(-L(1:plottedDataPts)-lao+plotHalfWidth,-IntLL2(1:plottedDataPts),...

        'lineWidth',4,'Color',[1 0 0 fadeIn]);

 

    presentAtomOrigin = L(1)+lao;

    core1 = fill(x+presentAtomOrigin,y,myBlue,'linestyle','none'); 

    set(core1,'facealpha',fadeIn);

    core2 = fill(x-presentAtomOrigin,y,myBlue,'linestyle','none'); 

    set(core2,'facealpha',fadeIn);

    

    % Replot lower bonding orbital 

    plot(plotx1,ploty1-vmoveMax,'lineWidth',4,'Color',myBlue); 

    plot(plotx2,IntLL1(1:plottedDataPts)-vmoveMax,...

        'lineWidth',4,'Color',myBlue);

 

    % Repeat mirror image wavefunction on right hand side 

    plot(-plotx1,ploty1-vmoveMax,'lineWidth',4,'Color',myBlue);

    plot(-plotx2,IntLL1(1:plottedDataPts)-vmoveMax,...

        'lineWidth',4,'Color',myBlue);

    bond = line([-plotHalfWidth-bondLength/2 plotHalfWidth+bondLength/2],...

        [-vmoveMax -vmoveMax],'Color',grey,'linewidth',8); 

    fill(x+bondLength/2,y-vmoveMax,myBlue,'linestyle','none')

    fill(x-bondLength/2,y-vmoveMax,myBlue,'linestyle','none')

 

    axis equal 

    axis off 

    xlim([lao-plotHalfWidth rao+plotHalfWidth]);

    ylim([-7.3 11]);

    frame = getframe(gcf);

    writeVideo(vid,frame);

end

for move = 0:0.025:rao-bondLength/2 % For loop converging two atomic orbitals 

    hold off

    % Decay of atom wavefunction to right

    Int1 = exp(-(L));

    % Decay of atom wavefunction to left

    Int2 = exp(L-plotHalfWidth);

    % Component due to right atom wavefunction bleeding in to right part of

    % left atom wavefunction

    Int3 = -exp(L-2*(rao-move));

    % Component due to right atom wavefunction bleeding in to left part of

    % left atom wavefunction

    Int4 = -exp(L-2*(rao-move)-plotHalfWidth);

    

    IntLR2 = I0*(Int1 + Int3); % Righthand side of left wavefunction 

    IntLL2 = I0*(Int2 + Int4); % Lefthand side of left wavefunction     

    decayRange1 = L(1:plottedDataPts)+lao+move; 

    m1 = (decayRange1 <= 0);

    plot(decayRange1(m1),IntLR2(m1),'lineWidth',4,'Color',myBlue);

    hold on

    line([lao-plotHalfWidth lao+plotHalfWidth],[0 0],'Color',grey,'linewidth',8) 

    line([rao-plotHalfWidth rao+plotHalfWidth],[0 0],'Color',grey,'linewidth',8)  

    plot(L(1:plottedDataPts)+lao+move-plotHalfWidth,IntLL2(1:plottedDataPts),...

        'lineWidth',4,'Color',myBlue);

 

    % Repeat mirror image wavefunction on right hand side 

    plot(-decayRange1(m1),-IntLR2(m1),'lineWidth',4,'Color','r');

    plot(-L(1:plottedDataPts)-lao-move+plotHalfWidth,-IntLL2(1:plottedDataPts),...

        'lineWidth',4,'Color','r');

 

    presentAtomOrigin = L(1)+lao+move;

    fill(x+presentAtomOrigin,y,myBlue,'linestyle','none')

    fill(x-presentAtomOrigin,y,myBlue,'linestyle','none'

    

    % Replot lower bonding orbital 

    plot(plotx1,ploty1-vmoveMax,'lineWidth',4,'Color',myBlue); 

    plot(plotx2,IntLL1(1:plottedDataPts)-vmoveMax,...

        'lineWidth',4,'Color',myBlue);

 

    % Repeat mirror image wavefunction on right hand side 

    plot(-plotx1,ploty1-vmoveMax,'lineWidth',4,'Color',myBlue);

    plot(-plotx2,IntLL1(1:plottedDataPts)-vmoveMax,...

        'lineWidth',4,'Color',myBlue);

    bond = line([-plotHalfWidth-bondLength/2 plotHalfWidth+bondLength/2],...

        [-vmoveMax -vmoveMax],'Color',grey,'linewidth',8); 

    fill(x+bondLength/2,y-vmoveMax,myBlue,'linestyle','none')

    fill(x-bondLength/2,y-vmoveMax,myBlue,'linestyle','none')

 

    axis equal 

    axis off 

    xlim([lao-plotHalfWidth rao+plotHalfWidth]);

    ylim([-7.3 11]);

    frame = getframe(gcf);

    writeVideo(vid,frame);

    if (move==0) 

        pauseMov(vid,240) 

    end     

end

pauseMov(vid,60) 

for vmove = 0:vmoveMax/120:vmoveMax % Move resulting molecular orbital up by vmoveMax 

    hold off 

    plot(decayRange1(m1),IntLR2(m1)+vmove,'lineWidth',4,'Color',myBlue); 

    hold on

    line([lao-plotHalfWidth lao+plotHalfWidth],[0 0],'Color',grey,'linewidth',8) 

    line([rao-plotHalfWidth rao+plotHalfWidth],[0 0],'Color',grey,'linewidth',8)  

    plot(L(1:plottedDataPts)+lao+move-plotHalfWidth,IntLL2(1:plottedDataPts)+vmove,...

        'lineWidth',4,'Color',myBlue);

 

    % Repeat mirror image wavefunction on right hand side 

    plot(-decayRange1(m1),-IntLR2(m1)+vmove,'lineWidth',4,'Color','r');

    plot(-L(1:plottedDataPts)-lao-move+plotHalfWidth,-IntLL2(1:plottedDataPts)+vmove,...

        'lineWidth',4,'Color','r');

    fill(x+presentAtomOrigin,y+vmove,myBlue,'linestyle','none')

    fill(x-presentAtomOrigin,y+vmove,myBlue,'linestyle','none'

    

    % Replot lower bonding orbital 

    plot(plotx1,ploty1-vmoveMax,'lineWidth',4,'Color',myBlue); 

    plot(plotx2,IntLL1(1:plottedDataPts)-vmoveMax,...

        'lineWidth',4,'Color',myBlue);

 

    % Repeat mirror image wavefunction on right hand side 

    plot(-plotx1,ploty1-vmoveMax,'lineWidth',4,'Color',myBlue);

    plot(-plotx2,IntLL1(1:plottedDataPts)-vmoveMax,...

        'lineWidth',4,'Color',myBlue);

    bond = line([-plotHalfWidth-bondLength/2 plotHalfWidth+bondLength/2],...

        [-vmoveMax -vmoveMax],'Color',grey,'linewidth',8); 

    fill(x+bondLength/2,y-vmoveMax,myBlue,'linestyle','none')

    fill(x-bondLength/2,y-vmoveMax,myBlue,'linestyle','none')

 

    axis equal 

    axis off 

    xlim([lao-plotHalfWidth rao+plotHalfWidth]);

    ylim([-7.3 11]);

    frame = getframe(gcf);

    writeVideo(vid,frame);

end 

for fadeIn = 0:0.025:1 % Fade in molecular orbital energy level 

    hold off 

    plot(decayRange1(m1),IntLR2(m1)+vmove,'lineWidth',4,'Color',myBlue); 

    hold on

    line([lao-plotHalfWidth lao+plotHalfWidth],[0 0],'Color',grey,'linewidth',8) 

    line([rao-plotHalfWidth rao+plotHalfWidth],[0 0],'Color',grey,'linewidth',8)  

    plot(L(1:plottedDataPts)+lao+move-plotHalfWidth,IntLL2(1:plottedDataPts)+vmove,...

        'lineWidth',4,'Color',myBlue);

 

    % Repeat mirror image wavefunction on right hand side 

    plot(-decayRange1(m1),-IntLR2(m1)+vmove,'lineWidth',4,'Color','r');

    plot(-L(1:plottedDataPts)-lao-move+plotHalfWidth,-IntLL2(1:plottedDataPts)+vmove,...

        'lineWidth',4,'Color','r');

    bond = line([-plotHalfWidth-bondLength/2 plotHalfWidth+bondLength/2],...

        [vmove vmove],'Color',grey,'linewidth',8); 

    bond.Color(4) = fadeIn;

    fill(x+presentAtomOrigin,y+vmove,myBlue,'linestyle','none')

    fill(x-presentAtomOrigin,y+vmove,myBlue,'linestyle','none'

    

    % Replot lower bonding orbital 

    plot(plotx1,ploty1-vmoveMax,'lineWidth',4,'Color',myBlue); 

    plot(plotx2,IntLL1(1:plottedDataPts)-vmoveMax,...

        'lineWidth',4,'Color',myBlue);

 

    % Repeat mirror image wavefunction on right hand side 

    plot(-plotx1,ploty1-vmoveMax,'lineWidth',4,'Color',myBlue);

    plot(-plotx2,IntLL1(1:plottedDataPts)-vmoveMax,...

        'lineWidth',4,'Color',myBlue);

    bond = line([-plotHalfWidth-bondLength/2 plotHalfWidth+bondLength/2],...

        [-vmoveMax -vmoveMax],'Color',grey,'linewidth',8); 

    fill(x+bondLength/2,y-vmoveMax,myBlue,'linestyle','none')

    fill(x-bondLength/2,y-vmoveMax,myBlue,'linestyle','none')

 

    axis equal 

    axis off 

    xlim([lao-plotHalfWidth rao+plotHalfWidth]);

    ylim([-7.3 11]);

    frame = getframe(gcf);

    writeVideo(vid,frame);

end 

 

%Output the movie as an mpg file

close(vid);