diff --git a/README.md b/README.md index ad57f3f..31ed00e 100644 --- a/README.md +++ b/README.md @@ -65,9 +65,10 @@ This is the guideline for adding new models. 6. Write the code in that file. First we need to create a structure `struct ModelName` with the same name as the model name (The best way is Find & Replace). Create V, E, ψ and other functions. Because the function names conflict, you must always give the structure as an argument. Multi-dispatch avoids conflict. We recommend using Revice.jl while coding. Run `include("./developer/revice.jl")` on the REPL or use dev.ipynb. 7. Add test code test/ModelName.jl. At a minimum, it is recommended to check the normalization and the orthogonality of wavefunction using QuadGK.jl. All tests will be executed by executing `include("./developer/test.jl")`. It will take about 2 minutes to complete. 8. Add documentation. Add either docs/ModelName.md or docs/jmd/ModelName.jmd (if you have a jmd file, the md file will be automatically generated). Include at least the definition of the Hamiltonian and the analytical solutions (eigenvalues and eigenfunctions). -9. Execute `include("./developer/docs.jl")` to compile. Please check docs/build/*.html in your browser. -10. Push the code. -11. Submit a pull request on GitHub. +9. Add the new model into `pages=[...]` in docs/make.jl. +10. Execute `include("./developer/docs.jl")` to compile. Please check docs/build/*.html in your browser. +11. Push the code. +12. Submit a pull request on GitHub. ## Acknowledgment diff --git a/developer/dev.ipynb b/developer/dev.ipynb index e025792..219f1be 100644 --- a/developer/dev.ipynb +++ b/developer/dev.ipynb @@ -10,8 +10,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "\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" + "\u001b[32m\u001b[1m Activating\u001b[22m\u001b[39m project at `C:\\Users\\user\\Desktop\\jafar-san\\Antique.jl`\n" ] } ], @@ -22,19 +21,28 @@ "# Pkg.add(\"Revise\")\n", "using Revise\n", "Pkg.activate(\"../\")\n", - "using Antique" + "using Antique\n", + "using Plots" + ] + }, + { + "cell_type": "markdown", + "id": "a6888ba8", + "metadata": {}, + "source": [ + "### Delta function potential" ] }, { "cell_type": "code", "execution_count": 2, - "id": "526ca10f", + "id": "8884afc6", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "-0.5" + "DeltaPotential(0.1, 0.5, 0.1)" ] }, "execution_count": 2, @@ -43,21 +51,19 @@ } ], "source": [ - "using Antique\n", - "H = HydrogenAtom(Z=1)\n", - "E(H)" + "DP = DeltaPotential(α=0.1,m=0.5, ℏ=0.1)" ] }, { "cell_type": "code", "execution_count": 3, - "id": "4e1782eb", + "id": "f0b00381", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "-2.0" + "-0.25" ] }, "execution_count": 3, @@ -66,10 +72,334 @@ } ], "source": [ - "using Antique\n", - "He⁺ = HydrogenAtom(Z=2)\n", - "E(He⁺)" + "E(DP)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "67eaadcd", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/html": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x = LinRange(-2,2,500);\n", + "ψδ = ψ(DP,x);\n", + "\n", + "plot(x,ψδ,linewidth=3)\n", + "plot!(xlim=[-2,2],ylim=[0,2.5],legend=false)\n", + "plot!(xlabel=\"x\",ylabel=\"ψ\",title=\"Delta Potential\")" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "8cc7f0a4", + "metadata": {}, + "outputs": [], + "source": [ + "using QuadGK\n", + "using Printf" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "6aaddfcb", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "true" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "analytical = 1\n", + "numerical = quadgk(x -> conj(ψ(DP, x)) * ψ(DP, x), -Inf, Inf, maxevals=10^3)[1]\n", + "acceptance = iszero(analytical) ? isapprox(analytical, numerical, atol=1e-5) : isapprox(analytical, numerical, rtol=1e-5)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "40f8eeef", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " 1.000000000000 | 1.000000000000 ✔\n" + ] + } + ], + "source": [ + "@printf(\"%17.12f | %17.12f %s\\n\", analytical, numerical, acceptance ? \"✔\" : \"✗\")" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "7320de50", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "\\texttt{V(model::DeltaPotential; x)}\n", + "\n", + "$$ V(x) = -\\alpha \\delta(x).$$\n" + ], + "text/markdown": [ + "`V(model::DeltaPotential; x)`\n", + "\n", + "$$\n", + " V(x) = -\\alpha \\delta(x).\n", + "$$\n" + ], + "text/plain": [ + " \u001b[36mV(model::DeltaPotential; x)\u001b[39m\n", + "\n", + "\u001b[35m V(x) = -\\alpha \\delta(x).\u001b[39m" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "? V(::DeltaPotential)" ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "a18a07f5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "\\texttt{E(model::DeltaPotential)}\n", + "\n", + "$$ E = - \\frac{m\\alpha^2}{2\\hbar^2}$$\n" + ], + "text/markdown": [ + "`E(model::DeltaPotential)`\n", + "\n", + "$$\n", + " E = - \\frac{m\\alpha^2}{2\\hbar^2}\n", + "$$\n" + ], + "text/plain": [ + " \u001b[36mE(model::DeltaPotential)\u001b[39m\n", + "\n", + "\u001b[35m E = - \\frac{m\\alpha^2}{2\\hbar^2}\u001b[39m" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "? E(::DeltaPotential)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "d4714c05", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "\\texttt{ψ(model::DeltaPotential, x)}\n", + "\n", + "$$ \\psi(x) = \\frac{\\sqrt{m\\alpha}}{\\hbar} \\mathrm{e}^{-m\\alpha |x|/\\hbar^2}$$\n" + ], + "text/markdown": [ + "`ψ(model::DeltaPotential, x)`\n", + "\n", + "$$\n", + " \\psi(x) = \\frac{\\sqrt{m\\alpha}}{\\hbar} \\mathrm{e}^{-m\\alpha |x|/\\hbar^2}\n", + "$$\n" + ], + "text/plain": [ + " \u001b[36mψ(model::DeltaPotential, x)\u001b[39m\n", + "\n", + "\u001b[35m \\psi(x) = \\frac{\\sqrt{m\\alpha}}{\\hbar} \\mathrm{e}^{-m\\alpha |x|/\\hbar^2}\u001b[39m" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "? ψ(::DeltaPotential)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "8668b1aa", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "search: \u001b[0m\u001b[1mD\u001b[22m\u001b[0m\u001b[1me\u001b[22m\u001b[0m\u001b[1ml\u001b[22m\u001b[0m\u001b[1mt\u001b[22m\u001b[0m\u001b[1ma\u001b[22m\u001b[0m\u001b[1mP\u001b[22m\u001b[0m\u001b[1mo\u001b[22m\u001b[0m\u001b[1mt\u001b[22m\u001b[0m\u001b[1me\u001b[22m\u001b[0m\u001b[1mn\u001b[22m\u001b[0m\u001b[1mt\u001b[22m\u001b[0m\u001b[1mi\u001b[22m\u001b[0m\u001b[1ma\u001b[22m\u001b[0m\u001b[1ml\u001b[22m\n", + "\n" + ] + }, + { + "data": { + "text/latex": [ + "\\texttt{DeltaPotential(α=1.0, m=1.0, ℏ=1.0)}\n", + "\n", + "$\\alpha$ is the potential strength, $m$ is the mass of particle and $\\hbar$ is the reduced Planck constant (Dirac's constant).\n", + "\n" + ], + "text/markdown": [ + "`DeltaPotential(α=1.0, m=1.0, ℏ=1.0)`\n", + "\n", + "$\\alpha$ is the potential strength, $m$ is the mass of particle and $\\hbar$ is the reduced Planck constant (Dirac's constant).\n" + ], + "text/plain": [ + " \u001b[36mDeltaPotential(α=1.0, m=1.0, ℏ=1.0)\u001b[39m\n", + "\n", + " \u001b[35m\\alpha\u001b[39m is the potential strength, \u001b[35mm\u001b[39m is the mass of particle and \u001b[35m\\hbar\u001b[39m is the\n", + " reduced Planck constant (Dirac's constant)." + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "? DeltaPotential" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ed42032", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/docs/jmd2md.jl b/docs/jmd2md.jl index 327190b..a657482 100644 --- a/docs/jmd2md.jl +++ b/docs/jmd2md.jl @@ -1,7 +1,7 @@ using Antique using Weave -for file in Antique.models # [:InfinitePotentialWell :HarmonicOscillator :MorsePotential :HydrogenAtom] +for file in Antique.models # [:DeltaPotential] 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/make.jl b/docs/make.jl index 7b13426..8dfda4a 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -24,6 +24,7 @@ makedocs(; "Harmonic Oscillator" => "HarmonicOscillator.md" , "Morse Potential" => "MorsePotential.md" , "Hydrogen Atom" => "HydrogenAtom.md" , + "Delta Potential" => "DeltaPotential.md" , ], ) diff --git a/docs/src/DeltaPotential.md b/docs/src/DeltaPotential.md new file mode 100644 index 0000000..377f636 --- /dev/null +++ b/docs/src/DeltaPotential.md @@ -0,0 +1,139 @@ +```@meta +CurrentModule = Antique +``` + +# Delta Potential + +The Delta potential is one of the simplest models for quantum mechanical system in 1D. +It always has one bound state and its wave function has a cusp at the origin. + +## Defitions + +This model is described with the time-independent Schrödinger equation + +```math + \hat{H} \psi(x) = E \psi(x), +``` + +and the Hamiltonian +```math + \hat{H} = - \frac{\hbar^2}{2m} \frac{\mathrm{d}^2}{\mathrm{d}x ^2} + V(x). +``` + +Parameters are specified with the following struct. + +#### Parameters + +```@docs +DeltaPotential +``` + +#### Potential +```@docs +V(::DeltaPotential) +``` + +#### Eigen Values +```@docs +E(::DeltaPotential) +``` + +#### Eigen Functions +```@docs +ψ(::DeltaPotential) +``` + +## Usage & Examples + +[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 `DeltaPotential` and several parameters `α`, `m` and `ℏ` are set as optional arguments. + +```julia +using Antique +DP = DeltaPotential(α=1.0, m=1.0, ℏ=1.0) +``` + + + + +Parameters: + +```julia +julia> DP.α +1.0 + +julia> DP.m +1.0 + +julia> DP.ℏ +1.0 +``` + + + +Eigen values: + +```julia +julia> E(DP) +-0.5 +``` + + + +Wave functions: + +```julia +DP = DeltaPotential(α=0.1, m=0.5, ℏ=0.1) +x = LinRange(-2,2,500); + +using Plots +plot(x, x->ψ(DP,x), linewidth=3) +plot!(xlim=[-2,2], ylim=[0,2.5], legend=false) +plot!(xlabel="x", ylabel="ψ(x)", title="Delta Potential") +``` + +![](./assets/fig//DeltaPotential_4_1.png) + + + +## Testing + +Unit testing and Integration testing were done using numerical integration ([QuadGK.jl](https://juliamath.github.io/QuadGK.jl/stable/)). The test script is [here](https://github.com/ohno/Antique.jl/blob/main/test/DeltaPotential.jl). + +#### Normalization of $\psi(x)$ + +```math +\int_{-\infty}^{\infty} \psi^\ast(x) \psi(x) ~\mathrm{d}x = 1 +``` + +``` + α | m | ℏ | analytical | numerical +--- | --- | --- | ----------------- | ----------------- +0.1 | 0.1 | 0.1 | 1.000000000000 | 1.000000000000 ✔ +0.1 | 0.1 | 1.0 | 1.000000000000 | 1.000000000000 ✔ +0.1 | 0.1 | 7.0 | 1.000000000000 | 1.000004676239 ✔ +0.1 | 1.0 | 0.1 | 1.000000000000 | 1.000000000000 ✔ +0.1 | 1.0 | 1.0 | 1.000000000000 | 1.000000000000 ✔ +0.1 | 1.0 | 7.0 | 1.000000000000 | 0.999999999999 ✔ +0.1 | 7.0 | 0.1 | 1.000000000000 | 1.000000000000 ✔ +0.1 | 7.0 | 1.0 | 1.000000000000 | 1.000000000000 ✔ +0.1 | 7.0 | 7.0 | 1.000000000000 | 1.000000000000 ✔ +1.0 | 0.1 | 0.1 | 1.000000000000 | 1.000000000000 ✔ +1.0 | 0.1 | 1.0 | 1.000000000000 | 1.000000000000 ✔ +1.0 | 0.1 | 7.0 | 1.000000000000 | 0.999999999999 ✔ +1.0 | 1.0 | 0.1 | 1.000000000000 | 1.000000000000 ✔ +1.0 | 1.0 | 1.0 | 1.000000000000 | 1.000000000000 ✔ +1.0 | 1.0 | 7.0 | 1.000000000000 | 1.000000000000 ✔ +1.0 | 7.0 | 0.1 | 1.000000000000 | 1.000000000000 ✔ +1.0 | 7.0 | 1.0 | 1.000000000000 | 1.000000000000 ✔ +1.0 | 7.0 | 7.0 | 1.000000000000 | 1.000000000000 ✔ +7.0 | 0.1 | 0.1 | 1.000000000000 | 1.000000000000 ✔ +7.0 | 0.1 | 1.0 | 1.000000000000 | 1.000000000000 ✔ +7.0 | 0.1 | 7.0 | 1.000000000000 | 1.000000000000 ✔ +7.0 | 1.0 | 0.1 | 1.000000000000 | 1.000000000000 ✔ +7.0 | 1.0 | 1.0 | 1.000000000000 | 1.000000000000 ✔ +7.0 | 1.0 | 7.0 | 1.000000000000 | 1.000000000000 ✔ +7.0 | 7.0 | 0.1 | 1.000000000000 | 1.000000000000 ✔ +7.0 | 7.0 | 1.0 | 1.000000000000 | 1.000000000000 ✔ +7.0 | 7.0 | 7.0 | 1.000000000000 | 1.000000000000 ✔ + +``` diff --git a/docs/src/InfinitePotentialWell.md b/docs/src/InfinitePotentialWell.md index 48aa971..d080d6f 100644 --- a/docs/src/InfinitePotentialWell.md +++ b/docs/src/InfinitePotentialWell.md @@ -17,7 +17,7 @@ The infinite potential well (particle in a box) is the simplest model for quantu #### Hamiltonian ```math - \hat{H} = \frac{\hbar^2}{2m} \frac{\mathrm{d}^2}{\mathrm{d}x ^2} + V(x) + \hat{H} = - \frac{\hbar^2}{2m} \frac{\mathrm{d}^2}{\mathrm{d}x ^2} + V(x) ``` #### Potential diff --git a/docs/src/assets/fig/DeltaPotential_4_1.png b/docs/src/assets/fig/DeltaPotential_4_1.png new file mode 100644 index 0000000..b3bee0b Binary files /dev/null and b/docs/src/assets/fig/DeltaPotential_4_1.png differ diff --git a/docs/src/index.md b/docs/src/index.md index 860cc65..3bb0f13 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -70,6 +70,12 @@ There are more examples on each model page. HydrogenAtom +
+ + DeltaPotential + + DeltaPotential +
``` @@ -89,9 +95,10 @@ This is the guideline for adding new models. 6. Write the code in that file. First we need to create a structure `struct ModelName` with the same name as the model name (The best way is Find & Replace). Create V, E, ψ and other functions. Because the function names conflict, you must always give the structure as an argument. Multi-dispatch avoids conflict. We recommend using Revice.jl while coding. Run `include("./developer/revice.jl")` on the REPL or use dev.ipynb. 7. Add test code test/ModelName.jl. At a minimum, it is recommended to check the normalization and the orthogonality of wavefunction using QuadGK.jl. All tests will be executed by executing `include("./developer/test.jl")`. It will take about 2 minutes to complete. 8. Add documentation. Add either docs/ModelName.md or docs/jmd/ModelName.jmd (if you have a jmd file, the md file will be automatically generated). Include at least the definition of the Hamiltonian and the analytical solutions (eigenvalues and eigenfunctions). -9. Execute `include("./developer/docs.jl")` to compile. Please check docs/build/*.html in your browser. -10. Push the code. -11. Submit a pull request on GitHub. +9. Add the new model into `pages=[...]` in docs/make.jl. +10. Execute `include("./developer/docs.jl")` to compile. Please check docs/build/*.html in your browser. +11. Push the code. +12. Submit a pull request on GitHub. ## Acknowledgment diff --git a/docs/src/jmd/DeltaPotential.jmd b/docs/src/jmd/DeltaPotential.jmd new file mode 100644 index 0000000..ee2b524 --- /dev/null +++ b/docs/src/jmd/DeltaPotential.jmd @@ -0,0 +1,87 @@ +```@meta +CurrentModule = Antique +``` + +# Delta Potential + +The Delta potential is one of the simplest models for quantum mechanical system in 1D. +It always has one bound state and its wave function has a cusp at the origin. + +## Defitions + +This model is described with the time-independent Schrödinger equation + +```math + \hat{H} \psi(x) = E \psi(x), +``` + +and the Hamiltonian +```math + \hat{H} = - \frac{\hbar^2}{2m} \frac{\mathrm{d}^2}{\mathrm{d}x ^2} + V(x). +``` + +Parameters are specified with the following struct. + +#### Parameters + +```@docs +DeltaPotential +``` + +#### Potential +```@docs +V(::DeltaPotential) +``` + +#### Eigen Values +```@docs +E(::DeltaPotential) +``` + +#### Eigen Functions +```@docs +ψ(::DeltaPotential) +``` + +## Usage & Examples + +[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 `DeltaPotential` and several parameters `α`, `m` and `ℏ` are set as optional arguments. + +```julia; cache = :all; results = "hidden" +using Antique +DP = DeltaPotential(α=1.0, m=1.0, ℏ=1.0) +``` + +Parameters: + +```julia; term = true +DP.α +DP.m +DP.ℏ +``` + +Eigen values: + +```julia; term = true +E(DP) +``` + +Wave functions: + +```julia +DP = DeltaPotential(α=0.1, m=0.5, ℏ=0.1) +x = LinRange(-2,2,500); + +using Plots +plot(x, x->ψ(DP,x), linewidth=3) +plot!(xlim=[-2,2], ylim=[0,2.5], legend=false) +plot!(xlabel="x", ylabel="ψ(x)", title="Delta Potential") +``` + +## Testing + +Unit testing and Integration testing were done using numerical integration ([QuadGK.jl](https://juliamath.github.io/QuadGK.jl/stable/)). The test script is [here](https://github.com/ohno/Antique.jl/blob/main/test/DeltaPotential.jl). + +```julia; line_width = 500 +println(Antique.load("../../test/result/DeltaPotential.log")) +``` \ No newline at end of file diff --git a/docs/src/jmd/InfinitePotentialWell.jmd b/docs/src/jmd/InfinitePotentialWell.jmd index d18a6ca..903a5c9 100644 --- a/docs/src/jmd/InfinitePotentialWell.jmd +++ b/docs/src/jmd/InfinitePotentialWell.jmd @@ -17,7 +17,7 @@ The infinite potential well (particle in a box) is the simplest model for quantu #### Hamiltonian ```math - \hat{H} = \frac{\hbar^2}{2m} \frac{\mathrm{d}^2}{\mathrm{d}x ^2} + V(x) + \hat{H} = - \frac{\hbar^2}{2m} \frac{\mathrm{d}^2}{\mathrm{d}x ^2} + V(x) ``` #### Potential diff --git a/src/Antique.jl b/src/Antique.jl index a03d708..1976381 100644 --- a/src/Antique.jl +++ b/src/Antique.jl @@ -6,6 +6,7 @@ module Antique :HarmonicOscillator, :MorsePotential, :HydrogenAtom, + :DeltaPotential, ] # for Julia 1.1 diff --git a/src/DeltaPotential.jl b/src/DeltaPotential.jl new file mode 100644 index 0000000..9492b23 --- /dev/null +++ b/src/DeltaPotential.jl @@ -0,0 +1,62 @@ +export DeltaPotential, V, E, ψ + +# Parameters +@kwdef struct DeltaPotential + α = 1.0 + m = 1.0 + ℏ = 1.0 +end + +# Potential +function V(model::DeltaPotential, x) + return x==0 ? -Inf : 0 +end + +# Energy +function E(model::DeltaPotential) + α = model.α + m = model.m + ℏ = model.ℏ + return -(m*α^2)/(2*ℏ^2) +end + +# Wave Function +function ψ(model::DeltaPotential, x) + α = model.α + m = model.m + ℏ = model.ℏ + return sqrt(m*α)/ℏ * exp.(-m*α*abs.(x)/ℏ^2) +end + +# Documents + +@doc raw""" +`DeltaPotential(α=1.0, m=1.0, ℏ=1.0)` + +``\alpha`` is the potential strength, ``m`` is the mass of particle and ``\hbar`` is the reduced Planck constant (Dirac's constant). + +""" DeltaPotential + +@doc raw""" +`V(model::DeltaPotential; x)` + +```math + V(x) = -\alpha \delta(x). +``` +""" V(model::DeltaPotential) + +@doc raw""" +`E(model::DeltaPotential)` + +```math + E = - \frac{m\alpha^2}{2\hbar^2} +``` +""" E(model::DeltaPotential) + +@doc raw""" +`ψ(model::DeltaPotential, x)` + +```math + \psi(x) = \frac{\sqrt{m\alpha}}{\hbar} \mathrm{e}^{-m\alpha |x|/\hbar^2} +``` +""" ψ(model::DeltaPotential) \ No newline at end of file diff --git a/test/DeltaPotential.jl b/test/DeltaPotential.jl new file mode 100644 index 0000000..17f5388 --- /dev/null +++ b/test/DeltaPotential.jl @@ -0,0 +1,33 @@ +DP = DeltaPotential(α=1.0, m=1.0, ℏ=1.0) + +# <ψᵢ|ψⱼ> = ∫ψ*ψdx = δᵢⱼ + +println(raw""" +#### Normalization of $\psi(x)$ + +```math +\int_{-\infty}^{\infty} \psi^\ast(x) \psi(x) ~\mathrm{d}x = 1 +``` + +```""") + +@testset "<ψ|ψ> = ∫ψ*ψdx = 1" begin + println(" α | m | ℏ | analytical | numerical ") + println("--- | --- | --- | ----------------- | ----------------- ") + for α in [0.1, 1.0, 7.0] + for m in [0.1, 1.0, 7.0] + for ℏ in [0.1, 1.0, 7.0] + DP = DeltaPotential(α=α, m=m, ℏ=ℏ) + analytical = 1 + numerical = quadgk(x -> conj(ψ(DP, x)) * ψ(DP, x), -Inf, Inf, maxevals=10^3, order=10)[1] + acceptance = iszero(analytical) ? isapprox(analytical, numerical, atol=1e-5) : isapprox(analytical, numerical, rtol=1e-5) + @test acceptance + @printf("%.1f | %.1f | %.1f | %17.12f | %17.12f %s\n", α, m, ℏ, analytical, numerical, acceptance ? "✔" : "✗") + end + end + end +end + +println("""``` +""") + diff --git a/test/result/DeltaPotential.log b/test/result/DeltaPotential.log new file mode 100644 index 0000000..38dee7e --- /dev/null +++ b/test/result/DeltaPotential.log @@ -0,0 +1,39 @@ +#### Normalization of $\psi(x)$ + +```math +\int_{-\infty}^{\infty} \psi^\ast(x) \psi(x) ~\mathrm{d}x = 1 +``` + +``` + α | m | ℏ | analytical | numerical +--- | --- | --- | ----------------- | ----------------- +0.1 | 0.1 | 0.1 | 1.000000000000 | 1.000000000000 ✔ +0.1 | 0.1 | 1.0 | 1.000000000000 | 1.000000000000 ✔ +0.1 | 0.1 | 7.0 | 1.000000000000 | 1.000004676239 ✔ +0.1 | 1.0 | 0.1 | 1.000000000000 | 1.000000000000 ✔ +0.1 | 1.0 | 1.0 | 1.000000000000 | 1.000000000000 ✔ +0.1 | 1.0 | 7.0 | 1.000000000000 | 0.999999999999 ✔ +0.1 | 7.0 | 0.1 | 1.000000000000 | 1.000000000000 ✔ +0.1 | 7.0 | 1.0 | 1.000000000000 | 1.000000000000 ✔ +0.1 | 7.0 | 7.0 | 1.000000000000 | 1.000000000000 ✔ +1.0 | 0.1 | 0.1 | 1.000000000000 | 1.000000000000 ✔ +1.0 | 0.1 | 1.0 | 1.000000000000 | 1.000000000000 ✔ +1.0 | 0.1 | 7.0 | 1.000000000000 | 0.999999999999 ✔ +1.0 | 1.0 | 0.1 | 1.000000000000 | 1.000000000000 ✔ +1.0 | 1.0 | 1.0 | 1.000000000000 | 1.000000000000 ✔ +1.0 | 1.0 | 7.0 | 1.000000000000 | 1.000000000000 ✔ +1.0 | 7.0 | 0.1 | 1.000000000000 | 1.000000000000 ✔ +1.0 | 7.0 | 1.0 | 1.000000000000 | 1.000000000000 ✔ +1.0 | 7.0 | 7.0 | 1.000000000000 | 1.000000000000 ✔ +7.0 | 0.1 | 0.1 | 1.000000000000 | 1.000000000000 ✔ +7.0 | 0.1 | 1.0 | 1.000000000000 | 1.000000000000 ✔ +7.0 | 0.1 | 7.0 | 1.000000000000 | 1.000000000000 ✔ +7.0 | 1.0 | 0.1 | 1.000000000000 | 1.000000000000 ✔ +7.0 | 1.0 | 1.0 | 1.000000000000 | 1.000000000000 ✔ +7.0 | 1.0 | 7.0 | 1.000000000000 | 1.000000000000 ✔ +7.0 | 7.0 | 0.1 | 1.000000000000 | 1.000000000000 ✔ +7.0 | 7.0 | 1.0 | 1.000000000000 | 1.000000000000 ✔ +7.0 | 7.0 | 7.0 | 1.000000000000 | 1.000000000000 ✔ +``` + + diff --git a/test/runtests.jl b/test/runtests.jl index 906591e..9e1fb48 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -10,7 +10,7 @@ using LaTeXStrings using SpecialFunctions @testset "Antique.jl" begin - for model in Antique.models + for model in Antique.models # [:DeltaPotential] result = @capture_out begin include("./$(model).jl") end