Interpolation over a regular grid has known problems.
Over the Chebyshev extreme grid, however, there no such problems in interpolating smooth functions, or even continuous functions although convergence can be slow. A Chebyshev interpolation will be near minimax (best possible with respect to the infinity norm) for a smooth function. With machine-precision input, a near machine-precision approximation is possible. With higher precision input, higher precision approximations are possible.
I was introduced to this approach here
and one can use adaptiveChebSeries to automatically determine the degree of the Chebyshev interpolation needed to approximate a function within a given error. For more, see
Trefethen, Approximation Theory and Approximation Practice and
Boyd, Solving Transcendental Equations.
There are two methods of implementation, barycentric interpolation (see Berrut & Trefethen (2004) for its advantages) and Chebyshev series.
Both methods are generally numerically better than an interpolation based on a power basis expansion. In this case, the difference is negligible.
ClearAll[rho, TP];
b = 1;
q = -1;
rat = 10^-30;
rho[r_, b_,
q_] := (2 b/(1 - q)) (1 - (b/r)^(1 - q))^(1/2) Hypergeometric2F1[1/2,
1 - 1/(q - 1), 3/2, 1 - (b/r)^(1 - q)];
TP[ρ_?NumericQ, b_?NumericQ, q_?NumericQ] :=
Block[{r}, With[{ρ0 = SetPrecision[ρ, 32]},
r /. FindRoot[rho[r, b, q] == ρ0, {r, 1001/1000},
WorkingPrecision -> 32] // Re]];
(* Chebyshev nodes and points *)
deg = 24;
chebnodes = N[Rescale[Sin[Pi/2 Range[-deg, deg, 2]/deg]], 32];
TPtab = Table[{ρ, TP[ρ, b, q]}, {ρ, chebnodes}];
(* Barycentric interpolation *)
rif = Statistics`Library`BarycentricInterpolation[N@TPtab[[All, 1]],
N@TPtab[[All, 2]],
"Weights" ->
ReplacePart[
Table[(-1)^k, {k, 0, Length@TPtab - 1}], {1 -> 1/2, -1 -> 1/2}]];
Plot[rho[rif[ρ], b, q] - ρ // RealExponent, {ρ, 0, 1}]

(* Power basis interpolation *)
(* To diminish round-off error, increase precision *)
TPint = SetPrecision[InterpolatingPolynomial[TPtab, ρ], 50] // Expand // N
Plot[rho[N@TPint, b, q] - ρ // RealExponent, {ρ, 0, 1}]

(* Chebyshev series coefficients via FFT/DCT *)
cc = Sqrt[2/(Length@TPtab - 1)] FourierDCT[Reverse@TPtab[[All, 2]], 1];
cc[[{1, -1}]] /= 2;
rCS[ρ_] := cc.Cos[Range[0, Length@cc - 1] ArcCos[2 ρ - 1]];
Plot[rho[rCS[ρ], b, q] - ρ // RealExponent, {ρ, 0, 1}]

InterpolatingPolynomial. – Carl Woll Nov 09 '18 at 00:40