Article 58MFP Solving for the catenary scale parameter

Solving for the catenary scale parameter

by
John
from John D. Cook on (#58MFP)

A catenary with scale a is the graph of the function

f(x; a) = a cosh(x/a) - a.

The x and the a are separated by a semicolon rather than a comma to imply that we think of x as the variable and a as a parameter.

This graph passes through the origin, i.e. for any a, f(0, a) = 0. To find the scaling parameter a we need to specify the value of f at one more point and solve f(x, a) = y. This is the equation I alluded to recently as not having a closed-form solution.

Without loss of generality, we can assume x = 1. Why is that?

Define

g(a) = f(1; a).

Then

f(x; a) = y

if and only if

g(a/x) = y/x.

So will assume x = 1 for now and focus on solving for a value of a such that g(a) = y. But we will include Python code shortly that goes back to f, i.e. does not assume x = 1.

The Taylor series for g looks like

g(a) = 1 / 2a + 1 / 24a^3 + ...

and so for large a,

g(a) 1 / 2a.

Here are a couple plots showing how good this approximation is, even for a not that large. First, a plot of g and its approximation.

solvecat1.png

And here's a plot of the relative error in approximating g(a) by 1/2a.

solvecat2.png

This means that for small y,

g(1 / 2y) y.

It's fortunate that we have a convenient approximation when y is small, because in practice y is usually small: catenaries are usually wider than deep, or at least not much deeper than wide.

Since the terms in the Taylor series that we discarded are all positive, we also have a bound

g(1 / 2y) > y.

If we want to solve for a numerically, 1 / 2y makes a good starting guess, and it also makes a left bracket for root-finding methods that require a bracket around the root.

Here's Python code to solve f(x, a) = y for a, given x and y.

 from numpy import cosh from scipy.optimize import root def g(a): return a*cosh(1/a) - a def solve_g(y): assert(y > 0) lower = 0.5/y return root(lambda a: g(a) - y, lower).x def solve_catenary(x, y): "Solve for a such that a cosh(x/a) - a == y." return x*solve_g(y/abs(x))

Now that we can solve g(a) = y numerically, we can go back and see how far 1 / 2y is from the actual solution for varying values of y.

solvecat3.png

Recall that the second plot above showed that the relative error in approximating g(a) by 1 / 2a is large when a is small (and thus y is big). But the plot immediately above shows that nevertheless, 1/ 2y is a good guess at a solution to g(a) = y, never off by more than 0.175.

Recall also that we said 1 / 2y is a lower bound on the solution, and could be used as a left bracket in a root-finding method that requires a bracket. The plot above suggests that 0.18 + 1 / 2y would work as a right bracket

More catenary posts

The post Solving for the catenary scale parameter first appeared on John D. Cook.

Yu0EvpGRBHY
External Content
Source RSS or Atom Feed
Feed Location http://feeds.feedburner.com/TheEndeavour?format=xml
Feed Title John D. Cook
Feed Link https://www.johndcook.com/blog
Reply 0 comments