A functional is a function of functions. It is necessary to treat $x$, $y$, and $y_x$ as independent (as though they are held constant during partial differentiation.
An (Imperfect but Colorful) Analogy
Using the calculus of variations is like this: you want to travel to Phoenix, AZ but you don't yet know the cheapest and fastest way to get there. So - you imagine a nearly exhaustive list of ways to travel there (including things like walking, giant trebuchets, teleportation, etc.) and work out the costs and time required to each mode of transportation. Once you evaluate all the modes (consider each mode as a different function of cost and time) - you pick the mode (function) that is optimal for cost and time.
In a picture, imagine all the functions that connect the two points "A" and "B". We are searching for the function that minimizes the path between "A" and "B" subject to whatever constraints we place on the path. The calculus of variations is a formal mathematical strategy for FINDING that function from all possible functions.
If calculus describes how numbers behave when mapped through functions, then the calculus of variations describe how functions behave when mapped through functions-of-functions.
Using the mean value theorem you can derive a formula for arc-length that reads:
$$ L(x,y,y_x) = \int_a^b \sqrt{1+ \left( \frac{dy}{dx} \right)^2} dx $$You can integrate this expression between two points $a$ and $b$ on a function $y(x)$ to get the length of the line between $a$ and $b$. In the CoV we call $F$ a functional. A functional is a function of functions.
The utility of the CoV is to produce a differential equation that is subsequently solved to produce a function that makes $F$ an extreme value. In this case we are searching for the function $y(x)$ that minimizes $F$ betwen two points. The CoV tells us that the following equation must be true for $y(x)$ to make $F$ an extreme value:
This expression (for one dependent and one independent variable) is the core of the CoV. IT is not the only result that can be developed, but for us this is the important one. We can start by writing the above equation "by hand".
We'll start with the usual imports:
In [ ]:
%matplotlib notebook
import sympy as sp
sp.init_printing()
f = sp.symbols('f', cls=sp.Function)
x, y = sp.symbols('x, y', real=True)
We define our functional. Note that the functional is only a function of the derivative of $y$ rather than $y$ alone.
In [ ]:
f = sp.sqrt(1+(y(x).diff(x))**2)
f
You may be tempted to do this:
In [ ]:
f.diff(y)-(f.diff(y(x).diff(x))).diff(x)
You wouldn't be wrong to do the above, however things can be made a bit easier. Let us look at each term in the ELE (Euler-Lagrange Equations):
In [ ]:
firstTerm = f.diff(y(x))
firstTerm
In [ ]:
secondTerm = f.diff(y(x).diff(x))
secondTerm
So - since the first term is zero we can use the fundamental theorem of the calculus to perform the first integral. We add a constant and solve for the derivative.
In [ ]:
sp.var('C1')
integratedFunctional = sp.Eq(secondTerm,C1)
integratedFunctional
In [ ]:
firstSolution = sp.solve(integratedFunctional, y(x).diff(x))
firstSolution
This clearly indicates that:
$$ \frac{dy}{dx} = C $$and from this point it should be clear that the function $y(x)$ and makes $F$ an extreme is:
$$ y = mx + b $$If you would like to have SymPy
finish the calculation, you can write:
In [ ]:
functionalExtremizer = sp.dsolve(sp.Eq(y(x).diff(x),firstSolution[0]), y(x))
functionalExtremizer
And that is a linear function. To the extent that this is a proof - you've proven that a straight line is the shortest distance between two points.
SymPy
has an euler_equation
function that we can try to use, too:
In [ ]:
L = sp.sqrt(1+(y(x).diff(x))**2)
differentialEquationFromELFunction = sp.euler_equations(L, y(x), x)
differentialEquationFromELFunction
A bit messy, but correct nonetheless.
Find the ELE for the functional, and if you can - solve for $y(x)$:
$$ v(y(x)) = \int_0^{\pi/2} (y_x^2 - y^2)dx $$The endpoint conditions are $y(0)=0$ and $y(\pi/2)=1$. For reference, the general solution is:
$$ y(x)=C_1 \sin(x) + C_2 \cos(x) $$Don't forget to check the end points of the domain to find the constants.
A classic problem in wetting and capillary science is that of the minimum soapfilm between two rings. The soap film adopts a shape that minimizes its area.
The area of a soap film (found by rotating a curve through $2\pi$ around one axis is given by:
$$ A = L(x,y,y_x) = \int_{x_1}^{x_2} 2 \pi y (1+y_x^2)^{1/2} dx $$Note there is no explicit x dependence.
In [ ]:
Lsoapfilm = y(x)*sp.sqrt(1+(y(x).diff(x))**2)
(sp.euler_equations(Lsoapfilm,y(x),x)[0].lhs).simplify()
Attacking the problem this way leads to a second order ODE that we need to integrate. Although this could be done - the lack of an explicit $x$ dependence permits using an identity that makes the problem a bit easier.
An equivalent statement of the ELE is:
$$ \frac{d}{dx} \left(F - y_x \frac{\partial F}{\partial y_x} \right) = \frac{\partial F}{\partial x} $$If there is no explicit $x$ dependence therefore the RHS of the above equation is zero - the first integral can be had for "free". Adding the integration constant we have:
$$ F - y_x \frac{\partial F}{\partial y_x} = C_2 $$We can therefore write:
In [ ]:
C2 = sp.symbols('C2', positive=True)
beltramiODE = sp.Eq(Lsoapfilm - y(x).diff(x)*Lsoapfilm.diff(y(x).diff(x)),C2)
beltramiODE.simplify()
Now we solve the differential equation using dsolve
.
In [ ]:
sp.dsolve(beltramiODE,y(x))
In [ ]:
# Find the constants if the curve is required to pass through a pair of particular points.
In [ ]:
# Create an interactive widget to explore the values of the constants.
Find the variational derivative of the following functional:
$$ F = W \phi^2 (1-\phi)^2 + \frac{1}{2} \epsilon^2 \left(\frac{d \phi}{dx} \right)^2 $$e.g. compute:
$$ \frac{\delta F}{\delta \phi} $$The ODE that results will be solved to find the function $\phi(x)$. $W$ and $\epsilon$ are parameters of the functional.
In [ ]: