Parameterstudie og kurvetilpasning for atombinding

Den generiske modellen for bindingsenergi fra Atombinding er bare en empirisk modell, og skal den ha noe nytte, må vi kunne finne/tilpasse de ulike parametrene slik at modellen passer med et virkelig system.

Oppsummering av relasjoner:

Energifunksjonen:

\begin{equation} E = -A r^{-m} + B r^{-n} \tag{1} \end{equation}

Kraft er energi derivert med hensyn på $r$

\begin{equation} F = mA r^{-m-1} -nB r^{-n-1} \tag{2} \end{equation}

Ved likevekt er $E = E_0$ når $r = r_0$ slik at (1) blir

\begin{equation} E_0 = -A r_0^{-m} + B r_0^{-n} \tag{3} \end{equation}

Ved likevekt er $F=0$ og ligning (2) blir dermed

\begin{equation} 0 = mA r_0^{-m-1} -nB r_0^{-n-1} \tag{4} \end{equation}

Dermed kan vi løse (3) og (4) med hensyn på $A$ og $B$:

Fra (4):

\begin{equation} B = \frac{m}{n} A r_0^{n-m} \tag{5} \end{equation}

Substituerer $B$ fra (5) i (3):

\begin{equation} A = -\frac{E_0 r_0^m}{1-m/n} \tag{6} \end{equation}

Bindingens stivhet $k$ ved likevektsavstanden $r_0$ er

\begin{equation} k = \frac{dF}{dr} \bigg |_{r=r_0} =-(m+1)mA r_0^{-m-2} + (n+1)nB r_0^{-n-2} \tag{7} \end{equation}

Separasjonsavstanden $r_s$ er der kraften har et maksimum:

\begin{equation} \frac{dF}{dr}\bigg |_{r=r_s} = 0 \Rightarrow -(m+1)mA r_s^{-m-2} + (n+1)nB r_s^{-n-2} = 0 \Rightarrow r_s = \bigg( \frac{m(m+1)A}{n(n+1)B} \bigg)^\frac{1}{m-n} \tag{8} \end{equation}

Maks kraft $F_s$ blir nå gitt av (2) innsatt for $r = r_s$ fra (8)

Numerisk eksempel:

In [1]:
import numpy as np
from matplotlib import pyplot as plt

E0 = -3        
r0 =  0.25      
m  =  8        
n  =  4       

A = -(E0*r0**m)/(1-m/n)    # ligning (6)
B = (m/n)*A*r0**(n-m)      # ligning (5)
        
r=np.linspace(0.2, 0.4, 1000) 
E = -A*r**(-m) + B*r**(-n)                          # ligning (1)
F = m*A*r**(-m-1) -n*B*r**(-n-1)                    # ligning (2)
k = -(m+1)*m*A*r0**(-m-2) + (n+1)*n*B*r0**(-n-2)    # ligning (7)
rs = ( (m*(m+1)*A)/(n*(n+1)*B) )**(1/(m-n))         # ligning (8)
Fs =  m*A*rs**(-m-1) -n*B*rs**(-n-1)                # ligning (2) for r=rs

fig,(ax1,ax2)=plt.subplots(nrows=1, ncols=2,figsize=(9,5))
ax1.plot(r,E ,color='blue',label='$E$')
ax1.set_xlabel('$r$ [nm]')
ax1.set_ylabel('$E$ [eV]')
ax1.legend(loc='best')
ax1.grid(True)
ax1.set_xlim(0.2,max(r))
ax1.set_ylim(E0*1.1,0)
ax1.set_title('$E_0$={}, $r_0$={}, $m$={:.1f}, $n$={:.1f}, $A$={:.2E}, $B$={:.2E}'.format(E0,r0,m,n,A,B), fontsize=10)

ax2.plot(r,F ,color='red',label='$F$')
ax2.set_xlabel('$r$ [nm]')
ax2.set_ylabel('$F$ [eV / nm]')
ax2.legend(loc='best')
ax2.grid(True)
ax2.set_xlim(0.2,max(r))
ax2.set_ylim(-Fs/3,Fs*1.1)
ax2.set_title('$F_s$={:.2f}, $r_s$={:.3f}, k={:.1f}'.format(Fs,rs,k), fontsize=10)

plt.tight_layout()
plt.draw()

Effekten av $m$ og $n$

Separasjonskraften $F_s$ og bindingens stivhet $k$ øker med økende verdier av $m$ og $n$ som vist i følgende eksempel:

In [2]:
E0 = -3          # holdes konstant
r0 =  0.25       # holdes konstant

fig,(ax1,ax2)=plt.subplots(nrows=1, ncols=2,figsize=(9,5))
r=np.linspace(0.2, 0.5, 1000)
for m,n in zip((2,2,2,3,3,3),(4,5,6,4,5,6)):
    A = -(E0*r0**m)/(1-m/n)    # ligning (6)
    B = (m/n)*A*r0**(n-m)      # ligning (5)
    E = -A*r**(-m) + B*r**(-n)                            # ligning (1)
    F =  m*A*r**(-m-1) -n*B*r**(-n-1)                     # ligning (2)
    k = -(m+1)*m*A*r0**(-m-2) + (n+1)*n*B*r0**(-n-2)      # ligning (7)
    
    ax1.plot(r,E ,label='m={}, n={}'.format(m,n))
    ax1.set_xlabel('$r$ [nm]')
    ax1.set_ylabel('$E$ [eV]')
    ax1.legend(loc='best')
    ax1.set_ylim(E0*1.1,0)
    ax1.grid(True)
    
    ax2.plot(r,F ,label='k={:.0f}'.format(k))
    ax2.set_xlabel('$r$ [nm]')
    ax2.set_ylabel('$F$ [eV]')
    ax2.legend(loc='best')
    ax2.set_ylim(-5,15)
    ax2.grid(True)    

plt.tight_layout()
plt.draw()

Parameter fra empiriske data

Anta at vi har, på en eller annen måte, funnet følgende data gjennom empiriske målinger:

$$E_0 = -4, \quad r_0 = 0.3, \quad k = 900, \quad F_s = 900$$

Hva blir verdiene av $m$, $n$, $A$ og $B$?

Nå har vi tilstrekkelig med ligninger og grensebetingelser, men vi har et system av ligninger som ikke akkurat er lineære. Systemet kan løses numerisk med f.eks. scipy.optimize.fsolve, men denne metoden krever uansett god første gjetting på startverdier for iterasjonene, så vi kan likegodt gjøre en mindre avansert prosess:

In [3]:
E0 = -4          # holdes konstant
r0 =  0.3        # holdes konstant

k_empirisk = 900
Fs_empirisk = 16

for i in range(0,1000000):          # kjører en million tester...
    m = 1+10*np.random.random()     # antar at n er mellom 1 og 10
    n = 1+10*np.random.random()     # antar at m er mellom 1 og 10

    A = -(E0*r0**m)/(1-m/n)                               # ligning (6)
    B = (m/n)*A*r0**(n-m)                                 # ligning (5)
    k = -(m+1)*m*A*r0**(-m-2) + (n+1)*n*B*r0**(-n-2)      # ligning (7)
    rs = ( (m*(m+1)*A)/(n*(n+1)*B) )**(1/(m-n))           # ligning (8)
    Fs =  m*A*rs**(-m-1) -n*B*rs**(-n-1)                  # ligning (2) for r=rs
    
    if abs(k-k_empirisk) < 1 and abs(Fs-Fs_empirisk) < 0.1:    # sjekker om resultater er tilstrekkelig nærme
        print('m:{:.2f}, n:{:.2f}, k:{:.1f}, Fs:{:.2f}'.format(m,n,k,Fs))
m:2.34, n:8.65, k:900.7, Fs:15.96
m:2.34, n:8.66, k:899.5, Fs:15.94
m:8.57, n:2.36, k:900.0, Fs:16.01
m:2.36, n:8.56, k:899.3, Fs:16.00
m:8.71, n:2.33, k:900.7, Fs:15.93
m:2.40, n:8.44, k:899.4, Fs:16.09
m:8.64, n:2.35, k:900.3, Fs:15.97
m:2.34, n:8.66, k:900.9, Fs:15.96
m:8.72, n:2.32, k:900.5, Fs:15.92
m:2.32, n:8.70, k:899.2, Fs:15.91
m:2.35, n:8.61, k:899.9, Fs:15.98
m:2.34, n:8.65, k:900.0, Fs:15.96
m:8.59, n:2.35, k:899.1, Fs:15.98
m:2.38, n:8.51, k:900.4, Fs:16.06
m:8.69, n:2.33, k:900.4, Fs:15.93
m:2.34, n:8.65, k:899.6, Fs:15.95
m:2.40, n:8.45, k:899.5, Fs:16.09
m:2.32, n:8.72, k:899.9, Fs:15.90
m:8.49, n:2.38, k:900.0, Fs:16.06
m:2.39, n:8.46, k:899.4, Fs:16.07
m:2.39, n:8.49, k:900.1, Fs:16.07
m:8.72, n:2.32, k:900.2, Fs:15.91
m:8.63, n:2.35, k:900.5, Fs:15.98
m:8.65, n:2.34, k:899.7, Fs:15.95
m:8.71, n:2.33, k:900.2, Fs:15.92

Resultatet viser at det er to sett av parameter som tilfredstiller empiriske data:

$$m \approx 2.3, \quad n \approx 8.6$$

og

$$m \approx 8.6, \quad n \approx 2.3$$

... og de gir identiske kurver:

In [4]:
fig,(ax1,ax2)=plt.subplots(nrows=1, ncols=2,figsize=(9,5))
r=np.linspace(0.2, 0.5, 1000)
for m,n in zip((2.3, 8.6),(8.6,2.3)):
    A = -(E0*r0**m)/(1-m/n)    # ligning (6)
    B = (m/n)*A*r0**(n-m)      # ligning (5)
    E = -A*r**(-m) + B*r**(-n)                            # ligning (1)
    F =  m*A*r**(-m-1) -n*B*r**(-n-1)                     # ligning (2)
    k = -(m+1)*m*A*r0**(-m-2) + (n+1)*n*B*r0**(-n-2)      # ligning (7)
    
    ax1.plot(r,E,label='m={}, n={}'.format(m,n))
    ax1.set_xlabel('$r$ [nm]')
    ax1.set_ylabel('$E$ [eV]')
    ax1.legend(loc='best')
    ax1.set_ylim(E0*1.1,0)
    ax1.grid(True)
    
    ax2.plot(r,F ,label='k={:.0f}'.format(k))
    ax2.set_xlabel('$r$ [nm]')
    ax2.set_ylabel('$F$ [eV]')
    ax2.legend(loc='best')
    ax2.set_ylim(-5,16)
    ax2.grid(True)    

plt.tight_layout()
plt.draw()
Hvilke sett av data for m og n er 'korrekt'? Vel, siden det ikke er tatt hensyn til hva som er attraktiv og hva som er repulsiv energi, spiller det ingen rolle. MEN, en konsistent betraktning med hensyn på hva som skjer når vi forsøker å presse atomer inn i hverandre i forhold til hva som skjer ved separasjon, leder til konklusjonen at n er den høye verdien og m er den lave verdien.

Energipotensialet uttrykt som

\begin{equation} E = -\frac{A}{r^m} + \frac{B}{r^n} \tag{1} \end{equation}

er en alternativ notasjon til Mie-potensialet som mer vanlig blir uttrykt på følgende form:

\begin{equation} E = C E_0 \bigg( \Big( \frac{r_c}{r} \Big)^m - \Big( \frac{r_c}{r} \Big)^n \bigg) \tag{9} \end{equation}

hvor

$$C = \frac{n}{n-m}\Big( \frac{n}{m} \Big) ^{\frac{m}{n-m}} $$

og parameteren $r_c$ angir hvor energien er null (til venstre for likevektsavstanden).

Sammenhengen mellom parametrene er illustrert i følgende kode:

In [5]:
E0 = -3        
r0 =  0.25      
m  =  4        
n  =  8       

A = -(E0*r0**m)/(1-m/n)    # ligning (6)
B = (m/n)*A*r0**(n-m)      # ligning (5)
        
r=np.linspace(0.15, 0.6, 50) 

E = -A*r**(-m) + B*r**(-n)                          # ligning (1)

C = (n/(n-m))*(n/m)**(m/(n-m))

rc = (-A/(E0*C))**(1/m)                             # Oppgave: vis denne sammenhengen

E_Mie = C*E0*((rc/r)**m - (rc/r)**n)                # ligning (9)

fig,ax=plt.subplots(nrows=1, ncols=1,figsize=(8,4))
ax.plot(r,E,color='red',label='(1)')
ax.plot(r,E_Mie,'.', color = 'blue', label='(9)')
ax.plot([rc,rc],[E0*1.1,0],'--', color = 'black')  # illustrerer hvor rc er

ax.set_xlabel('$r$ [nm]')
ax.set_ylabel('$E$ [eV]')
ax.legend(loc='best')
ax.grid(True)
ax.set_xlim(0.1,max(r))
ax.set_ylim(E0*1.1,2)

ax.set_title('$C$={}, $r_c$={:.3f}, $A$={:.2E}, $B$={:.2E}'.format(C,rc,A,B), fontsize=10)

plt.tight_layout()
plt.draw()

Et annet energipotensial som er mye brukt er Morse-potensialet som har følgende form:

\begin{equation} E = -E_0 \big(\exp(-2a(r-r_0)-2\exp(-a(r-r_e)) \big) \tag{10} \end{equation}
In [6]:
E0 = -3        
r0 =  0.25      
m  =  4        
n  =  8       

A = -(E0*r0**m)/(1-m/n)    # ligning (6)
B = (m/n)*A*r0**(n-m)      # ligning (5)
        
r=np.linspace(0.15, 0.6, 100) 

E = -A*r**(-m) + B*r**(-n)                                     # ligning (1)

a=16                                                           # tilpasset på øyemål i forhold til (1)
E_Morse = -E0*(np.exp(-2*a*(r-r0)) -2*np.exp(-a*(r-r0))  )     # ligning (10)

fig,ax=plt.subplots(nrows=1, ncols=1,figsize=(8,4))
ax.plot(r,E,color='red',label='(1)')
ax.plot(r,E_Morse, color = 'blue', label='(10)')

ax.set_xlabel('$r$ [nm]')
ax.set_ylabel('$E$ [eV]')
ax.legend(loc='best')
ax.grid(True)
ax.set_xlim(0.1,max(r))
ax.set_ylim(E0*1.1,2)


plt.tight_layout()
plt.draw()

Disclaimer:This site is designed for educational purposes only. There are most likely errors, mistakes, typos, and poorly crafted statements that are not detected yet... www.ntnu.edu/employees/nils.p.vedvik

Copyright 2023, All rights reserved