diff --git a/Project.toml b/Project.toml
index d151dc7..9735fec 100644
--- a/Project.toml
+++ b/Project.toml
@@ -1,7 +1,7 @@
name = "Antique"
uuid = "be6e5d0e-34a5-4c8f-af83-e1b5389203d8"
authors = ["Shuhei Ohno"]
-version = "0.1.2"
+version = "0.2.0"
[deps]
SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b"
diff --git a/README.md b/README.md
index 66b9ea0..fc1ab5e 100644
--- a/README.md
+++ b/README.md
@@ -16,7 +16,7 @@ using Pkg; Pkg.add("Antique")
## Usage & Examples
-Install Antique.jl for the first use and run `using Antique` before each use. The function `antique(model, parameters...)` returns a module that has `E`, `ψ`, `V` and some other functions. Here are examples in hydrogen-like atom. The analytical notation of energy (eigen value of the Hamiltonian) is written as
+Install Antique.jl for the first use and run `using Antique` before each use. The energy `E()`, wavefunction `ψ()`, potential `V()` and some other functions are suppoted. Here are examples in hydrogen-like atom. The analytical notation of energy (eigen value of the Hamiltonian) is written as
```math
E_n = -\frac{Z^2}{2n^2} E_\mathrm{h}.
@@ -26,8 +26,8 @@ Hydrogen atom has symbol $\mathrm{H}$ and atomic number 1 ($Z=1$). Therefore the
```julia
using Antique
-H = antique(:HydrogenAtom, Z=1)
-H.E(n=1)
+H = HydrogenAtom(Z=1)
+E(H)
# output> -0.5
```
@@ -35,8 +35,8 @@ Helium cation has symbol $\mathrm{He}^+$ and atomic number 2 ($Z=2$). Therefore
```julia
using Antique
-He⁺ = antique(:HydrogenAtom, Z=2)
-He⁺.E(n=1)
+He⁺ = HydrogenAtom(Z=2)
+E(He⁺)
# output> -2.0
```
@@ -44,10 +44,10 @@ There are more examples on each model page.
## Supported Models
-- [Infinite Potential Well](https://ohno.github.io/Antique.jl/dev/InfinitePotentialWell/) `:InfinitePotentialWell`
-- [Harmonic Oscillator](https://ohno.github.io/Antique.jl/dev/HarmonicOscillator/) `:HarmonicOscillator`
-- [Morse Potential](https://ohno.github.io/Antique.jl/dev/MorsePotential/) `:MorsePotential`
-- [Hydrogen Atom](https://ohno.github.io/Antique.jl/dev/HydrogenAtom/) `:HydrogenAtom`
+- [Infinite Potential Well](https://ohno.github.io/Antique.jl/dev/InfinitePotentialWell/) `InfinitePotentialWell`
+- [Harmonic Oscillator](https://ohno.github.io/Antique.jl/dev/HarmonicOscillator/) `HarmonicOscillator`
+- [Morse Potential](https://ohno.github.io/Antique.jl/dev/MorsePotential/) `MorsePotential`
+- [Hydrogen Atom](https://ohno.github.io/Antique.jl/dev/HydrogenAtom/) `HydrogenAtom`
## Future Works
diff --git a/developer/dev.ipynb b/developer/dev.ipynb
index 0ac587b..e025792 100644
--- a/developer/dev.ipynb
+++ b/developer/dev.ipynb
@@ -10,21 +10,66 @@
"name": "stderr",
"output_type": "stream",
"text": [
- "\u001b[32m\u001b[1m Activating\u001b[22m\u001b[39m new project at `C:\\Users\\user\\Desktop\\GitHub\\Antique.jl\\developer`\n"
+ "\u001b[32m\u001b[1m Activating\u001b[22m\u001b[39m project at `C:\\Users\\user\\Desktop\\Antique.jl`\n",
+ "\u001b[36m\u001b[1m[ \u001b[22m\u001b[39m\u001b[36m\u001b[1mInfo: \u001b[22m\u001b[39mPrecompiling Antique [be6e5d0e-34a5-4c8f-af83-e1b5389203d8]\n"
]
}
],
"source": [
- "include(\"revice.jl\")"
+ "# run `include(\"./developer/revice.jl\")`\n",
+ "using Pkg\n",
+ "Pkg.instantiate()\n",
+ "# Pkg.add(\"Revise\")\n",
+ "using Revise\n",
+ "Pkg.activate(\"../\")\n",
+ "using Antique"
]
},
{
"cell_type": "code",
- "execution_count": null,
- "id": "97a634d3",
+ "execution_count": 2,
+ "id": "526ca10f",
"metadata": {},
- "outputs": [],
- "source": []
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "-0.5"
+ ]
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "using Antique\n",
+ "H = HydrogenAtom(Z=1)\n",
+ "E(H)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "4e1782eb",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "-2.0"
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "using Antique\n",
+ "He⁺ = HydrogenAtom(Z=2)\n",
+ "E(He⁺)"
+ ]
}
],
"metadata": {
diff --git a/docs/jmd2md.jl b/docs/jmd2md.jl
index f6929f6..0f2df33 100644
--- a/docs/jmd2md.jl
+++ b/docs/jmd2md.jl
@@ -1,7 +1,7 @@
using Antique
using Weave
-for file in Antique.models # [:InfinitePotentialWell]
+for file in Antique.models # [:InfinitePotentialWell :HarmonicOscillator :MorsePotential :HydrogenAtom]
weave("./src/jmd/$file.jmd", doctype="github", out_path="./src/", fig_path="./assets/fig/")
text = Antique.load("./src/$file.md")
# remove ``` after include(...s)
diff --git a/docs/src/HarmonicOscillator.md b/docs/src/HarmonicOscillator.md
index 43549f0..cf90e5e 100644
--- a/docs/src/HarmonicOscillator.md
+++ b/docs/src/HarmonicOscillator.md
@@ -25,7 +25,7 @@ The harmonic oscillator is the most frequently used model in quantum physics.
```
#### Potential
-`V(x; k=k, m=m, ω=sqrt(k/m))`
+`V(model::HarmonicOscillator; x)`
```math
V(x)
= \frac{1}{2} k x^2
@@ -34,19 +34,19 @@ The harmonic oscillator is the most frequently used model in quantum physics.
```
#### Eigen Values
-`E(n; k, m, ω=sqrt(k/m), ℏ=ℏ)`
+`E(model::HarmonicOscillator; n=0)`
```math
E_n = \hbar \omega \left( n + \frac{1}{2} \right)
```
#### Eigen Functions
-`ψ(n, x; k=k, m=m, ω=sqrt(k/m), ℏ=ℏ)`
+`ψ(model::HarmonicOscillator, x; n=0)`
```math
\psi_n(x) = A_n H_n(\xi) \exp{\left( -\frac{\xi^2}{2} \right)}
```
#### Hermite Polynomials
-`H(x; n=0)`
+`H(model::HarmonicOscillator, x; n=0)`
Rodrigues' formula & closed-form:
```math
@@ -88,11 +88,11 @@ Examples:
## Usage & Examples
-[Install Antique.jl](@ref Install) for the first use and run `using Antique` before each use. The function `antique(model, parameters...)` returns a module that has `E()`, `ψ(x)`, `V(x)` and some other functions. In this system, the model name is specified by `:HarmonicOscillator` and several parameters `k`, `m` and `ℏ` are set as optional arguments.
+[Install Antique.jl](@ref Install) for the first use and run `using Antique` before each use. The energy `E()`, wavefunction `ψ()`, potential `V()` and some other functions are suppoted. In this system, the model is generated by `HarmonicOscillator` and several parameters `k`, `m` and `ℏ` are set as optional arguments.
```julia
using Antique
-HO = antique(:HarmonicOscillator, k=1.0, m=1.0, ℏ=1.0)
+HO = HarmonicOscillator(k=1.0, m=1.0, ℏ=1.0)
```
@@ -116,10 +116,10 @@ julia> HO.ℏ
Eigen values:
```julia
-julia> HO.E(n=0)
+julia> E(HO, n=0)
0.5
-julia> HO.E(n=1)
+julia> E(HO, n=1)
1.5
```
@@ -129,7 +129,7 @@ Potential energy curve:
```julia
using Plots
-plot(-5:0.1:5, x -> HO.V(x), lw=2, label="", xlabel="x", ylabel="V(x)")
+plot(-5:0.1:5, x -> V(HO, x), lw=2, label="", xlabel="x", ylabel="V(x)")
```
![](./assets/fig//HarmonicOscillator_4_1.png)
@@ -141,11 +141,11 @@ Wave functions:
```julia
using Plots
plot(xlim=(-5,5), xlabel="x", ylabel="ψ(x)")
-plot!(x -> HO.ψ(x, n=0), label="n=0", lw=2)
-plot!(x -> HO.ψ(x, n=1), label="n=1", lw=2)
-plot!(x -> HO.ψ(x, n=2), label="n=2", lw=2)
-plot!(x -> HO.ψ(x, n=3), label="n=3", lw=2)
-plot!(x -> HO.ψ(x, n=4), label="n=4", lw=2)
+plot!(x -> ψ(HO, x, n=0), label="n=0", lw=2)
+plot!(x -> ψ(HO, x, n=1), label="n=1", lw=2)
+plot!(x -> ψ(HO, x, n=2), label="n=2", lw=2)
+plot!(x -> ψ(HO, x, n=3), label="n=3", lw=2)
+plot!(x -> ψ(HO, x, n=4), label="n=4", lw=2)
```
![](./assets/fig//HarmonicOscillator_5_1.png)
@@ -159,13 +159,13 @@ using Plots
plot(xlim=(-5.5,5.5), ylim=(-0.2,5.4), xlabel="\$x\$", ylabel="\$V(x),~E_n,~\\psi_n(x)\\times0.5+E_n\$", size=(480,400), dpi=300)
for n in 0:4
# energy
- hline!([HO.E(n=n)], lc=:black, ls=:dash, label="")
- plot!([-sqrt(2*HO.k*HO.E(n=n)),sqrt(2*HO.k*HO.E(n=n))], fill(HO.E(n=n),2), lc=:black, lw=2, label="")
+ hline!([E(HO, n=n)], lc=:black, ls=:dash, label="")
+ plot!([-sqrt(2*HO.k*E(HO, n=n)),sqrt(2*HO.k*E(HO, n=n))], fill(E(HO, n=n),2), lc=:black, lw=2, label="")
# wave function
- plot!(x -> HO.E(n=n) + 0.5*HO.ψ(x,n=n), lc=n+1, lw=2, label="")
+ plot!(x -> E(HO, n=n) + 0.5*ψ(HO, x,n=n), lc=n+1, lw=2, label="")
end
# potential
-plot!(x -> HO.V(x), lc=:black, lw=2, label="")
+plot!(x -> V(HO, x), lc=:black, lw=2, label="")
```
![](./assets/fig//HarmonicOscillator_6_1.png)
diff --git a/docs/src/HydrogenAtom.md b/docs/src/HydrogenAtom.md
index fe64521..cc85334 100644
--- a/docs/src/HydrogenAtom.md
+++ b/docs/src/HydrogenAtom.md
@@ -22,7 +22,7 @@ The hydrogen atom is the simplest 2-body Coulomb system.
Where, $\mu=\left(\frac{1}{m_\mathrm{e}}+\frac{1}{m_\mathrm{p}}\right)^{-1}$ is the reduced mass of electron $\mathrm{e}$ and proton $\mathrm{p}$. $\mu = m_\mathrm{e}$ holds in the limit $m_\mathrm{p}\rightarrow\infty$.
#### Potential
-`V(r; Z=Z, a₀=a₀)`
+`V(model::HydrogenAtom, r)`
```math
\begin{aligned}
V(r)
@@ -33,27 +33,27 @@ Where, $\mu=\left(\frac{1}{m_\mathrm{e}}+\frac{1}{m_\mathrm{p}}\right)^{-1}$ is
```
#### Eigen Values
-`E(; n=1, Z=Z, Eₕ=Eₕ)`
+`E(model::HydrogenAtom; n=1)`
```math
E_n = -\frac{m_\mathrm{e} e^4 Z^2}{2n^2(4\pi\varepsilon_0)^2\hbar^2} = -\frac{Z^2}{2n^2} E_\mathrm{h}
```
Where, ``E_\mathrm{h}`` is the Hartree energy, one of atomic unit. About atomic units, see section 3.9.2 of the [IUPAC GreenBook](https://iupac.org/what-we-do/books/greenbook/). In other units, ``E_\mathrm{h} = 27.211~386~245~988(53)~\mathrm{eV}`` from [here](https://physics.nist.gov/cgi-bin/cuu/Value?hrev).
#### Eigen Functions
-`ψ(r, θ, φ; n=1, l=0, m=0, Z=Z, a₀=a₀)`
+`ψ(model::HydrogenAtom, r, θ, φ; n=1, l=0, m=0)`
```math
\psi_{nlm}(\pmb{r}) = R_{nl}(r) Y_{lm}(\theta,\varphi)
```
#### Radial Functions
-`R(r; n=1, l=0, Z=Z, a₀=a₀)`
+`R(model::HydrogenAtom, r; n=1, l=0)`
```math
R_{nl}(r) = -\sqrt{\frac{(n-l-1)!}{2n(n+l)!} \left(\frac{2Z}{n a_0}\right)^3} \left(\frac{2Zr}{n a_0}\right)^l \exp \left(-\frac{Zr}{n a_0}\right) L_{n+l}^{2l+1} \left(\frac{2Zr}{n a_0}\right)
```
Where, Laguerre polynomials are defined as ``L_n(x) = \frac{1}{n!} \mathrm{e}^x \frac{\mathrm{d}^n}{\mathrm{d}x ^n} \left( \mathrm{e}^{-x} x^n \right)``, and associated Laguerre polynomials are defined as ``L_n^{k}(x) = \frac{\mathrm{d}^k}{\mathrm{d}x^k} L_n(x)``. Note that, replace ``2n(n+l)!`` with ``2n[(n+l)!]^3`` if Laguerre polynomials are defined as ``L_n(x) = \mathrm{e}^x \frac{\mathrm{d}^n}{\mathrm{d}x ^n} \left( \mathrm{e}^{-x} x^n \right)``.
#### Associated Laguerre Polynomials
-`L(x; n=0, k=0)`
+`L(model::HydrogenAtom, x; n=0, k=0)`
Rodrigues' formula & closed-form:
```math
@@ -91,7 +91,7 @@ Examples:
```
#### Spherical Harmonics
-`Y(θ, φ; l=0, m=0)`
+`Y(model::HydrogenAtom, θ, φ; l=0, m=0)`
```math
Y_{lm}(\theta,\varphi) = (-1)^{\frac{|m|+m}{2}} \sqrt{\frac{2l+1}{4\pi} \frac{(l-|m|)!}{(l+|m|)!}} P_l^{|m|} (\cos\theta) \mathrm{e}^{im\varphi}
```
@@ -101,7 +101,7 @@ i^{|m|+m} \sqrt{\frac{(l-|m|)!}{(l+|m|)!}} P_l^{|m|} = (-1)^{\frac{|m|+m}{2}} \s
```
#### Associated Legendre Polynomials
-`P(x; n=0, m=0)`
+`P(model::HydrogenAtom, x; n=0, m=0)`
Rodrigues' formula & closed-form:
```math
@@ -151,11 +151,11 @@ Examples:
## Usage & Examples
-[Install Antique.jl](@ref Install) for the first use and run `using Antique` before each use. The function `antique(model, parameters...)` returns a module that has `E()`, `ψ(r)`, `V(r)` and some other functions. In this system, the model name is specified by `:HydrogenAtom` and several parameters `Z`, `Eₕ`, `mₑ`, `a₀` and `ℏ` are set as optional arguments.
+[Install Antique.jl](@ref Install) for the first use and run `using Antique` before each use. The energy `E()`, wavefunction `ψ()`, potential `V()` and some other functions are suppoted. In this system, the model is generated by `HydrogenAtom` and several parameters `Z`, `Eₕ`, `mₑ`, `a₀` and `ℏ` are set as optional arguments.
```julia
using Antique
-H = antique(:HydrogenAtom, Z=1, Eₕ=1.0, a₀=1.0, mₑ=1.0, ℏ=1.0)
+H = HydrogenAtom(Z=1, Eₕ=1.0, a₀=1.0, mₑ=1.0, ℏ=1.0)
```
@@ -185,10 +185,10 @@ julia> H.ℏ
Eigen values:
```julia
-julia> H.E(n=1)
+julia> E(H, n=1)
-0.5
-julia> H.E(n=2)
+julia> E(H, n=2)
-0.125
```
@@ -198,8 +198,8 @@ Wave length ($n=2\rightarrow1$, the first line of the Lyman series):
```julia
Eₕ2nm⁻¹ = 2.1947463136320e-2 # https://physics.nist.gov/cgi-bin/cuu/CCValue?hrminv
-println("ΔE = ", H.E(n=2) - H.E(n=1), " Eₕ")
-println("λ = ", ((H.E(n=2)-H.E(n=1))*Eₕ2nm⁻¹)^-1, " nm")
+println("ΔE = ", E(H,n=2) - E(H,n=1), " Eₕ")
+println("λ = ", ((E(H,n=2)-E(H,n=1))*Eₕ2nm⁻¹)^-1, " nm")
```
```
@@ -226,7 +226,7 @@ ge = 2.00231930436256 # https://physics.nist.gov/cgi-bin/cuu/Value?gem
gp = 5.5856946893 # https://physics.nist.gov/cgi-bin/cuu/Value?gp
# calculation: https://doi.org/10.1119/1.12733
-δ = abs(H.ψ(0,0,0))^2
+δ = abs(ψ(H,0,0,0))^2
ΔE = 2 / 3 * µ0 * µN * µB * gp * ge * δ * a0^(-3)
println("1/π = ", 1/π)
println("<δ(r)> = ", δ, " a₀⁻³")
@@ -254,7 +254,7 @@ Potential energy curve:
```julia
using Plots
plot(xlims=(0.0,15.0), ylims=(-0.6,0.05), xlabel="\$r~/~a_0\$", ylabel="\$V(r)/E_\\mathrm{h},~E_n/E_\\mathrm{h}\$", legend=:bottomright, size=(480,400))
-plot!(0.1:0.01:15, r -> H.V(r), lc=:black, lw=2, label="") # potential
+plot!(0.1:0.01:15, r -> V(H,r), lc=:black, lw=2, label="") # potential
```
![](./assets/fig//HydrogenAtom_6_1.png)
@@ -267,9 +267,9 @@ Potential energy curve, Energy levels:
using Plots
plot(xlims=(0.0,15.0), ylims=(-0.6,0.05), xlabel="\$r~/~a_0\$", ylabel="\$V(r)/E_\\mathrm{h}\$", legend=:bottomright, size=(480,400))
for n in 0:10
- plot!(0.0:0.01:15, r -> H.E(n=n) > H.V(r) ? H.E(n=n) : NaN, lc=n, lw=1, label="") # energy level
+ plot!(0.0:0.01:15, r -> E(H,n=n) > V(H,r) ? E(H,n=n) : NaN, lc=n, lw=1, label="") # energy level
end
-plot!(0.1:0.01:15, r -> H.V(r), lc=:black, lw=2, label="") # potential
+plot!(0.1:0.01:15, r -> V(H,r), lc=:black, lw=2, label="") # potential
```
![](./assets/fig//HydrogenAtom_7_1.png)
@@ -283,7 +283,7 @@ using Plots
plot(xlabel="\$r~/~a_0\$", ylabel="\$r^2|R_{nl}(r)|^2~/~a_0^{-1}\$", ylims=(-0.01,0.55), xticks=0:1:20, size=(480,400), dpi=300)
for n in 1:3
for l in 0:n-1
- plot!(0:0.01:20, r->r^2*H.R(r,n=n,l=l)^2, lc=n, lw=2, ls=[:solid,:dash,:dot,:dashdot,:dashdotdot][l+1], label="\$n = $n, l=$l\$")
+ plot!(0:0.01:20, r->r^2*R(H,r,n=n,l=l)^2, lc=n, lw=2, ls=[:solid,:dash,:dot,:dashdot,:dashdotdot][l+1], label="\$n = $n, l=$l\$")
end
end
plot!()
diff --git a/docs/src/InfinitePotentialWell.md b/docs/src/InfinitePotentialWell.md
index f0e7848..72f230b 100644
--- a/docs/src/InfinitePotentialWell.md
+++ b/docs/src/InfinitePotentialWell.md
@@ -21,7 +21,7 @@ The infinite potential well (particle in a box) is the simplest model for quantu
```
#### Potential
-`V(x; L=L)`
+`V(model::InfinitePotentialWell; x)`
```math
V(x) =
\left\{
@@ -33,13 +33,13 @@ The infinite potential well (particle in a box) is the simplest model for quantu
```
#### Eigen Values
-`E(; n=0, L=L, m=m, ℏ=ℏ)`
+`E(model::InfinitePotentialWell; n=0)`
```math
E_n = \frac{\hbar^2 n^2 \pi^2}{2 m L^2}
```
#### Eigen Functions
-`ψ(x; n=0, L=L)`
+`ψ(model::InfinitePotentialWell, x; n=0)`
```math
\psi_n(x) = \sqrt{\frac{2}{L}} \sin \frac{n\pi x}{L}
```
@@ -50,11 +50,11 @@ The infinite potential well (particle in a box) is the simplest model for quantu
## Usage & Examples
-[Install Antique.jl](@ref Install) for the first use and run `using Antique` before each use. The function `antique(model, parameters...)` returns a module that has `E()`, `ψ(x)`, `V(x)` and some other functions. In this system, the model name is specified by `:InfinitePotentialWell` and several parameters `L`, `m` and `ℏ` are set as optional arguments.
+[Install Antique.jl](@ref Install) for the first use and run `using Antique` before each use. The energy `E()`, wavefunction `ψ()`, potential `V()` and some other functions are suppoted. In this system, the model is generated by `InfinitePotentialWell` and several parameters `L`, `m` and `ℏ` are set as optional arguments.
```julia
using Antique
-IPW = antique(:InfinitePotentialWell, L=1.0, m=1.0, ℏ=1.0)
+IPW = InfinitePotentialWell(L=1.0, m=1.0, ℏ=1.0)
```
@@ -78,10 +78,10 @@ julia> IPW.ℏ
Eigen values:
```julia
-julia> IPW.E(n=1)
+julia> E(IPW, n=1)
4.934802200544679
-julia> IPW.E(n=2)
+julia> E(IPW, n=2)
19.739208802178716
```
@@ -92,11 +92,11 @@ Wave functions:
```julia
using Plots
plot(xlim=(0,1), xlabel="x", ylabel="ψ(x)")
-plot!(x -> IPW.ψ(x, n=1), label="n=1", lw=2)
-plot!(x -> IPW.ψ(x, n=2), label="n=2", lw=2)
-plot!(x -> IPW.ψ(x, n=3), label="n=3", lw=2)
-plot!(x -> IPW.ψ(x, n=4), label="n=4", lw=2)
-plot!(x -> IPW.ψ(x, n=5), label="n=5", lw=2)
+plot!(x -> ψ(IPW, x, n=1), label="n=1", lw=2)
+plot!(x -> ψ(IPW, x, n=2), label="n=2", lw=2)
+plot!(x -> ψ(IPW, x, n=3), label="n=3", lw=2)
+plot!(x -> ψ(IPW, x, n=4), label="n=4", lw=2)
+plot!(x -> ψ(IPW, x, n=5), label="n=5", lw=2)
```
![](./assets/fig//InfinitePotentialWell_4_1.png)
@@ -111,9 +111,9 @@ using Plots
plot(xlim=(-0.5,1.5), ylim=(-5,140), xlabel="\$x\$", ylabel="\$V(x),~E_n,~\\psi_n(x)\\times5+E_n\$", size=(480,400), dpi=300)
for n in 1:5
# energy
- plot!([0,L], fill(IPW.E(n=n,L=L),2), lc=:black, lw=2, label="")
+ plot!([0,L], fill(E(IPW,n=n),2), lc=:black, lw=2, label="")
# wave function
- plot!(0:0.01:L, x->IPW.E(n=n,L=L)+5*IPW.ψ(x,n=n,L=L), lc=n, lw=2, label="")
+ plot!(0:0.01:L, x->E(IPW,n=n) + 5*ψ(IPW,x,n=n), lc=n, lw=2, label="")
end
# potential
plot!([0,0,L,L], [140,0,0,140], lc=:black, lw=2, label="")
diff --git a/docs/src/MorsePotential.md b/docs/src/MorsePotential.md
index 16ad77c..f748075 100644
--- a/docs/src/MorsePotential.md
+++ b/docs/src/MorsePotential.md
@@ -22,25 +22,25 @@ The Morse potential is a model for inter-nuclear anharmonic vibration in a diato
```
#### Potential
-`V(r; rₑ=rₑ, Dₑ=Dₑ, k=k, a=sqrt(k/(2*Dₑ)))`
+`V(model::MorsePotential, r)`
```math
V(r) = D_\mathrm{e} \left( \mathrm{e}^{-2a(r-r_e)} - 2\mathrm{e}^{-a(r-r_e)} \right)
```
#### Eigen Values
-`E(n; rₑ=rₑ, Dₑ=Dₑ, k=k, a=sqrt(k/(2*Dₑ)), µ=µ, ω=sqrt(k/µ), χ=ℏ*ω/(4*Dₑ), ℏ=ℏ)`
+`E(model::MorsePotential; n=0)`
```math
E_n = - D_\mathrm{e} + \hbar \omega \left( n + \frac{1}{2} \right) - \chi \hbar \omega \left( n + \frac{1}{2} \right)^2
```
#### Eigen Functions
-`ψ(n, r; rₑ=rₑ, Dₑ=Dₑ, k=k, a=sqrt(k/(2*Dₑ)), µ=µ, ω=sqrt(k/µ), χ=ℏ*ω/(4*Dₑ), ℏ=ℏ)`
+`ψ(model::MorsePotential, r; n=0)`
```math
\psi_n(r) = N_n z^{\lambda-n-1/2} \mathrm{e}^{-z/2} L_n^{(2\lambda-2n-1)}(\xi)
```
#### Generalized Laguerre Polynomials
-`L(x; n=0, α=0)`
+`L(model::MorsePotential, x; n=0, α=0)`
Rodrigues' formula & closed-form:
```math
@@ -81,11 +81,7 @@ Examples:
## Usage & Examples
-[Install Antique.jl](@ref Install) for the first use and run `using Antique` before each use. The function `antique(model, parameters...)` returns a module that has `E()`, `ψ(r)`, `V(r)` and some other functions. In this system, the model name is specified by `:MorsePotential` and several parameters `rₑ`, `Dₑ`, `k`, `µ` and `ℏ` are set as optional arguments.
-
-!!! warning
-
- Run `using Pkg; Pkg.add("SpecialFunctions")` if the following returns an error.
+[Install Antique.jl](@ref Install) for the first use and run `using Antique` before each use. The energy `E()`, wavefunction `ψ()`, potential `V()` and some other functions are suppoted. In this system, the model is generated by `MorsePotential` and several parameters `rₑ`, `Dₑ`, `k`, `µ` and `ℏ` are set as optional arguments.
```julia
# Parameters for H₂⁺
@@ -93,14 +89,13 @@ Examples:
# https://doi.org/10.5281/zenodo.5047817
# https://physics.nist.gov/cgi-bin/cuu/Value?mpsme
rₑ = 1.997193319969992120068298141276
-Vₑ = -0.602634619106539878727562156289
-Dₑ = - 0.5 - Vₑ
-k = 2*((-1.1026342144949464615+1/2.00) - Vₑ) / (2.00 - rₑ)^2
+Dₑ = - 0.5 - (-0.602634619106539878727562156289)
+k = 2*((-1.1026342144949464615+1/2.00) - (-0.602634619106539878727562156289)) / (2.00 - rₑ)^2
µ = 1/(1/1836.15267343 + 1/1836.15267343)
ℏ = 1.0
using Antique
-MP = antique(:MorsePotential, rₑ=rₑ, Vₑ=Vₑ, Dₑ=Dₑ, k=k, µ =µ, ℏ =ℏ)
+MP = MorsePotential(rₑ=rₑ, Dₑ=Dₑ, k=k, µ=µ, ℏ=ℏ)
```
@@ -130,10 +125,10 @@ julia> MP.ℏ
Eigen values:
```julia
-julia> MP.E(n=0)
+julia> E(MP, n=0)
-0.09741377794418261
-julia> MP.E(n=1)
+julia> E(MP, n=1)
-0.08738092406760907
```
@@ -143,7 +138,7 @@ Potential energy curve:
```julia
using Plots
-plot(0.1:0.01:15, r -> MP.V(r), lw=2, label="", xlims=(0.1,9.1), ylims=(-0.11,0.01), xlabel="r", ylabel="V(r)")
+plot(0.1:0.01:15, r -> V(MP, r), lw=2, label="", xlims=(0.1,9.1), ylims=(-0.11,0.01), xlabel="r", ylabel="V(r)")
```
![](./assets/fig//MorsePotential_4_1.png)
@@ -155,12 +150,12 @@ Wave functions:
```julia
using Plots
plot(xlim=(0,5), xlabel="x", ylabel="ψ(x)")
-plot!(x -> MP.ψ(x, n=0), label="n=0", lw=2)
-plot!(x -> MP.ψ(x, n=1), label="n=1", lw=2)
-plot!(x -> MP.ψ(x, n=2), label="n=2", lw=2)
-plot!(x -> MP.ψ(x, n=3), label="n=3", lw=2)
-plot!(x -> MP.ψ(x, n=4), label="n=4", lw=2)
-plot!(x -> MP.ψ(x, n=5), label="n=5", lw=2)
+plot!(x -> ψ(MP, x, n=0), label="n=0", lw=2)
+plot!(x -> ψ(MP, x, n=1), label="n=1", lw=2)
+plot!(x -> ψ(MP, x, n=2), label="n=2", lw=2)
+plot!(x -> ψ(MP, x, n=3), label="n=3", lw=2)
+plot!(x -> ψ(MP, x, n=4), label="n=4", lw=2)
+plot!(x -> ψ(MP, x, n=5), label="n=5", lw=2)
```
![](./assets/fig//MorsePotential_5_1.png)
@@ -170,20 +165,20 @@ plot!(x -> MP.ψ(x, n=5), label="n=5", lw=2)
Potential energy curve, Energy levels, Comparison with harmonic oscillator:
```julia
-MP = antique(:MorsePotential)
-HO = antique(:HarmonicOscillator, k=MP.k, m=MP.μ)
+MP = MorsePotential()
+HO = HarmonicOscillator(k=MP.k, m=MP.μ)
using Plots
plot(xlims=(0.1,9.1), ylims=(-0.11,0.01), xlabel="\$r\$", ylabel="\$V(r), E_n\$", legend=:bottomright, size=(480,400), dpi=300)
-for n in 0:MP.nₘₐₓ()
+for n in 0:nₘₐₓ(MP)
# energy
- EM = MP.E(n=n)
- EH = HO.E(n=n) - MP.Dₑ
- plot!(0.1:0.01:15, r -> EH > HO.V(r-MP.rₑ) - MP.Dₑ ? EH : NaN, lc="#BC1C5F", lw=1, label="")
- plot!(0.1:0.01:15, r -> EM > MP.V(r) ? EM : NaN, lc="#578FC7", lw=1, label="")
+ EM = E(MP, n=n)
+ EH = E(HO, n=n) - MP.Dₑ
+ plot!(0.1:0.01:15, r -> EH > V(HO, r-MP.rₑ) - MP.Dₑ ? EH : NaN, lc="#BC1C5F", lw=1, label="")
+ plot!(0.1:0.01:15, r -> EM > V(MP, r) ? EM : NaN, lc="#578FC7", lw=1, label="")
end
# potential
-plot!(0.1:0.01:15, r -> HO.V(r-MP.rₑ) - MP.Dₑ, lc="#BC1C5F", lw=2, label="Harmonic Oscillator")
-plot!(0.1:0.01:15, r -> MP.V(r), lc="#578FC7", lw=2, label="Morse Potential")
+plot!(0.1:0.01:15, r -> V(HO, r-MP.rₑ) - MP.Dₑ, lc="#BC1C5F", lw=2, label="Harmonic Oscillator")
+plot!(0.1:0.01:15, r -> V(MP, r), lc="#578FC7", lw=2, label="Morse Potential")
```
![](./assets/fig//MorsePotential_6_1.png)
@@ -773,55 +768,55 @@ Lₙ⁽ᵅ⁾(x) = x⁻ᵅeˣ/n! dⁿ/dxⁿ xⁿ⁺ᵅe⁻ˣ | 15 15
1.00 | 0 | 0 | 1.000000000000 | 1.000000000000 ✔
1.00 | 0 | 1 | 0.000000000000 | -0.000000000000 ✔
1.00 | 0 | 2 | 0.000000000000 | -0.000000000000 ✔
-1.00 | 0 | 3 | 0.000000000000 | -0.000000000000 ✔
-1.00 | 0 | 4 | 0.000000000000 | -0.000000000000 ✔
-1.00 | 0 | 5 | 0.000000000000 | -0.000000000000 ✔
+1.00 | 0 | 3 | 0.000000000000 | 0.000000000000 ✔
+1.00 | 0 | 4 | 0.000000000000 | 0.000000000000 ✔
+1.00 | 0 | 5 | 0.000000000000 | 0.000000000000 ✔
1.00 | 0 | 6 | 0.000000000000 | 0.000000000000 ✔
-1.00 | 0 | 7 | 0.000000000000 | -0.000000000000 ✔
+1.00 | 0 | 7 | 0.000000000000 | 0.000000000000 ✔
1.00 | 0 | 8 | 0.000000000000 | 0.000000000000 ✔
-1.00 | 0 | 9 | 0.000000000000 | -0.000000000000 ✔
+1.00 | 0 | 9 | 0.000000000000 | 0.000000000000 ✔
1.00 | 1 | 0 | 0.000000000000 | -0.000000000000 ✔
1.00 | 1 | 1 | 2.000000000000 | 2.000000000000 ✔
1.00 | 1 | 2 | 0.000000000000 | 0.000000000000 ✔
-1.00 | 1 | 3 | 0.000000000000 | 0.000000000000 ✔
-1.00 | 1 | 4 | 0.000000000000 | 0.000000000000 ✔
-1.00 | 1 | 5 | 0.000000000000 | 0.000000000000 ✔
+1.00 | 1 | 3 | 0.000000000000 | -0.000000000000 ✔
+1.00 | 1 | 4 | 0.000000000000 | -0.000000000000 ✔
+1.00 | 1 | 5 | 0.000000000000 | -0.000000000000 ✔
1.00 | 1 | 6 | 0.000000000000 | -0.000000000000 ✔
-1.00 | 1 | 7 | 0.000000000000 | -0.000000000000 ✔
-1.00 | 1 | 8 | 0.000000000000 | 0.000000000000 ✔
-1.00 | 1 | 9 | 0.000000000000 | 0.000000000000 ✔
+1.00 | 1 | 7 | 0.000000000000 | 0.000000000000 ✔
+1.00 | 1 | 8 | 0.000000000000 | -0.000000000000 ✔
+1.00 | 1 | 9 | 0.000000000000 | -0.000000000000 ✔
1.00 | 2 | 0 | 0.000000000000 | -0.000000000000 ✔
1.00 | 2 | 1 | 0.000000000000 | 0.000000000000 ✔
1.00 | 2 | 2 | 3.000000000000 | 3.000000000000 ✔
-1.00 | 2 | 3 | 0.000000000000 | -0.000000000000 ✔
+1.00 | 2 | 3 | 0.000000000000 | 0.000000000000 ✔
1.00 | 2 | 4 | 0.000000000000 | 0.000000000000 ✔
1.00 | 2 | 5 | 0.000000000000 | -0.000000000000 ✔
-1.00 | 2 | 6 | 0.000000000000 | -0.000000000000 ✔
-1.00 | 2 | 7 | 0.000000000000 | -0.000000000000 ✔
+1.00 | 2 | 6 | 0.000000000000 | 0.000000000000 ✔
+1.00 | 2 | 7 | 0.000000000000 | 0.000000000000 ✔
1.00 | 2 | 8 | 0.000000000000 | 0.000000000000 ✔
1.00 | 2 | 9 | 0.000000000000 | 0.000000000000 ✔
-1.00 | 3 | 0 | 0.000000000000 | -0.000000000000 ✔
-1.00 | 3 | 1 | 0.000000000000 | 0.000000000000 ✔
-1.00 | 3 | 2 | 0.000000000000 | -0.000000000000 ✔
+1.00 | 3 | 0 | 0.000000000000 | 0.000000000000 ✔
+1.00 | 3 | 1 | 0.000000000000 | -0.000000000000 ✔
+1.00 | 3 | 2 | 0.000000000000 | 0.000000000000 ✔
1.00 | 3 | 3 | 4.000000000000 | 4.000000000000 ✔
-1.00 | 3 | 4 | 0.000000000000 | -0.000000000000 ✔
+1.00 | 3 | 4 | 0.000000000000 | 0.000000000000 ✔
1.00 | 3 | 5 | 0.000000000000 | 0.000000000000 ✔
1.00 | 3 | 6 | 0.000000000000 | 0.000000000000 ✔
1.00 | 3 | 7 | 0.000000000000 | 0.000000000000 ✔
1.00 | 3 | 8 | 0.000000000000 | -0.000000000000 ✔
-1.00 | 3 | 9 | 0.000000000000 | -0.000000000000 ✔
-1.00 | 4 | 0 | 0.000000000000 | -0.000000000000 ✔
-1.00 | 4 | 1 | 0.000000000000 | 0.000000000000 ✔
+1.00 | 3 | 9 | 0.000000000000 | -0.000000000001 ✔
+1.00 | 4 | 0 | 0.000000000000 | 0.000000000000 ✔
+1.00 | 4 | 1 | 0.000000000000 | -0.000000000000 ✔
1.00 | 4 | 2 | 0.000000000000 | 0.000000000000 ✔
-1.00 | 4 | 3 | 0.000000000000 | -0.000000000000 ✔
+1.00 | 4 | 3 | 0.000000000000 | 0.000000000000 ✔
1.00 | 4 | 4 | 5.000000000000 | 4.999999999999 ✔
1.00 | 4 | 5 | 0.000000000000 | -0.000000000000 ✔
1.00 | 4 | 6 | 0.000000000000 | -0.000000000000 ✔
1.00 | 4 | 7 | 0.000000000000 | -0.000000000000 ✔
-1.00 | 4 | 8 | 0.000000000000 | -0.000000000000 ✔
+1.00 | 4 | 8 | 0.000000000000 | 0.000000000000 ✔
1.00 | 4 | 9 | 0.000000000000 | 0.000000000000 ✔
-1.00 | 5 | 0 | 0.000000000000 | -0.000000000000 ✔
-1.00 | 5 | 1 | 0.000000000000 | 0.000000000000 ✔
+1.00 | 5 | 0 | 0.000000000000 | 0.000000000000 ✔
+1.00 | 5 | 1 | 0.000000000000 | -0.000000000000 ✔
1.00 | 5 | 2 | 0.000000000000 | -0.000000000000 ✔
1.00 | 5 | 3 | 0.000000000000 | 0.000000000000 ✔
1.00 | 5 | 4 | 0.000000000000 | -0.000000000000 ✔
@@ -829,10 +824,10 @@ Lₙ⁽ᵅ⁾(x) = x⁻ᵅeˣ/n! dⁿ/dxⁿ xⁿ⁺ᵅe⁻ˣ | 15 15
1.00 | 5 | 6 | 0.000000000000 | -0.000000000000 ✔
1.00 | 5 | 7 | 0.000000000000 | -0.000000000000 ✔
1.00 | 5 | 8 | 0.000000000000 | -0.000000000000 ✔
-1.00 | 5 | 9 | 0.000000000000 | 0.000000000000 ✔
+1.00 | 5 | 9 | 0.000000000000 | -0.000000000000 ✔
1.00 | 6 | 0 | 0.000000000000 | 0.000000000000 ✔
1.00 | 6 | 1 | 0.000000000000 | -0.000000000000 ✔
-1.00 | 6 | 2 | 0.000000000000 | -0.000000000000 ✔
+1.00 | 6 | 2 | 0.000000000000 | 0.000000000000 ✔
1.00 | 6 | 3 | 0.000000000000 | 0.000000000000 ✔
1.00 | 6 | 4 | 0.000000000000 | -0.000000000000 ✔
1.00 | 6 | 5 | 0.000000000000 | -0.000000000000 ✔
@@ -840,9 +835,9 @@ Lₙ⁽ᵅ⁾(x) = x⁻ᵅeˣ/n! dⁿ/dxⁿ xⁿ⁺ᵅe⁻ˣ | 15 15
1.00 | 6 | 7 | 0.000000000000 | 0.000000000000 ✔
1.00 | 6 | 8 | 0.000000000000 | 0.000000000000 ✔
1.00 | 6 | 9 | 0.000000000000 | 0.000000000000 ✔
-1.00 | 7 | 0 | 0.000000000000 | -0.000000000000 ✔
-1.00 | 7 | 1 | 0.000000000000 | -0.000000000000 ✔
-1.00 | 7 | 2 | 0.000000000000 | -0.000000000000 ✔
+1.00 | 7 | 0 | 0.000000000000 | 0.000000000000 ✔
+1.00 | 7 | 1 | 0.000000000000 | 0.000000000000 ✔
+1.00 | 7 | 2 | 0.000000000000 | 0.000000000000 ✔
1.00 | 7 | 3 | 0.000000000000 | 0.000000000000 ✔
1.00 | 7 | 4 | 0.000000000000 | -0.000000000000 ✔
1.00 | 7 | 5 | 0.000000000000 | -0.000000000000 ✔
@@ -851,25 +846,25 @@ Lₙ⁽ᵅ⁾(x) = x⁻ᵅeˣ/n! dⁿ/dxⁿ xⁿ⁺ᵅe⁻ˣ | 15 15
1.00 | 7 | 8 | 0.000000000000 | 0.000000000000 ✔
1.00 | 7 | 9 | 0.000000000000 | -0.000000000000 ✔
1.00 | 8 | 0 | 0.000000000000 | 0.000000000000 ✔
-1.00 | 8 | 1 | 0.000000000000 | 0.000000000000 ✔
+1.00 | 8 | 1 | 0.000000000000 | -0.000000000000 ✔
1.00 | 8 | 2 | 0.000000000000 | 0.000000000000 ✔
1.00 | 8 | 3 | 0.000000000000 | -0.000000000000 ✔
-1.00 | 8 | 4 | 0.000000000000 | -0.000000000000 ✔
+1.00 | 8 | 4 | 0.000000000000 | 0.000000000000 ✔
1.00 | 8 | 5 | 0.000000000000 | -0.000000000000 ✔
1.00 | 8 | 6 | 0.000000000000 | 0.000000000000 ✔
1.00 | 8 | 7 | 0.000000000000 | 0.000000000000 ✔
-1.00 | 8 | 8 | 9.000000000000 | 9.000000000001 ✔
+1.00 | 8 | 8 | 9.000000000000 | 9.000000000000 ✔
1.00 | 8 | 9 | 0.000000000000 | -0.000000000000 ✔
-1.00 | 9 | 0 | 0.000000000000 | -0.000000000000 ✔
-1.00 | 9 | 1 | 0.000000000000 | 0.000000000000 ✔
+1.00 | 9 | 0 | 0.000000000000 | 0.000000000000 ✔
+1.00 | 9 | 1 | 0.000000000000 | -0.000000000000 ✔
1.00 | 9 | 2 | 0.000000000000 | 0.000000000000 ✔
-1.00 | 9 | 3 | 0.000000000000 | -0.000000000000 ✔
+1.00 | 9 | 3 | 0.000000000000 | -0.000000000001 ✔
1.00 | 9 | 4 | 0.000000000000 | 0.000000000000 ✔
-1.00 | 9 | 5 | 0.000000000000 | 0.000000000000 ✔
+1.00 | 9 | 5 | 0.000000000000 | -0.000000000000 ✔
1.00 | 9 | 6 | 0.000000000000 | 0.000000000000 ✔
1.00 | 9 | 7 | 0.000000000000 | -0.000000000000 ✔
1.00 | 9 | 8 | 0.000000000000 | -0.000000000000 ✔
-1.00 | 9 | 9 | 10.000000000000 | 10.000000000001 ✔
+1.00 | 9 | 9 | 10.000000000000 | 10.000000000002 ✔
Test Summary: | Pass Total
∫Lᵢ⁽ᵅ⁾(x)Lⱼ⁽ᵅ⁾(x)xᵅexp(-x)dx = Γ(i+α+1)/i! δᵢⱼ | 500 500
```
diff --git a/docs/src/index.md b/docs/src/index.md
index 614ec63..4a49129 100644
--- a/docs/src/index.md
+++ b/docs/src/index.md
@@ -16,7 +16,7 @@ using Pkg; Pkg.add("Antique")
## Usage & Examples
-[Install Antique.jl](@ref Install) for the first use and run `using Antique` before each use. The function `antique(model, parameters...)` returns a module that has `E`, `ψ`, `V` and some other functions. Here are examples in hydrogen-like atom. The analytical notation of energy (eigen value of the Hamiltonian) is written as
+[Install Antique.jl](@ref Install) for the first use and run `using Antique` before each use. The energy `E()`, wavefunction `ψ()`, potential `V()` and some other functions are suppoted. Here are examples in hydrogen-like atom. The analytical notation of energy (eigen value of the Hamiltonian) is written as
```math
E_n = -\frac{Z^2}{2n^2} E_\mathrm{h}.
@@ -26,8 +26,8 @@ Hydrogen atom has symbol $\mathrm{H}$ and atomic number 1 ($Z=1$). Therefore the
```julia
using Antique
-H = antique(:HydrogenAtom, Z=1)
-H.E(n=1)
+H = HydrogenAtom(Z=1)
+E(H)
# output> -0.5
```
@@ -35,8 +35,8 @@ Helium cation has symbol $\mathrm{He}^+$ and atomic number 2 ($Z=2$). Therefore
```julia
using Antique
-He⁺ = antique(:HydrogenAtom, Z=2)
-He⁺.E(n=1)
+He⁺ = HydrogenAtom(Z=2)
+E(He⁺)
# output> -2.0
```
@@ -50,25 +50,25 @@ There are more examples on each model page.
- :InfinitePotentialWell
+ InfinitePotentialWell
-
:HarmonicOscillator
+
HarmonicOscillator
-
:MorsePotential
+
MorsePotential
-
:HydrogenAtom
+
HydrogenAtom
```
diff --git a/docs/src/jmd/HarmonicOscillator.jmd b/docs/src/jmd/HarmonicOscillator.jmd
index 65da077..9faa8c6 100644
--- a/docs/src/jmd/HarmonicOscillator.jmd
+++ b/docs/src/jmd/HarmonicOscillator.jmd
@@ -25,7 +25,7 @@ The harmonic oscillator is the most frequently used model in quantum physics.
```
#### Potential
-`V(x; k=k, m=m, ω=sqrt(k/m))`
+`V(model::HarmonicOscillator; x)`
```math
V(x)
= \frac{1}{2} k x^2
@@ -34,19 +34,19 @@ The harmonic oscillator is the most frequently used model in quantum physics.
```
#### Eigen Values
-`E(n; k, m, ω=sqrt(k/m), ℏ=ℏ)`
+`E(model::HarmonicOscillator; n=0)`
```math
E_n = \hbar \omega \left( n + \frac{1}{2} \right)
```
#### Eigen Functions
-`ψ(n, x; k=k, m=m, ω=sqrt(k/m), ℏ=ℏ)`
+`ψ(model::HarmonicOscillator, x; n=0)`
```math
\psi_n(x) = A_n H_n(\xi) \exp{\left( -\frac{\xi^2}{2} \right)}
```
#### Hermite Polynomials
-`H(x; n=0)`
+`H(model::HarmonicOscillator, x; n=0)`
Rodrigues' formula & closed-form:
```math
@@ -88,11 +88,11 @@ Examples:
## Usage & Examples
-[Install Antique.jl](@ref Install) for the first use and run `using Antique` before each use. The function `antique(model, parameters...)` returns a module that has `E()`, `ψ(x)`, `V(x)` and some other functions. In this system, the model name is specified by `:HarmonicOscillator` and several parameters `k`, `m` and `ℏ` are set as optional arguments.
+[Install Antique.jl](@ref Install) for the first use and run `using Antique` before each use. The energy `E()`, wavefunction `ψ()`, potential `V()` and some other functions are suppoted. In this system, the model is generated by `HarmonicOscillator` and several parameters `k`, `m` and `ℏ` are set as optional arguments.
```julia; cache = :all; results = "hidden"
using Antique
-HO = antique(:HarmonicOscillator, k=1.0, m=1.0, ℏ=1.0)
+HO = HarmonicOscillator(k=1.0, m=1.0, ℏ=1.0)
```
Parameters:
@@ -106,15 +106,15 @@ HO.ℏ
Eigen values:
```julia; term = true
-HO.E(n=0)
-HO.E(n=1)
+E(HO, n=0)
+E(HO, n=1)
```
Potential energy curve:
```julia
using Plots
-plot(-5:0.1:5, x -> HO.V(x), lw=2, label="", xlabel="x", ylabel="V(x)")
+plot(-5:0.1:5, x -> V(HO, x), lw=2, label="", xlabel="x", ylabel="V(x)")
```
Wave functions:
@@ -122,11 +122,11 @@ Wave functions:
```julia
using Plots
plot(xlim=(-5,5), xlabel="x", ylabel="ψ(x)")
-plot!(x -> HO.ψ(x, n=0), label="n=0", lw=2)
-plot!(x -> HO.ψ(x, n=1), label="n=1", lw=2)
-plot!(x -> HO.ψ(x, n=2), label="n=2", lw=2)
-plot!(x -> HO.ψ(x, n=3), label="n=3", lw=2)
-plot!(x -> HO.ψ(x, n=4), label="n=4", lw=2)
+plot!(x -> ψ(HO, x, n=0), label="n=0", lw=2)
+plot!(x -> ψ(HO, x, n=1), label="n=1", lw=2)
+plot!(x -> ψ(HO, x, n=2), label="n=2", lw=2)
+plot!(x -> ψ(HO, x, n=3), label="n=3", lw=2)
+plot!(x -> ψ(HO, x, n=4), label="n=4", lw=2)
```
Potential energy curve, Energy levels, Wave functions:
@@ -136,13 +136,13 @@ using Plots
plot(xlim=(-5.5,5.5), ylim=(-0.2,5.4), xlabel="\$x\$", ylabel="\$V(x),~E_n,~\\psi_n(x)\\times0.5+E_n\$", size=(480,400), dpi=300)
for n in 0:4
# energy
- hline!([HO.E(n=n)], lc=:black, ls=:dash, label="")
- plot!([-sqrt(2*HO.k*HO.E(n=n)),sqrt(2*HO.k*HO.E(n=n))], fill(HO.E(n=n),2), lc=:black, lw=2, label="")
+ hline!([E(HO, n=n)], lc=:black, ls=:dash, label="")
+ plot!([-sqrt(2*HO.k*E(HO, n=n)),sqrt(2*HO.k*E(HO, n=n))], fill(E(HO, n=n),2), lc=:black, lw=2, label="")
# wave function
- plot!(x -> HO.E(n=n) + 0.5*HO.ψ(x,n=n), lc=n+1, lw=2, label="")
+ plot!(x -> E(HO, n=n) + 0.5*ψ(HO, x,n=n), lc=n+1, lw=2, label="")
end
# potential
-plot!(x -> HO.V(x), lc=:black, lw=2, label="")
+plot!(x -> V(HO, x), lc=:black, lw=2, label="")
```
## Testing
diff --git a/docs/src/jmd/HydrogenAtom.jmd b/docs/src/jmd/HydrogenAtom.jmd
index d78510d..af691d0 100644
--- a/docs/src/jmd/HydrogenAtom.jmd
+++ b/docs/src/jmd/HydrogenAtom.jmd
@@ -22,7 +22,7 @@ The hydrogen atom is the simplest 2-body Coulomb system.
Where, $\mu=\left(\frac{1}{m_\mathrm{e}}+\frac{1}{m_\mathrm{p}}\right)^{-1}$ is the reduced mass of electron $\mathrm{e}$ and proton $\mathrm{p}$. $\mu = m_\mathrm{e}$ holds in the limit $m_\mathrm{p}\rightarrow\infty$.
#### Potential
-`V(r; Z=Z, a₀=a₀)`
+`V(model::HydrogenAtom, r)`
```math
\begin{aligned}
V(r)
@@ -33,27 +33,27 @@ Where, $\mu=\left(\frac{1}{m_\mathrm{e}}+\frac{1}{m_\mathrm{p}}\right)^{-1}$ is
```
#### Eigen Values
-`E(; n=1, Z=Z, Eₕ=Eₕ)`
+`E(model::HydrogenAtom; n=1)`
```math
E_n = -\frac{m_\mathrm{e} e^4 Z^2}{2n^2(4\pi\varepsilon_0)^2\hbar^2} = -\frac{Z^2}{2n^2} E_\mathrm{h}
```
Where, ``E_\mathrm{h}`` is the Hartree energy, one of atomic unit. About atomic units, see section 3.9.2 of the [IUPAC GreenBook](https://iupac.org/what-we-do/books/greenbook/). In other units, ``E_\mathrm{h} = 27.211~386~245~988(53)~\mathrm{eV}`` from [here](https://physics.nist.gov/cgi-bin/cuu/Value?hrev).
#### Eigen Functions
-`ψ(r, θ, φ; n=1, l=0, m=0, Z=Z, a₀=a₀)`
+`ψ(model::HydrogenAtom, r, θ, φ; n=1, l=0, m=0)`
```math
\psi_{nlm}(\pmb{r}) = R_{nl}(r) Y_{lm}(\theta,\varphi)
```
#### Radial Functions
-`R(r; n=1, l=0, Z=Z, a₀=a₀)`
+`R(model::HydrogenAtom, r; n=1, l=0)`
```math
R_{nl}(r) = -\sqrt{\frac{(n-l-1)!}{2n(n+l)!} \left(\frac{2Z}{n a_0}\right)^3} \left(\frac{2Zr}{n a_0}\right)^l \exp \left(-\frac{Zr}{n a_0}\right) L_{n+l}^{2l+1} \left(\frac{2Zr}{n a_0}\right)
```
Where, Laguerre polynomials are defined as ``L_n(x) = \frac{1}{n!} \mathrm{e}^x \frac{\mathrm{d}^n}{\mathrm{d}x ^n} \left( \mathrm{e}^{-x} x^n \right)``, and associated Laguerre polynomials are defined as ``L_n^{k}(x) = \frac{\mathrm{d}^k}{\mathrm{d}x^k} L_n(x)``. Note that, replace ``2n(n+l)!`` with ``2n[(n+l)!]^3`` if Laguerre polynomials are defined as ``L_n(x) = \mathrm{e}^x \frac{\mathrm{d}^n}{\mathrm{d}x ^n} \left( \mathrm{e}^{-x} x^n \right)``.
#### Associated Laguerre Polynomials
-`L(x; n=0, k=0)`
+`L(model::HydrogenAtom, x; n=0, k=0)`
Rodrigues' formula & closed-form:
```math
@@ -91,7 +91,7 @@ Examples:
```
#### Spherical Harmonics
-`Y(θ, φ; l=0, m=0)`
+`Y(model::HydrogenAtom, θ, φ; l=0, m=0)`
```math
Y_{lm}(\theta,\varphi) = (-1)^{\frac{|m|+m}{2}} \sqrt{\frac{2l+1}{4\pi} \frac{(l-|m|)!}{(l+|m|)!}} P_l^{|m|} (\cos\theta) \mathrm{e}^{im\varphi}
```
@@ -101,7 +101,7 @@ i^{|m|+m} \sqrt{\frac{(l-|m|)!}{(l+|m|)!}} P_l^{|m|} = (-1)^{\frac{|m|+m}{2}} \s
```
#### Associated Legendre Polynomials
-`P(x; n=0, m=0)`
+`P(model::HydrogenAtom, x; n=0, m=0)`
Rodrigues' formula & closed-form:
```math
@@ -151,11 +151,11 @@ Examples:
## Usage & Examples
-[Install Antique.jl](@ref Install) for the first use and run `using Antique` before each use. The function `antique(model, parameters...)` returns a module that has `E()`, `ψ(r)`, `V(r)` and some other functions. In this system, the model name is specified by `:HydrogenAtom` and several parameters `Z`, `Eₕ`, `mₑ`, `a₀` and `ℏ` are set as optional arguments.
+[Install Antique.jl](@ref Install) for the first use and run `using Antique` before each use. The energy `E()`, wavefunction `ψ()`, potential `V()` and some other functions are suppoted. In this system, the model is generated by `HydrogenAtom` and several parameters `Z`, `Eₕ`, `mₑ`, `a₀` and `ℏ` are set as optional arguments.
```julia; cache = :all; results = "hidden"
using Antique
-H = antique(:HydrogenAtom, Z=1, Eₕ=1.0, a₀=1.0, mₑ=1.0, ℏ=1.0)
+H = HydrogenAtom(Z=1, Eₕ=1.0, a₀=1.0, mₑ=1.0, ℏ=1.0)
```
Parameters:
@@ -171,16 +171,16 @@ H.ℏ
Eigen values:
```julia; term = true
-H.E(n=1)
-H.E(n=2)
+E(H, n=1)
+E(H, n=2)
```
Wave length ($n=2\rightarrow1$, the first line of the Lyman series):
```julia
Eₕ2nm⁻¹ = 2.1947463136320e-2 # https://physics.nist.gov/cgi-bin/cuu/CCValue?hrminv
-println("ΔE = ", H.E(n=2) - H.E(n=1), " Eₕ")
-println("λ = ", ((H.E(n=2)-H.E(n=1))*Eₕ2nm⁻¹)^-1, " nm")
+println("ΔE = ", E(H,n=2) - E(H,n=1), " Eₕ")
+println("λ = ", ((E(H,n=2)-E(H,n=1))*Eₕ2nm⁻¹)^-1, " nm")
```
Hyperfine Splitting:
@@ -198,7 +198,7 @@ ge = 2.00231930436256 # https://physics.nist.gov/cgi-bin/cuu/Value?gem
gp = 5.5856946893 # https://physics.nist.gov/cgi-bin/cuu/Value?gp
# calculation: https://doi.org/10.1119/1.12733
-δ = abs(H.ψ(0,0,0))^2
+δ = abs(ψ(H,0,0,0))^2
ΔE = 2 / 3 * µ0 * µN * µB * gp * ge * δ * a0^(-3)
println("1/π = ", 1/π)
println("<δ(r)> = ", δ, " a₀⁻³")
@@ -213,7 +213,7 @@ Potential energy curve:
```julia
using Plots
plot(xlims=(0.0,15.0), ylims=(-0.6,0.05), xlabel="\$r~/~a_0\$", ylabel="\$V(r)/E_\\mathrm{h},~E_n/E_\\mathrm{h}\$", legend=:bottomright, size=(480,400))
-plot!(0.1:0.01:15, r -> H.V(r), lc=:black, lw=2, label="") # potential
+plot!(0.1:0.01:15, r -> V(H,r), lc=:black, lw=2, label="") # potential
```
Potential energy curve, Energy levels:
@@ -222,9 +222,9 @@ Potential energy curve, Energy levels:
using Plots
plot(xlims=(0.0,15.0), ylims=(-0.6,0.05), xlabel="\$r~/~a_0\$", ylabel="\$V(r)/E_\\mathrm{h}\$", legend=:bottomright, size=(480,400))
for n in 0:10
- plot!(0.0:0.01:15, r -> H.E(n=n) > H.V(r) ? H.E(n=n) : NaN, lc=n, lw=1, label="") # energy level
+ plot!(0.0:0.01:15, r -> E(H,n=n) > V(H,r) ? E(H,n=n) : NaN, lc=n, lw=1, label="") # energy level
end
-plot!(0.1:0.01:15, r -> H.V(r), lc=:black, lw=2, label="") # potential
+plot!(0.1:0.01:15, r -> V(H,r), lc=:black, lw=2, label="") # potential
```
Radial functions:
@@ -234,7 +234,7 @@ using Plots
plot(xlabel="\$r~/~a_0\$", ylabel="\$r^2|R_{nl}(r)|^2~/~a_0^{-1}\$", ylims=(-0.01,0.55), xticks=0:1:20, size=(480,400), dpi=300)
for n in 1:3
for l in 0:n-1
- plot!(0:0.01:20, r->r^2*H.R(r,n=n,l=l)^2, lc=n, lw=2, ls=[:solid,:dash,:dot,:dashdot,:dashdotdot][l+1], label="\$n = $n, l=$l\$")
+ plot!(0:0.01:20, r->r^2*R(H,r,n=n,l=l)^2, lc=n, lw=2, ls=[:solid,:dash,:dot,:dashdot,:dashdotdot][l+1], label="\$n = $n, l=$l\$")
end
end
plot!()
diff --git a/docs/src/jmd/InfinitePotentialWell.jmd b/docs/src/jmd/InfinitePotentialWell.jmd
index d23a5f6..d548ce1 100644
--- a/docs/src/jmd/InfinitePotentialWell.jmd
+++ b/docs/src/jmd/InfinitePotentialWell.jmd
@@ -21,7 +21,7 @@ The infinite potential well (particle in a box) is the simplest model for quantu
```
#### Potential
-`V(x; L=L)`
+`V(model::InfinitePotentialWell; x)`
```math
V(x) =
\left\{
@@ -33,13 +33,13 @@ The infinite potential well (particle in a box) is the simplest model for quantu
```
#### Eigen Values
-`E(; n=0, L=L, m=m, ℏ=ℏ)`
+`E(model::InfinitePotentialWell; n=0)`
```math
E_n = \frac{\hbar^2 n^2 \pi^2}{2 m L^2}
```
#### Eigen Functions
-`ψ(x; n=0, L=L)`
+`ψ(model::InfinitePotentialWell, x; n=0)`
```math
\psi_n(x) = \sqrt{\frac{2}{L}} \sin \frac{n\pi x}{L}
```
@@ -50,11 +50,11 @@ The infinite potential well (particle in a box) is the simplest model for quantu
## Usage & Examples
-[Install Antique.jl](@ref Install) for the first use and run `using Antique` before each use. The function `antique(model, parameters...)` returns a module that has `E()`, `ψ(x)`, `V(x)` and some other functions. In this system, the model name is specified by `:InfinitePotentialWell` and several parameters `L`, `m` and `ℏ` are set as optional arguments.
+[Install Antique.jl](@ref Install) for the first use and run `using Antique` before each use. The energy `E()`, wavefunction `ψ()`, potential `V()` and some other functions are suppoted. In this system, the model is generated by `InfinitePotentialWell` and several parameters `L`, `m` and `ℏ` are set as optional arguments.
```julia; cache = :all; results = "hidden"
using Antique
-IPW = antique(:InfinitePotentialWell, L=1.0, m=1.0, ℏ=1.0)
+IPW = InfinitePotentialWell(L=1.0, m=1.0, ℏ=1.0)
```
Parameters:
@@ -68,8 +68,8 @@ IPW.ℏ
Eigen values:
```julia; term = true
-IPW.E(n=1)
-IPW.E(n=2)
+E(IPW, n=1)
+E(IPW, n=2)
```
Wave functions:
@@ -77,11 +77,11 @@ Wave functions:
```julia
using Plots
plot(xlim=(0,1), xlabel="x", ylabel="ψ(x)")
-plot!(x -> IPW.ψ(x, n=1), label="n=1", lw=2)
-plot!(x -> IPW.ψ(x, n=2), label="n=2", lw=2)
-plot!(x -> IPW.ψ(x, n=3), label="n=3", lw=2)
-plot!(x -> IPW.ψ(x, n=4), label="n=4", lw=2)
-plot!(x -> IPW.ψ(x, n=5), label="n=5", lw=2)
+plot!(x -> ψ(IPW, x, n=1), label="n=1", lw=2)
+plot!(x -> ψ(IPW, x, n=2), label="n=2", lw=2)
+plot!(x -> ψ(IPW, x, n=3), label="n=3", lw=2)
+plot!(x -> ψ(IPW, x, n=4), label="n=4", lw=2)
+plot!(x -> ψ(IPW, x, n=5), label="n=5", lw=2)
```
Potential energy curve, Energy levels, Wave functions:
@@ -92,9 +92,9 @@ using Plots
plot(xlim=(-0.5,1.5), ylim=(-5,140), xlabel="\$x\$", ylabel="\$V(x),~E_n,~\\psi_n(x)\\times5+E_n\$", size=(480,400), dpi=300)
for n in 1:5
# energy
- plot!([0,L], fill(IPW.E(n=n,L=L),2), lc=:black, lw=2, label="")
+ plot!([0,L], fill(E(IPW,n=n),2), lc=:black, lw=2, label="")
# wave function
- plot!(0:0.01:L, x->IPW.E(n=n,L=L)+5*IPW.ψ(x,n=n,L=L), lc=n, lw=2, label="")
+ plot!(0:0.01:L, x->E(IPW,n=n) + 5*ψ(IPW,x,n=n), lc=n, lw=2, label="")
end
# potential
plot!([0,0,L,L], [140,0,0,140], lc=:black, lw=2, label="")
diff --git a/docs/src/jmd/MorsePotential.jmd b/docs/src/jmd/MorsePotential.jmd
index a09d10b..97b7740 100644
--- a/docs/src/jmd/MorsePotential.jmd
+++ b/docs/src/jmd/MorsePotential.jmd
@@ -22,25 +22,25 @@ The Morse potential is a model for inter-nuclear anharmonic vibration in a diato
```
#### Potential
-`V(r; rₑ=rₑ, Dₑ=Dₑ, k=k, a=sqrt(k/(2*Dₑ)))`
+`V(model::MorsePotential, r)`
```math
V(r) = D_\mathrm{e} \left( \mathrm{e}^{-2a(r-r_e)} - 2\mathrm{e}^{-a(r-r_e)} \right)
```
#### Eigen Values
-`E(n; rₑ=rₑ, Dₑ=Dₑ, k=k, a=sqrt(k/(2*Dₑ)), µ=µ, ω=sqrt(k/µ), χ=ℏ*ω/(4*Dₑ), ℏ=ℏ)`
+`E(model::MorsePotential; n=0)`
```math
E_n = - D_\mathrm{e} + \hbar \omega \left( n + \frac{1}{2} \right) - \chi \hbar \omega \left( n + \frac{1}{2} \right)^2
```
#### Eigen Functions
-`ψ(n, r; rₑ=rₑ, Dₑ=Dₑ, k=k, a=sqrt(k/(2*Dₑ)), µ=µ, ω=sqrt(k/µ), χ=ℏ*ω/(4*Dₑ), ℏ=ℏ)`
+`ψ(model::MorsePotential, r; n=0)`
```math
\psi_n(r) = N_n z^{\lambda-n-1/2} \mathrm{e}^{-z/2} L_n^{(2\lambda-2n-1)}(\xi)
```
#### Generalized Laguerre Polynomials
-`L(x; n=0, α=0)`
+`L(model::MorsePotential, x; n=0, α=0)`
Rodrigues' formula & closed-form:
```math
@@ -81,11 +81,7 @@ Examples:
## Usage & Examples
-[Install Antique.jl](@ref Install) for the first use and run `using Antique` before each use. The function `antique(model, parameters...)` returns a module that has `E()`, `ψ(r)`, `V(r)` and some other functions. In this system, the model name is specified by `:MorsePotential` and several parameters `rₑ`, `Dₑ`, `k`, `µ` and `ℏ` are set as optional arguments.
-
-!!! warning
-
- Run `using Pkg; Pkg.add("SpecialFunctions")` if the following returns an error.
+[Install Antique.jl](@ref Install) for the first use and run `using Antique` before each use. The energy `E()`, wavefunction `ψ()`, potential `V()` and some other functions are suppoted. In this system, the model is generated by `MorsePotential` and several parameters `rₑ`, `Dₑ`, `k`, `µ` and `ℏ` are set as optional arguments.
```julia; cache = :all; results = "hidden"
# Parameters for H₂⁺
@@ -93,14 +89,13 @@ Examples:
# https://doi.org/10.5281/zenodo.5047817
# https://physics.nist.gov/cgi-bin/cuu/Value?mpsme
rₑ = 1.997193319969992120068298141276
-Vₑ = -0.602634619106539878727562156289
-Dₑ = - 0.5 - Vₑ
-k = 2*((-1.1026342144949464615+1/2.00) - Vₑ) / (2.00 - rₑ)^2
+Dₑ = - 0.5 - (-0.602634619106539878727562156289)
+k = 2*((-1.1026342144949464615+1/2.00) - (-0.602634619106539878727562156289)) / (2.00 - rₑ)^2
µ = 1/(1/1836.15267343 + 1/1836.15267343)
ℏ = 1.0
using Antique
-MP = antique(:MorsePotential, rₑ=rₑ, Vₑ=Vₑ, Dₑ=Dₑ, k=k, µ =µ, ℏ =ℏ)
+MP = MorsePotential(rₑ=rₑ, Dₑ=Dₑ, k=k, µ=µ, ℏ=ℏ)
```
Parameters:
@@ -116,15 +111,15 @@ MP.ℏ
Eigen values:
```julia; term = true
-MP.E(n=0)
-MP.E(n=1)
+E(MP, n=0)
+E(MP, n=1)
```
Potential energy curve:
```julia
using Plots
-plot(0.1:0.01:15, r -> MP.V(r), lw=2, label="", xlims=(0.1,9.1), ylims=(-0.11,0.01), xlabel="r", ylabel="V(r)")
+plot(0.1:0.01:15, r -> V(MP, r), lw=2, label="", xlims=(0.1,9.1), ylims=(-0.11,0.01), xlabel="r", ylabel="V(r)")
```
Wave functions:
@@ -132,31 +127,31 @@ Wave functions:
```julia
using Plots
plot(xlim=(0,5), xlabel="x", ylabel="ψ(x)")
-plot!(x -> MP.ψ(x, n=0), label="n=0", lw=2)
-plot!(x -> MP.ψ(x, n=1), label="n=1", lw=2)
-plot!(x -> MP.ψ(x, n=2), label="n=2", lw=2)
-plot!(x -> MP.ψ(x, n=3), label="n=3", lw=2)
-plot!(x -> MP.ψ(x, n=4), label="n=4", lw=2)
-plot!(x -> MP.ψ(x, n=5), label="n=5", lw=2)
+plot!(x -> ψ(MP, x, n=0), label="n=0", lw=2)
+plot!(x -> ψ(MP, x, n=1), label="n=1", lw=2)
+plot!(x -> ψ(MP, x, n=2), label="n=2", lw=2)
+plot!(x -> ψ(MP, x, n=3), label="n=3", lw=2)
+plot!(x -> ψ(MP, x, n=4), label="n=4", lw=2)
+plot!(x -> ψ(MP, x, n=5), label="n=5", lw=2)
```
Potential energy curve, Energy levels, Comparison with harmonic oscillator:
```julia
-MP = antique(:MorsePotential)
-HO = antique(:HarmonicOscillator, k=MP.k, m=MP.μ)
+MP = MorsePotential()
+HO = HarmonicOscillator(k=MP.k, m=MP.μ)
using Plots
plot(xlims=(0.1,9.1), ylims=(-0.11,0.01), xlabel="\$r\$", ylabel="\$V(r), E_n\$", legend=:bottomright, size=(480,400), dpi=300)
-for n in 0:MP.nₘₐₓ()
+for n in 0:nₘₐₓ(MP)
# energy
- EM = MP.E(n=n)
- EH = HO.E(n=n) - MP.Dₑ
- plot!(0.1:0.01:15, r -> EH > HO.V(r-MP.rₑ) - MP.Dₑ ? EH : NaN, lc="#BC1C5F", lw=1, label="")
- plot!(0.1:0.01:15, r -> EM > MP.V(r) ? EM : NaN, lc="#578FC7", lw=1, label="")
+ EM = E(MP, n=n)
+ EH = E(HO, n=n) - MP.Dₑ
+ plot!(0.1:0.01:15, r -> EH > V(HO, r-MP.rₑ) - MP.Dₑ ? EH : NaN, lc="#BC1C5F", lw=1, label="")
+ plot!(0.1:0.01:15, r -> EM > V(MP, r) ? EM : NaN, lc="#578FC7", lw=1, label="")
end
# potential
-plot!(0.1:0.01:15, r -> HO.V(r-MP.rₑ) - MP.Dₑ, lc="#BC1C5F", lw=2, label="Harmonic Oscillator")
-plot!(0.1:0.01:15, r -> MP.V(r), lc="#578FC7", lw=2, label="Morse Potential")
+plot!(0.1:0.01:15, r -> V(HO, r-MP.rₑ) - MP.Dₑ, lc="#BC1C5F", lw=2, label="Harmonic Oscillator")
+plot!(0.1:0.01:15, r -> V(MP, r), lc="#578FC7", lw=2, label="Morse Potential")
```
where, the potential of harmonic oscillator is defined as $V(r) \simeq \frac{1}{2} k (r - r_\mathrm{e})^2 + V_0$.
diff --git a/src/Antique.jl b/src/Antique.jl
index 0a3006c..2826d60 100644
--- a/src/Antique.jl
+++ b/src/Antique.jl
@@ -1,7 +1,5 @@
module Antique
- export antique
-
# Update this list when you add a model.
models = [
:InfinitePotentialWell,
@@ -15,6 +13,23 @@ module Antique
include("./$(model).jl")
end
+ # --------------- for old version ---------------
+
+ export antique
+
+ # Update this list when you add a model.
+ oldmodels = [
+ :InfinitePotentialWell,
+ :HarmonicOscillator,
+ :MorsePotential,
+ :HydrogenAtom,
+ ]
+
+ # include statements
+ for model in oldmodels
+ include("./old/$(model).jl")
+ end
+
# I/O function
function save(path, text)
mkpath(dirname(path))
@@ -33,15 +48,17 @@ module Antique
# main functions
function antique(model; parameters...)
+ # alart
+ @warn "The function `antique(model; parameters...)` is deprecated. Please check the latest document: https://ohno.github.io/Antique.jl/stable/"
# check existence of model
if model ∉ models
throw(ErrorException("\`:$(model)\` is not in the list of supported models $(models)."))
end
# load source code file
if Sys.iswindows()
- source = load("$(dirname(@__FILE__()))\\\\$(model).jl")
+ source = load("$(dirname(@__FILE__()))\\\\old\\\\$(model).jl")
else
- source = load("$(dirname(@__FILE__()))/$(model).jl")
+ source = load("$(dirname(@__FILE__()))/old/$(model).jl")
end
# replace name of module
for m in eachmatch(Regex("module $(model)"), source)
diff --git a/src/HarmonicOscillator.jl b/src/HarmonicOscillator.jl
index bfe3e32..ef7ac47 100644
--- a/src/HarmonicOscillator.jl
+++ b/src/HarmonicOscillator.jl
@@ -1,24 +1,39 @@
-module HarmonicOscillator
+export HarmonicOscillator, V, E, ψ, H
- # Default
- k = 1.0 # change here!
- m = 1.0 # change here!
- ℏ = 1.0 # change here!
-
- # Potential
- V(x; k=k, m=m, ω=sqrt(k/m)) = 1/2*k*x^2
+# Parameters
+Base.@kwdef struct HarmonicOscillator
+ k = 1.0
+ m = 1.0
+ ℏ = 1.0
+end
- # Energy
- E(; n=0, k=k, m=m, ω=sqrt(k/m), ℏ=ℏ) = ℏ*ω*(n+1/2)
+# Potential
+function V(model::HarmonicOscillator, x)
+ k = model.k
+ return 1//2 * k * x^2
+end
- # Wave Function
- function ψ(x; n=0, k=k, m=m, ω=sqrt(k/m), ℏ=ℏ)
- A = sqrt(1/(factorial(n)*2^n)*sqrt(m*ω/(π*ℏ)))
- ξ = sqrt(m*ω/ℏ) * x
- return A*H(ξ,n=n)*exp(-ξ^2/2)
- end
+# Energy
+function E(model::HarmonicOscillator; n=0)
+ k = model.k
+ m = model.m
+ ℏ = model.ℏ
+ ω = sqrt(k/m)
+ return ℏ * ω * (n+1//2)
+end
- # Hermite polynomials
- H(x; n=0) = factorial(n) * sum(i -> (-1)^i // (factorial(i) * factorial(n-2*i)) * (2*x)^(n-2*i), 0:Int(floor(n/2)))
+# Wave Function
+function ψ(model::HarmonicOscillator, x; n=0)
+ k = model.k
+ m = model.m
+ ℏ = model.ℏ
+ ω = sqrt(k/m)
+ A = sqrt(1//(factorial(n)*2^n)*sqrt(m*ω/(π*ℏ)))
+ ξ = sqrt(m*ω/ℏ) * x
+ return A * H(model,ξ,n=n) * exp(-ξ^2/2)
+end
+# Hermite Polynomials
+function H(model::HarmonicOscillator, x; n=0)
+ return factorial(n) * sum(i -> (-1)^i // (factorial(i) * factorial(n-2*i)) * (2*x)^(n-2*i), 0:Int(floor(n/2)))
end
diff --git a/src/HydrogenAtom.jl b/src/HydrogenAtom.jl
index 7fb2d03..6cc0a3f 100644
--- a/src/HydrogenAtom.jl
+++ b/src/HydrogenAtom.jl
@@ -1,41 +1,65 @@
-module HydrogenAtom
-
- # Default
- Z = 1 # change here!
- ℏ = 1.0 # change here!
- Eₕ = 1.0 # change here!
- a₀ = 1.0 # change here!
- mₑ = 1.0 # change here!
-
- # Potential
- V(r; Z=Z, a₀=a₀) = r<0 ? throw(DomainError(r, "r=$r is out of the domain (0≦r)")) : -Z/abs(r/a₀)
-
- # Energy
- E(; n=1, Z=Z, Eₕ=Eₕ) = -Z^2/(2*n^2) * Eₕ
-
- # Wave Function
- ψ(r, θ, φ; n=1, l=0, m=0, Z=Z, a₀=a₀) = R(r, n=n, l=l, Z=Z, a₀=a₀) * Y(θ, φ, l=l, m=m)
-
- # Radial Function
- function R(r; n=1, l=0, Z=Z, a₀=a₀)
- if r<0
- throw(DomainError(r, "r=$r is out of the domain (0≦r)"))
- end
- ρ = 2*Z*abs(r)/(n*a₀)
- N = -sqrt( factorial(n-l-1)/(2*n*factorial(n+l)) * (2*Z/(n*a₀))^3 )
- return N*ρ^l * exp(-ρ/2) * L(ρ, n=n+l, k=2*l+1)
- end
-
- # Associated Laguerre Polynomials
- L(x; n=0, k=0) = sum(m -> (-1)^(m+k) * factorial(n) // (factorial(m) * factorial(m+k) * factorial(n-m-k)) * x^m, 0:n-k)
-
- # Spherical Harmonics
- function Y(θ, φ; l=0, m=0)
- N = (im)^(m+abs(m)) * sqrt( (2*l+1)*factorial(l-Int(abs(m))) / (2*factorial(l+Int(abs(m)))) )
- return N * P(cos(θ),n=l,m=Int(abs(m))) * exp(im*m*φ) / sqrt(2*π)
- end
-
- # Associated Legendre Polynomials
- P(x; n=0, m=0) = (1//2)^n * (1-x^2)^(m//2) * sum(j -> (-1)^j * factorial(2*n-2*j) // (factorial(j) * factorial(n-j) * factorial(n-2*j-m)) * x^(n-2*j-m), 0:Int(floor((n-m)/2)))
+export HydrogenAtom, V, E, ψ, R, L, Y, P
+# Parameters
+Base.@kwdef struct HydrogenAtom
+ Z = 1
+ ℏ = 1.0
+ Eₕ = 1.0
+ a₀ = 1.0
+ mₑ = 1.0
end
+
+# Potential
+function V(model::HydrogenAtom, r)
+ # if r<0
+ # throw(DomainError(r, "r=$r is out of the domain (0≦r)"))
+ # end
+ Z = model.Z
+ a₀ = model.a₀
+ return -Z/abs(r/a₀)
+end
+
+# Energy
+function E(model::HydrogenAtom; n=1)
+ Z = model.Z
+ Eₕ = model.Eₕ
+ return -Z^2/(2*n^2) * Eₕ
+end
+
+# Wave Function
+function ψ(model::HydrogenAtom, r, θ, φ; n=1, l=0, m=0)
+ # if r<0
+ # throw(DomainError(r, "r=$r is out of the domain (0≦r)"))
+ # end
+ Z = model.Z
+ a₀ = model.a₀
+ return R(model, r, n=n, l=l) * Y(model, θ, φ, l=l, m=m)
+end
+
+# Radial Function
+function R(model::HydrogenAtom, r; n=1, l=0)
+ # if r<0
+ # throw(DomainError(r, "r=$r is out of the domain (0≦r)"))
+ # end
+ Z = model.Z
+ a₀ = model.a₀
+ ρ = 2*Z*abs(r)/(n*a₀)
+ N = -sqrt( factorial(n-l-1)/(2*n*factorial(n+l)) * (2*Z/(n*a₀))^3 )
+ return N*ρ^l * exp(-ρ/2) * L(model, ρ, n=n+l, k=2*l+1)
+end
+
+# Associated Laguerre Polynomials
+function L(model::HydrogenAtom, x; n=0, k=0)
+ return sum(m -> (-1)^(m+k) * factorial(n) // (factorial(m) * factorial(m+k) * factorial(n-m-k)) * x^m, 0:n-k)
+end
+
+# Spherical Harmonics
+function Y(model::HydrogenAtom, θ, φ; l=0, m=0)
+ N = (im)^(m+abs(m)) * sqrt( (2*l+1)*factorial(l-Int(abs(m))) / (2*factorial(l+Int(abs(m)))) )
+ return N * P(model,cos(θ), n=l, m=Int(abs(m))) * exp(im*m*φ) / sqrt(2*π)
+end
+
+# Associated Legendre Polynomials
+function P(model::HydrogenAtom, x; n=0, m=0)
+ return (1//2)^n * (1-x^2)^(m//2) * sum(j -> (-1)^j * factorial(2*n-2*j) // (factorial(j) * factorial(n-j) * factorial(n-2*j-m)) * x^(n-2*j-m), 0:Int(floor((n-m)/2)))
+end
\ No newline at end of file
diff --git a/src/InfinitePotentialWell.jl b/src/InfinitePotentialWell.jl
index 8ac2b14..27e6a6f 100644
--- a/src/InfinitePotentialWell.jl
+++ b/src/InfinitePotentialWell.jl
@@ -1,17 +1,28 @@
-module InfinitePotentialWell
+export InfinitePotentialWell, V, E, ψ
- # Default
- L = 1.0 # change here!
- m = 1.0 # change here!
- ℏ = 1.0 # change here!
+# Parameters
+Base.@kwdef struct InfinitePotentialWell
+ L = 1.0
+ m = 1.0
+ ℏ = 1.0
+end
- # Potential
- V(x; L=L) = 0 (-1)^(k) * (gamma(α+n+1) / (gamma(α+1+k)*gamma(n-k+1))) * x^k / factorial(k), 0:n)
- Lαint(x; n=0, α::Int=0) = sum(k -> (-1)^(k) * (Int(gamma(α+n+1)) // Int((gamma(α+1+k)*gamma(n-k+1)))) * x^k // factorial(k), 0:n) # α::Int
+# Wave Function
+function ψ(model::MorsePotential, r; n=0)
+ if r<0
+ throw(DomainError(r, "r=$r is out of the domain (0≦r)"))
+ end
+ rₑ = model.rₑ
+ Dₑ = model.Dₑ
+ k = model.k
+ µ = model.µ
+ ℏ = model.ℏ
+ a = sqrt(k/(2*Dₑ))
+ λ = sqrt(2*µ*Dₑ) / (a*ℏ)
+ ξ = 2*λ*exp(-a*(r-rₑ))
+ s = 2*λ - 2*n - 1
+ N = sqrt(factorial(n) * s * a / gamma(s+n+1))
+ return N * ξ^(s/2) * exp(-ξ/2) * L(model, ξ, n=n, α=s)
+end
+# Generalized Laguerre Polynomials
+function L(model::MorsePotential, x; n=0, α=0)
+ if isinteger(α)
+ return sum(k -> (-1)^(k) * (Int(gamma(α+n+1)) // Int((gamma(α+1+k)*gamma(n-k+1)))) * x^k * 1 // factorial(k), 0:n)
+ else
+ return sum(k -> (-1)^(k) * (gamma(α+n+1) / (gamma(α+1+k)*gamma(n-k+1))) * x^k / factorial(k), 0:n)
+ end
end
\ No newline at end of file
diff --git a/src/old/HarmonicOscillator.jl b/src/old/HarmonicOscillator.jl
new file mode 100644
index 0000000..1c5891b
--- /dev/null
+++ b/src/old/HarmonicOscillator.jl
@@ -0,0 +1,24 @@
+module OldHarmonicOscillator
+
+ # Default
+ k = 1.0 # change here!
+ m = 1.0 # change here!
+ ℏ = 1.0 # change here!
+
+ # Potential
+ V(x; k=k, m=m, ω=sqrt(k/m)) = 1/2*k*x^2
+
+ # Energy
+ E(; n=0, k=k, m=m, ω=sqrt(k/m), ℏ=ℏ) = ℏ*ω*(n+1/2)
+
+ # Wave Function
+ function ψ(x; n=0, k=k, m=m, ω=sqrt(k/m), ℏ=ℏ)
+ A = sqrt(1/(factorial(n)*2^n)*sqrt(m*ω/(π*ℏ)))
+ ξ = sqrt(m*ω/ℏ) * x
+ return A*H(ξ,n=n)*exp(-ξ^2/2)
+ end
+
+ # Hermite polynomials
+ H(x; n=0) = factorial(n) * sum(i -> (-1)^i // (factorial(i) * factorial(n-2*i)) * (2*x)^(n-2*i), 0:Int(floor(n/2)))
+
+end
diff --git a/src/old/HydrogenAtom.jl b/src/old/HydrogenAtom.jl
new file mode 100644
index 0000000..294245d
--- /dev/null
+++ b/src/old/HydrogenAtom.jl
@@ -0,0 +1,41 @@
+module OldHydrogenAtom
+
+ # Default
+ Z = 1 # change here!
+ ℏ = 1.0 # change here!
+ Eₕ = 1.0 # change here!
+ a₀ = 1.0 # change here!
+ mₑ = 1.0 # change here!
+
+ # Potential
+ V(r; Z=Z, a₀=a₀) = r<0 ? throw(DomainError(r, "r=$r is out of the domain (0≦r)")) : -Z/abs(r/a₀)
+
+ # Energy
+ E(; n=1, Z=Z, Eₕ=Eₕ) = -Z^2/(2*n^2) * Eₕ
+
+ # Wave Function
+ ψ(r, θ, φ; n=1, l=0, m=0, Z=Z, a₀=a₀) = R(r, n=n, l=l, Z=Z, a₀=a₀) * Y(θ, φ, l=l, m=m)
+
+ # Radial Function
+ function R(r; n=1, l=0, Z=Z, a₀=a₀)
+ if r<0
+ throw(DomainError(r, "r=$r is out of the domain (0≦r)"))
+ end
+ ρ = 2*Z*abs(r)/(n*a₀)
+ N = -sqrt( factorial(n-l-1)/(2*n*factorial(n+l)) * (2*Z/(n*a₀))^3 )
+ return N*ρ^l * exp(-ρ/2) * L(ρ, n=n+l, k=2*l+1)
+ end
+
+ # Associated Laguerre Polynomials
+ L(x; n=0, k=0) = sum(m -> (-1)^(m+k) * factorial(n) // (factorial(m) * factorial(m+k) * factorial(n-m-k)) * x^m, 0:n-k)
+
+ # Spherical Harmonics
+ function Y(θ, φ; l=0, m=0)
+ N = (im)^(m+abs(m)) * sqrt( (2*l+1)*factorial(l-Int(abs(m))) / (2*factorial(l+Int(abs(m)))) )
+ return N * P(cos(θ),n=l,m=Int(abs(m))) * exp(im*m*φ) / sqrt(2*π)
+ end
+
+ # Associated Legendre Polynomials
+ P(x; n=0, m=0) = (1//2)^n * (1-x^2)^(m//2) * sum(j -> (-1)^j * factorial(2*n-2*j) // (factorial(j) * factorial(n-j) * factorial(n-2*j-m)) * x^(n-2*j-m), 0:Int(floor((n-m)/2)))
+
+end
diff --git a/src/old/InfinitePotentialWell.jl b/src/old/InfinitePotentialWell.jl
new file mode 100644
index 0000000..3449f9d
--- /dev/null
+++ b/src/old/InfinitePotentialWell.jl
@@ -0,0 +1,17 @@
+module OldInfinitePotentialWell
+
+ # Default
+ L = 1.0 # change here!
+ m = 1.0 # change here!
+ ℏ = 1.0 # change here!
+
+ # Potential
+ V(x; L=L) = 0 (-1)^(k) * (gamma(α+n+1) / (gamma(α+1+k)*gamma(n-k+1))) * x^k / factorial(k), 0:n)
+ Lαint(x; n=0, α::Int=0) = sum(k -> (-1)^(k) * (Int(gamma(α+n+1)) // Int((gamma(α+1+k)*gamma(n-k+1)))) * x^k // factorial(k), 0:n) # α::Int
+
+end
\ No newline at end of file
diff --git a/test/HarmonicOscillator.jl b/test/HarmonicOscillator.jl
index d764ab0..17be73f 100644
--- a/test/HarmonicOscillator.jl
+++ b/test/HarmonicOscillator.jl
@@ -6,7 +6,7 @@ using QuadGK
using Symbolics
using Latexify
using LaTeXStrings
-HO = antique(:HarmonicOscillator, k=1.0, m=1.0, ℏ=1.0)
+HO = HarmonicOscillator(k=1.0, m=1.0, ℏ=1.0)
# Hₙ(x) = (-1)ⁿ exp(x²) dⁿ/dxⁿ exp(-x²) = ...
@@ -34,7 +34,7 @@ println(raw"""
c = a * D(b) # Rodrigues' formula
d = expand_derivatives(c) # expand dⁿ/dxⁿ
e = simplify(d, expand=true) # simplify
- f = simplify(HO.H(x, n=n), expand=true) # closed-form
+ f = simplify(H(HO, x, n=n), expand=true) # closed-form
# latexify
eq1 = latexify(e, env=:raw)
eq2 = latexify(f, env=:raw)
@@ -79,7 +79,7 @@ println(raw"""
for i in 0:9
for j in 0:9
analytical = sqrt(π)*2^j*factorial(j)*(i == j ? 1 : 0)
- numerical = quadgk(x -> HO.H(x, n=j) * HO.H(x, n=i)* exp(-x^2), -Inf, Inf, maxevals=10^3)[1]
+ numerical = quadgk(x -> H(HO, x, n=j) * H(HO, x, n=i)* exp(-x^2), -Inf, Inf, maxevals=10^3)[1]
acceptance = iszero(analytical) ? isapprox(analytical, numerical, atol=1e-5) : isapprox(analytical, numerical, rtol=1e-5)
@test acceptance
@printf("%2d | %2d | %17.12f | %17.12f %s\n", i, j, analytical, numerical, acceptance ? "✔" : "✗")
@@ -109,7 +109,7 @@ println(raw"""
for i in 0:9
for j in 0:9
analytical = (i == j ? 1 : 0)
- numerical = quadgk(x -> conj(HO.ψ(x, n=i)) * HO.ψ(x, n=j), -Inf, Inf, maxevals=10^3)[1]
+ numerical = quadgk(x -> conj(ψ(HO, x, n=i)) * ψ(HO, x, n=j), -Inf, Inf, maxevals=10^3)[1]
acceptance = iszero(analytical) ? isapprox(analytical, numerical, atol=1e-5) : isapprox(analytical, numerical, rtol=1e-5)
@test acceptance
@printf("%2d | %2d | %17.12f | %17.12f %s\n", i, j, analytical, numerical, acceptance ? "✔" : "✗")
@@ -140,8 +140,8 @@ The virial theorem $\langle T \rangle = \langle V \rangle$ and the definition of
println("--- | -- | ----------------- | ----------------- ")
for k in [0.1,0.5,1.0,5.0]
for n in 0:9
- analytical = HO.E(n=n)
- numerical = 2 * quadgk(x -> conj(HO.ψ(x, n=n)) * HO.V(x) * HO.ψ(x, n=n), -Inf, Inf, maxevals=10^3)[1]
+ analytical = E(HO, n=n)
+ numerical = 2 * quadgk(x -> conj(ψ(HO, x, n=n)) * V(HO, x) * ψ(HO, x, n=n), -Inf, Inf, maxevals=10^3)[1]
acceptance = iszero(analytical) ? isapprox(analytical, numerical, atol=1e-5) : isapprox(analytical, numerical, rtol=1e-5)
@test acceptance
@printf("%.1f | %2d | %17.12f | %17.12f %s\n", k, n, analytical, numerical, acceptance ? "✔" : "✗")
@@ -222,19 +222,21 @@ are given by the sum of 2 Taylor series:
```""")
@testset "∫ψₙ*Hψₙdx = <ψₙ|H|ψₙ> = Eₙ" begin
- ψHψ(x; n=0, k=HO.k, m=HO.m, ℏ=HO.ℏ, Δx=0.005) = HO.V(x,k=k,m=m)*HO.ψ(x,n=n,k=k,m=m,ℏ=ℏ)^2 - ℏ^2/(2*m)*conj(HO.ψ(x,n=n,k=k,m=m,ℏ=ℏ))*(HO.ψ(x+Δx,n=n,k=k,m=m,ℏ=ℏ)-2*HO.ψ(x,n=n,k=k,m=m,ℏ=ℏ)+HO.ψ(x-Δx,n=n,k=k,m=m,ℏ=ℏ))/Δx^2
+ ψHψ(HO, x; n=0, Δx=0.005) = V(HO,x)*ψ(HO,x,n=n)^2 - HO.ℏ^2/(2*HO.m)*conj(ψ(HO,x,n=n))*(ψ(HO,x+Δx,n=n)-2*ψ(HO,x,n=n)+ψ(HO,x-Δx,n=n))/Δx^2
println(" k | n | analytical | numerical ")
println("--- | -- | ----------------- | ----------------- ")
for k in [0.1,0.5,1.0,5.0]
for n in 0:9
- analytical = HO.E(n=n, k=k)
- numerical = quadgk(x -> ψHψ(x, n=n, k=k, Δx=0.001), -Inf, Inf, maxevals=10^3)[1]
+ HO = HarmonicOscillator(k=k)
+ analytical = E(HO, n=n)
+ numerical = quadgk(x -> ψHψ(HO, x, n=n, Δx=0.001), -Inf, Inf, maxevals=10^3)[1]
acceptance = iszero(analytical) ? isapprox(analytical, numerical, atol=1e-5) : isapprox(analytical, numerical, rtol=1e-5)
@test acceptance
@printf("%.1f | %2d | %17.12f | %17.12f %s\n", k, n, analytical, numerical, acceptance ? "✔" : "✗")
end
end
end
+HO = HarmonicOscillator(k=1.0, m=1.0, ℏ=1.0)
println("""```
""")
diff --git a/test/HydrogenAtom.jl b/test/HydrogenAtom.jl
index 4f623d0..f150e123a 100644
--- a/test/HydrogenAtom.jl
+++ b/test/HydrogenAtom.jl
@@ -6,8 +6,8 @@ using QuadGK
using Symbolics
using Latexify
using LaTeXStrings
-HA = antique(:HydrogenAtom, Z=1, Eₕ=1.0, a₀=1.0, mₑ=1.0, ℏ=1.0)
-MP = antique(:MorsePotential)
+HA = HydrogenAtom(Z=1, Eₕ=1.0, a₀=1.0, mₑ=1.0, ℏ=1.0)
+MP = MorsePotential()
# Pₙᵐ(x) = √(1-x²)ᵐ dᵐ/dxᵐ Pₙ(x); Pₙ(x) = 1/(2ⁿn!) dⁿ/dxⁿ (x²-1)ⁿ
@@ -38,7 +38,7 @@ println(raw"""
c = (1 - x^2)^(m//2) * Dm(a * Dn(b)) # Rodrigues' formula
d = expand_derivatives(c) # expand dⁿ/dxⁿ and dᵐ/dxᵐ
e = simplify(d, expand=true) # simplify
- f = simplify(HA.P(x, n=n, m=m), expand=true) # closed-form
+ f = simplify(P(HA, x, n=n, m=m), expand=true) # closed-form
# latexify
eq1 = latexify(e, env=:raw)
eq2 = latexify(f, env=:raw)
@@ -84,7 +84,7 @@ println(raw"""
for i in m:9
for j in m:9
analytical = 2*factorial(j+m)/(2*j+1)/factorial(j-m)*(i == j ? 1 : 0)
- numerical = quadgk(x -> HA.P(x, n=i, m=m) * HA.P(x, n=j, m=m), -1, 1, maxevals=10^3)[1]
+ numerical = quadgk(x -> P(HA, x, n=i, m=m) * P(HA, x, n=j, m=m), -1, 1, maxevals=10^3)[1]
acceptance = iszero(analytical) ? isapprox(analytical, numerical, atol=1e-5) : isapprox(analytical, numerical, rtol=1e-5)
@test acceptance
@printf("%2d | %2d | %2d | %17.12f | %17.12f %s\n", m, i, j, analytical, numerical, acceptance ? "✔" : "✗")
@@ -123,7 +123,7 @@ Y_{lm}(\theta,\varphi)^* Y_{l'm'}(\theta,\varphi) \sin(\theta)
numerical = real(
quadgk(φ ->
quadgk(θ ->
- conj(HA.Y(θ,φ,l=l1,m=m1)) * HA.Y(θ,φ,l=l2,m=m2) * sin(θ)
+ conj(Y(HA,θ,φ,l=l1,m=m1)) * Y(HA,θ,φ,l=l2,m=m2) * sin(θ)
, 0, π, maxevals=50)[1]
, 0, 2π, maxevals=100)[1]
)
@@ -162,15 +162,15 @@ println(raw"""
for k in 0:n
# Rodriguesの公式の展開
@variables x
- Dn = n==0 ? x->x : Differential(x)^n # dⁿ/dxⁿ
- Dk = k==0 ? x->x : Differential(x)^k # dᵐ/dxᵐ
- a = exp(x) / factorial(n) # left
- b = exp(-x) * x^n # right
- c = Dk(a * Dn(b)) # Rodrigues' formula
- d = expand_derivatives(c) # expand dⁿ/dxⁿ and dᵐ/dxᵐ
- e = simplify(d, expand=true) # simplify
- f = simplify(HA.L(x, n=n, k=k), expand=true) # closed-form
- g = simplify((-1)^k * MP.Lαint(x, n=n-k, α=k), expand=true) # closed-form
+ Dn = n==0 ? x->x : Differential(x)^n # dⁿ/dxⁿ
+ Dk = k==0 ? x->x : Differential(x)^k # dᵐ/dxᵐ
+ a = exp(x) / factorial(n) # left
+ b = exp(-x) * x^n # right
+ c = Dk(a * Dn(b)) # Rodrigues' formula
+ d = expand_derivatives(c) # expand dⁿ/dxⁿ and dᵐ/dxᵐ
+ e = simplify(d, expand=true) # simplify
+ f = simplify(L(HA, x, n=n, k=k), expand=true) # closed-form
+ g = simplify((-1)^k * L(MP, x, n=n-k, α=k), expand=true) # closed-form
# latexify
eq1 = latexify(e, env=:raw)
eq2 = latexify(f, env=:raw)
@@ -220,7 +220,7 @@ Replace $n+k$ with $n$ for [the definition of Wolfram MathWorld](https://mathwor
for j in 0:7
for k in 0:min(i,j)
analytical = factorial(i) / factorial(i-k) * (i == j ? 1 : 0)
- numerical = quadgk(x -> exp(-x) * x^k * HA.L(x, n=i, k=k) * HA.L(x, n=j, k=k), 0, Inf, maxevals=10^3)[1]
+ numerical = quadgk(x -> exp(-x) * x^k * L(HA, x, n=i, k=k) * L(HA, x, n=j, k=k), 0, Inf, maxevals=10^3)[1]
acceptance = iszero(analytical) ? isapprox(analytical, numerical, atol=1e-5) : isapprox(analytical, numerical, rtol=1e-5)
@test acceptance
@printf("%2d | %2d | %2d | %17.12f | %17.12f %s\n", i, j, k, analytical, numerical, acceptance ? "✔" : "✗")
@@ -250,7 +250,7 @@ println(raw"""
for n in 1:9
for l in 0:n-1
analytical = 1
- numerical = quadgk(r -> r^2 * HA.R(r,n=n,l=l)^2, 0, Inf, maxevals=10^3)[1]
+ numerical = quadgk(r -> r^2 * R(HA,r,n=n,l=l)^2, 0, Inf, maxevals=10^3)[1]
acceptance = iszero(analytical) ? isapprox(analytical, numerical, atol=1e-5) : isapprox(analytical, numerical, rtol=1e-5)
@test acceptance
@printf("%2d | %2d | %17.12f | %17.12f %s\n", n, l, analytical, numerical, acceptance ? "✔" : "✗")
@@ -288,7 +288,7 @@ Reference:
for n in 1:9
for l in 0:n-1
analytical = HA.a₀/2/HA.Z * (3*n^2-l*(l+1))
- numerical = quadgk(r -> r^3 * HA.R(r,n=n,l=l)^2, 0, Inf, maxevals=10^3)[1]
+ numerical = quadgk(r -> r^3 * R(HA,r,n=n,l=l)^2, 0, Inf, maxevals=10^3)[1]
acceptance = iszero(analytical) ? isapprox(analytical, numerical, atol=1e-5) : isapprox(analytical, numerical, rtol=1e-5)
@test acceptance
@printf("%2d | %2d | %17.12f | %17.12f %s\n", n, l, analytical, numerical, acceptance ? "✔" : "✗")
@@ -325,7 +325,7 @@ Reference:
for n in 1:9
for l in 0:n-1
analytical = HA.a₀^2/2/HA.Z^2 * n^2*(5*n^2+1-3*l*(l+1))
- numerical = quadgk(r -> r^4 * HA.R(r,n=n,l=l)^2, 0, Inf, maxevals=10^3)[1]
+ numerical = quadgk(r -> r^4 * R(HA,r,n=n,l=l)^2, 0, Inf, maxevals=10^3)[1]
acceptance = iszero(analytical) ? isapprox(analytical, numerical, atol=1e-5) : isapprox(analytical, numerical, rtol=1e-5)
@test acceptance
@printf("%2d | %2d | %17.12f | %17.12f %s\n", n, l, analytical, numerical, acceptance ? "✔" : "✗")
@@ -354,8 +354,8 @@ The virial theorem $2\langle T \rangle + \langle V \rangle = 0$ and the definiti
println(" n | analytical | numerical ")
println("-- | ----------------- | ----------------- ")
for n in 1:10
- analytical = HA.E(n=n) * 2
- numerical = quadgk(r -> 4*π*r^2 * conj(HA.ψ(r,0,0, n=n)) * HA.V(r) * HA.ψ(r,0,0, n=n), 0, Inf, maxevals=10^3)[1]
+ analytical = E(HA, n=n) * 2
+ numerical = quadgk(r -> 4*π*r^2 * conj(ψ(HA,r,0,0, n=n)) * V(HA,r) * ψ(HA,r,0,0, n=n), 0, Inf, maxevals=10^3)[1]
acceptance = iszero(analytical) ? isapprox(analytical, numerical, atol=1e-5) : isapprox(analytical, numerical, rtol=1e-5)
@test acceptance
@printf("%2d | %17.12f | %17.12f %s\n", n, analytical, numerical, acceptance ? "✔" : "✗")
@@ -391,7 +391,7 @@ println(raw"""
quadgk(phi ->
quadgk(theta ->
quadgk(r ->
- r^2 * sin(theta) * conj(HA.ψ(r,theta,phi,n=n1,l=l1,m=m1)) * HA.ψ(r,theta,phi,n=n2,l=l2,m=m2)
+ r^2 * sin(theta) * conj(ψ(HA,r,theta,phi,n=n1,l=l1,m=m1)) * ψ(HA,r,theta,phi,n=n2,l=l2,m=m2)
, 0, Inf, maxevals=50)[1]
, 0, π, maxevals=4)[1]
, 0, 2π, maxevals=8)[1]
diff --git a/test/InfinitePotentialWell.jl b/test/InfinitePotentialWell.jl
index daccbb3..6bd31a7 100644
--- a/test/InfinitePotentialWell.jl
+++ b/test/InfinitePotentialWell.jl
@@ -3,7 +3,7 @@ using Test
using Printf
using Markdown
using QuadGK
-IPW = antique(:InfinitePotentialWell, L=1.0, m=1.0, ℏ=1.0)
+IPW = InfinitePotentialWell(L=1.0, m=1.0, ℏ=1.0)
# <ψᵢ|ψⱼ> = ∫ψₙ*ψₙdx = δᵢⱼ
@@ -27,7 +27,7 @@ println(raw"""
for i in 1:10
for j in 1:10
analytical = (i == j ? 1 : 0)
- numerical = quadgk(x -> conj(IPW.ψ(x, n=i, L=IPW.L)) * IPW.ψ(x, n=j, L=IPW.L), 0.0, IPW.L, maxevals=10^3)[1]
+ numerical = quadgk(x -> conj(ψ(IPW, x, n=i)) * ψ(IPW, x, n=j), 0.0, IPW.L, maxevals=10^3)[1]
acceptance = iszero(analytical) ? isapprox(analytical, numerical, atol=1e-5) : isapprox(analytical, numerical, rtol=1e-5)
@test acceptance
@printf("%2d | %2d | %17.12f | %17.12f %s\n", i, j, analytical, numerical, acceptance ? "✔" : "✗")
@@ -110,15 +110,16 @@ are given by the sum of 2 Taylor series:
```""")
@testset "<ψₙ|H|ψₙ> = ∫ψₙ*Tψₙdx = Eₙ" begin
- ψTψ(x; n=0, L=IPW.L, m=IPW.m, ℏ=IPW.ℏ, Δx=0.01) = -ℏ^2/(2*m)*conj(IPW.ψ(x,n=n,L=L))*(IPW.ψ(x+Δx,n=n,L=L)-2*IPW.ψ(x,n=n,L=L)+IPW.ψ(x-Δx,n=n,L=L))/Δx^2
+ ψTψ(IPW, x; n=0, Δx=0.01) = -IPW.ℏ^2/(2*IPW.m)*conj(ψ(IPW,x,n=n))*(ψ(IPW,x+Δx,n=n)-2*ψ(IPW,x,n=n)+ψ(IPW,x-Δx,n=n))/Δx^2
println(" L | m | ℏ | n | analytical | numerical ")
println("--- | --- | --- | -- | ----------------- | ----------------- ")
for L in [0.1, 1.0]
for m in [0.1, 1.0]
for ℏ in [0.1, 1.0]
for n in 1:10
- analytical = IPW.E(n=n, L=L, m=m, ℏ=ℏ)
- numerical = quadgk(x -> ψTψ(x, n=n, L=L, m=m, ℏ=ℏ, Δx=L*0.0001), 0, L, maxevals=10^3)[1]
+ IPW = InfinitePotentialWell(L=L, m=m, ℏ=ℏ)
+ analytical = E(IPW, n=n)
+ numerical = quadgk(x -> ψTψ(IPW, x, n=n, Δx=L*0.0001), 0, L, maxevals=10^3)[1]
acceptance = iszero(analytical) ? isapprox(analytical, numerical, atol=1e-5) : isapprox(analytical, numerical, rtol=1e-5)
@test acceptance
@printf("%.1f | %.1f | %.1f | %2d | %17.12f | %17.12f %s\n", L, m, ℏ, n, numerical, analytical, acceptance ? "✔" : "✗")
@@ -153,8 +154,9 @@ Reference:
println("--- | -- | ----------------- | ----------------- ")
for L in [0.1, 0.5, 1.0, 7.0]
for n in 1:1
+ IPW = InfinitePotentialWell(L=L, m=1.0, ℏ=1.0)
analytical = L/2
- numerical = quadgk(x -> conj(IPW.ψ(x, n=n, L=L)) * x * IPW.ψ(x, n=n, L=L), 0, L, maxevals=10^3)[1]
+ numerical = quadgk(x -> conj(ψ(IPW, x, n=n)) * x * ψ(IPW, x, n=n), 0, L, maxevals=10^3)[1]
acceptance = iszero(analytical) ? isapprox(analytical, numerical, atol=1e-5) : isapprox(analytical, numerical, rtol=1e-5)
@test acceptance
@printf("%.1f | %2d | %17.12f | %17.12f %s\n", L, n, numerical, analytical, acceptance ? "✔" : "✗")
@@ -186,8 +188,9 @@ Reference:
println("--- | -- | ----------------- | ----------------- ")
for L in [0.1, 0.5, 1.0, 7.0]
for n in 1:1
+ IPW = InfinitePotentialWell(L=L, m=1.0, ℏ=1.0)
analytical = 2*L^2/π^3 * (π^3/6 - π/4)
- numerical = quadgk(x -> conj(IPW.ψ(x, n=n, L=L)) * x^2 * IPW.ψ(x, n=n, L=L), 0, L, maxevals=10^3)[1]
+ numerical = quadgk(x -> conj(ψ(IPW, x, n=n)) * x^2 * ψ(IPW, x, n=n), 0, L, maxevals=10^3)[1]
acceptance = iszero(analytical) ? isapprox(analytical, numerical, atol=1e-5) : isapprox(analytical, numerical, rtol=1e-5)
@test acceptance
@printf("%.1f | %2d | %17.12f | %17.12f %s\n", L, n, numerical, analytical, acceptance ? "✔" : "✗")
@@ -274,13 +277,14 @@ are given by the sum of 2 Taylor series:
```""")
@testset "<ψₙ|p|ψₙ> = ∫ψₙ*(-iℏd/dx)ψₙdx = 0" begin
- ψpψ(x; n=0, L=IPW.L, m=IPW.m, ℏ=IPW.ℏ, Δx=0.01) = -im*ℏ*conj(IPW.ψ(x,n=n,L=L))*(IPW.ψ(x+Δx,n=n,L=L)-IPW.ψ(x-Δx,n=n,L=L))/2/Δx
+ ψpψ(IPW, x; n=0, Δx=0.01) = -im*IPW.ℏ*conj(ψ(IPW,x,n=n))*(ψ(IPW,x+Δx,n=n)-ψ(IPW,x-Δx,n=n))/2/Δx
println(" L | n | analytical | numerical ")
println("--- | -- | ----------------- | ----------------- ")
for L in [0.1, 0.5, 1.0, 7.0]
for n in 1:1
+ IPW = InfinitePotentialWell(L=L, m=1.0, ℏ=1.0)
analytical = 0
- numerical = abs(quadgk(x -> ψpψ(x, n=n, L=L, m=IPW.m, ℏ=IPW.ℏ, Δx=L*0.0001), 0, L, maxevals=10^3)[1])
+ numerical = abs(quadgk(x -> ψpψ(IPW, x, n=n, Δx=L*0.0001), 0, L, maxevals=10^3)[1])
acceptance = iszero(analytical) ? isapprox(analytical, numerical, atol=1e-5) : isapprox(analytical, numerical, rtol=1e-5)
@test acceptance
@printf("%.1f | %2d | %17.12f | %17.12f %s\n", L, n, numerical, analytical, acceptance ? "✔" : "✗")
@@ -369,13 +373,14 @@ are given by the sum of 2 Taylor series:
```""")
@testset "<ψₙ|p²|ψₙ> = ∫ψₙ*(-ℏ²d²/dx²)ψₙdx = π²ℏ²/L²" begin
- ψp²ψ(x; n=0, L=IPW.L, m=IPW.m, ℏ=IPW.ℏ, Δx=0.01) = -ℏ^2*conj(IPW.ψ(x,n=n,L=L))*(IPW.ψ(x+Δx,n=n,L=L)-2*IPW.ψ(x,n=n,L=L)+IPW.ψ(x-Δx,n=n,L=L))/Δx^2
+ ψp²ψ(IPW, x; n=0, Δx=0.01) = -IPW.ℏ^2*conj(ψ(IPW,x,n=n))*(ψ(IPW,x+Δx,n=n)-2*ψ(IPW,x,n=n)+ψ(IPW,x-Δx,n=n))/Δx^2
println(" L | n | analytical | numerical ")
println("--- | -- | ----------------- | ----------------- ")
for L in [0.1, 0.5, 1.0, 7.0]
for n in 1:1
+ IPW = InfinitePotentialWell(L=L, m=1.0, ℏ=1.0)
analytical = π^2*IPW.ℏ^2/L^2
- numerical = quadgk(x -> ψp²ψ(x, n=n, L=L, m=IPW.m, ℏ=IPW.ℏ, Δx=L*0.0001), 0, L, maxevals=10^3)[1]
+ numerical = quadgk(x -> ψp²ψ(IPW, x, n=n, Δx=L*0.0001), 0, L, maxevals=10^3)[1]
acceptance = iszero(analytical) ? isapprox(analytical, numerical, atol=1e-5) : isapprox(analytical, numerical, rtol=1e-5)
@test acceptance
@printf("%.1f | %2d | %17.12f | %17.12f %s\n", L, n, numerical, analytical, acceptance ? "✔" : "✗")
diff --git a/test/MorsePotential.jl b/test/MorsePotential.jl
index 80ece16..35226ef 100644
--- a/test/MorsePotential.jl
+++ b/test/MorsePotential.jl
@@ -7,7 +7,7 @@ using Symbolics
using Latexify
using LaTeXStrings
using SpecialFunctions
-MP = antique(:MorsePotential)
+MP = MorsePotential()
# Lₙ⁽ᵅ⁾(x) = x⁻ᵅeˣ/n! dⁿ/dxⁿ xⁿ⁺ᵅe⁻ˣ
@@ -30,13 +30,13 @@ println(raw"""
for α in 0:n
# Rodriguesの公式の展開
@variables x
- D = n==0 ? x->x : Differential(x)^n # dⁿ/dxⁿ
- a = exp(x) * x^(-α) / factorial(n) # left
- b = exp(-x) * x^(n+α) # right
- c = a * D(b) # Rodrigues' formula
- d = expand_derivatives(c) # expand dⁿ/dxⁿ
- e = simplify(d, expand=true) # simplify
- f = simplify(MP.Lαint(x, n=n, α=α), expand=true) # closed-form
+ D = n==0 ? x->x : Differential(x)^n # dⁿ/dxⁿ
+ a = exp(x) * x^(-α) / factorial(n) # left
+ b = exp(-x) * x^(n+α) # right
+ c = a * D(b) # Rodrigues' formula
+ d = expand_derivatives(c) # expand dⁿ/dxⁿ
+ e = simplify(d, expand=true) # simplify
+ f = simplify(L(MP, x, n=n, α=α), expand=true) # closed-form
# latexify
eq1 = latexify(e, env=:raw)
eq2 = latexify(f, env=:raw)
@@ -83,7 +83,7 @@ println(raw"""
for i in 0:9
for j in 0:9
analytical = gamma(i+α+1)/factorial(i)*(i == j ? 1 : 0)
- numerical = quadgk(x -> real(MP.L(x, n=i, α=α)) * real(MP.L(x, n=j, α=α)) * x^α * exp(-x), 0, Inf, maxevals=10^3)[1]
+ numerical = quadgk(x -> real(L(MP, x, n=i, α=α)) * real(L(MP, x, n=j, α=α)) * x^α * exp(-x), 0, Inf, maxevals=10^3)[1]
acceptance = iszero(analytical) ? isapprox(analytical, numerical, atol=1e-5) : isapprox(analytical, numerical, rtol=1e-5)
@test acceptance
@printf("%4.2f | %2d | %2d | %17.12f | %17.12f %s\n", α, i, j, analytical, numerical, acceptance ? "✔" : "✗")
@@ -114,7 +114,7 @@ println(raw"""
for i in 0:9
for j in 0:9
analytical = (i == j ? 1 : 0)
- numerical = quadgk(x -> conj(MP.ψ(x, n=i)) * MP.ψ(x, n=j), 0, Inf, maxevals=10^3)[1]
+ numerical = quadgk(x -> conj(ψ(MP, x, n=i)) * ψ(MP, x, n=j), 0, Inf, maxevals=10^3)[1]
acceptance = iszero(analytical) ? isapprox(analytical, numerical, atol=1e-5) : isapprox(analytical, numerical, rtol=1e-5)
@test acceptance
@printf("%2d | %2d | %17.12f | %17.12f %s\n", i, j, analytical, numerical, acceptance ? "✔" : "✗")
@@ -195,13 +195,14 @@ are given by the sum of 2 Taylor series:
```""")
@testset "<ψₙ|H|ψₙ> = ∫ψₙ*Hψₙdx = Eₙ" begin
- ψHψ(r; n=0, rₑ=MP.rₑ, Dₑ=MP.Dₑ, k=MP.k, µ=MP.µ, ℏ=MP.ℏ, Δr=0.005) = MP.V(r,rₑ=rₑ,Dₑ=Dₑ,k=k)*MP.ψ(r,n=n,rₑ=rₑ,Dₑ=Dₑ,k=k,µ=µ,ℏ=ℏ)^2 - ℏ^2/(2*μ)*conj(MP.ψ(r,n=n,rₑ=rₑ,Dₑ=Dₑ,k=k,µ=µ,ℏ=ℏ))*(MP.ψ(r+Δr,n=n,rₑ=rₑ,Dₑ=Dₑ,k=k,µ=µ,ℏ=ℏ)-2*MP.ψ(r,n=n,rₑ=rₑ,Dₑ=Dₑ,k=k,µ=µ,ℏ=ℏ)+MP.ψ(r-Δr,n=n,rₑ=rₑ,Dₑ=Dₑ,k=k,µ=µ,ℏ=ℏ))/Δr^2
+ ψHψ(MP, r; n=0, Δr=0.005) = V(MP,r)*ψ(MP,r,n=n)^2 - MP.ℏ^2/(2*MP.μ)*conj(ψ(MP,r,n=n))*(ψ(MP,r+Δr,n=n)-2*ψ(MP,r,n=n)+ψ(MP,r-Δr,n=n))/Δr^2
println(" k | n | analytical | numerical ")
println("--- | -- | ----------------- | ----------------- ")
for k in [0.1,0.2,0.3,MP.k]
for n in 0:9
- analytical = MP.E(n=n,rₑ=MP.rₑ,Dₑ=MP.Dₑ,k=k,µ=MP.µ,ℏ=MP.ℏ)
- numerical = quadgk(r -> ψHψ(r,n=n, rₑ=MP.rₑ, Dₑ=MP.Dₑ, k=k, µ=MP.µ, ℏ=MP.ℏ, Δr=0.0001), 0.0001, Inf, maxevals=10^4)[1]
+ MP = MorsePotential(k=k)
+ analytical = E(MP, n=n)
+ numerical = quadgk(r -> ψHψ(MP, r, n=n, Δr=0.0001), 0.0001, Inf, maxevals=10^4)[1]
acceptance = iszero(analytical) ? isapprox(analytical, numerical, atol=1e-5) : isapprox(analytical, numerical, rtol=1e-5)
@test acceptance
@printf("%.1f | %2d | %17.12f | %17.12f %s\n", k, n, analytical, numerical, acceptance ? "✔" : "✗")
diff --git a/test/runtests.jl b/test/runtests.jl
index 5f20a69..75e28ef 100644
--- a/test/runtests.jl
+++ b/test/runtests.jl
@@ -4,9 +4,8 @@ using Suppressor
@testset "Antique.jl" begin
@suppress_out begin
- include("./InfinitePotentialWell.jl")
- include("./HarmonicOscillator.jl")
- include("./MorsePotential.jl")
- include("./HydrogenAtom.jl")
+ for model in Antique.models
+ include("./$(model).jl")
+ end
end
end