# Calculus of Variations

Calculus of Variations is a mathematical technique for deriving differential equations, whose solutions fulfil a certain criterion. For the case at hand, we are interested in solutions whose total energy matches with the one set up by the energy expression for all the electrons in a system. The following variational rules are useful:

\[\begin{equation} \vary{\bra{a}}\braket{a}{b} = \ket{b}, \end{equation}\]

where the notation $\vary{\bra{a}}\braket{a}{b}$ means *vary $\braket{a}{b}$ with respect to $\bra{a}$*.

\[\begin{equation} \begin{cases} \vary{\bra{l}}\onebody{l}{k} &= \vary{\bra{l}}\matrixel{l}{\hamiltonian}{k} = \hamiltonian\ket{k},\\ \vary{\ket{k}}\onebody{l}{k} &= \bra{l}\hamiltonian. \end{cases} \end{equation}\]

\[\begin{equation} \begin{aligned} \vary{\bra{a}}\twobodydx{ab}{cd} &= \vary{\bra{a}}\{\twobody{ab}{cd}-\twobody{ab}{dc}\} = \vary{\bra{a}}\{\matrixel{ab}{r_{12}^{-1}}{cd}-\matrixel{ab}{r_{12}^{-1}}{dc}\} \\ &= \matrixel{b}{r_{12}^{-1}}{d}\ket{c}- \matrixel{b}{r_{12}^{-1}}{c}\ket{d} \equiv \twobody{b}{d}\ket{c}- \twobody{b}{c}\ket{d}\defd (\direct{bd}-\exchange{bd})\ket{c}. \end{aligned} \end{equation}\]

## Helium

Returning to our helium example (now only considering the ground state):

```
julia> he = SlaterDeterminant.(spin_configurations(c"1s2"))
1-element Array{SlaterDeterminant{SpinOrbital{Orbital{Int64}}},1}:
|1s₀α 1s₀β|
julia> a,b = he[1].orbitals
2-element Array{SpinOrbital{Orbital{Int64}},1}:
1s₀α
1s₀β
```

First we find the energy expression:

```
julia> E = Matrix(OneBodyHamiltonian() + CoulombInteraction(), he)
1×1 Array{EnergyExpressions.NBodyMatrixElement,2}:
(1s₀α|1s₀α) + (1s₀β|1s₀β) + F(1s₀α,1s₀β)
```

We can now vary this expression with respect to the different spin-orbitals; by convention, we vary the expression with respect to the *conjugate* orbitals, to derive equations for the *unconjugated* ones (this is important for complex orbitals, which is the case when studying time-dependent problems):

```
julia> diff(E, Conjugate(a))
1×1 SparseArrays.SparseMatrixCSC{LinearCombinationEquation,Int64} with 1 stored entry:
[1, 1] = ĥ|1s₀α⟩ + [1s₀β|1s₀β]|1s₀α⟩
julia> diff(E, Conjugate(b))
1×1 SparseArrays.SparseMatrixCSC{LinearCombinationEquation,Int64} with 1 stored entry:
[1, 1] = ĥ|1s₀β⟩ + [1s₀α|1s₀α]|1s₀β⟩
```

This result means that the variation of the first integral in the one-body part of the energy expression yields the one-body Hamiltonian $\hamiltonian$ acting on the orbital `1s₀α`

, whereas the second integral, not containing the first orbital, varies to yield zero. The two-body energy `F(1s₀α,1s₀β)`

varies to yield the two-body potential `[1s₀β|1s₀β]`

, again acting on the orbital `1s₀α`

.

If we instead vary with respect to the *unconjugated* orbitals, we get

```
julia> diff(E, a)
1×1 SparseArrays.SparseMatrixCSC{LinearCombinationEquation,Int64} with 1 stored entry:
[1, 1] = ⟨1s₀α|ĥ + ⟨1s₀α|[1s₀β|1s₀β]
julia> diff(E, b)
1×1 SparseArrays.SparseMatrixCSC{LinearCombinationEquation,Int64} with 1 stored entry:
[1, 1] = ⟨1s₀β|ĥ + ⟨1s₀β|[1s₀α|1s₀α]
```

that is, we instead derived equations for the conjugated orbitals.