I deleted most of my earlier answer after reading the paper, and deleted or folded earlier comments into this answer.
The authors point out that the problem isn't a Cauchy initial value problem (IVP), but a boundary value problem (BVP), so they're using a shooting method. For flat space, they keep the phi'[0] boundary condition, but replace the phi[infinity] = fv condition (which makes the original problem a BVP instead of an IVP) with phi[0] = a, 'a' being a parameter to be varied. You now have a Cauchy IVP.
Due to the singularity at the origin, they need to shift their initial values over to xmin, which they do via a Taylor expansion. This gives you a new set of IVP's at xmin. You can now solve the resulting problem as a function of parameter 'a', then vary 'a' to match the condition at phi[infinity] = fv to desired precision.
For the curved space case, they follow a similar approach, but also shift the r variable over to xmin using a similar Taylor expansion, which they don't show the derivation for, just the result. This is how they get r[xmin] = xmin, etc. So their "shooting method" is partially implicit in the derivation they performed, except for the dependence on a parameter 'a'. I.e. they've restructured the BVP as a new IVP, and shifted the IVP equations over to xmin instead of 0 to avoid the singularity.
One thing that perhaps wasn't stressed enough was that this shift to xmin needs to be applied to both the boundary and initial value conditions. Three of the four are the same - only the condition on phi at infinity is swapped out to convert from a BVP to an IVP. The shooting method will attempt to test its intermediate results against the supplied boundary conditions, and if they remain singular, the process won't converge.
Once these steps are performed, you now have a Cauchy problem which can be solved using the equations and the initial values they derived at xmin, using ParametricNDSolve without any shooting method selected, and parameterized by 'a'. The result can be passed to FindRoot with an initial guess for 'a', and solved to match the boundary condition at "infinity" for phi, i.e. match to fv.
You could also try using the shooting method option for NDSolve instead, using the shifted initial and boundary conditions. The shooting tutorial mentions that FindRoot is used internally to seek convergence. There is an advantage to using ParametricNDSolve/FindRoot separately however; if you run into problems, it's easier to see what's going wrong. As long as ParametricNDSolve runs successfully, it's possible to use Plot/Table/etc. to obtain information about what your solution looks like even if FindRoot fails, as will be seen below.
After running an earlier version of this code, it was found that no solution was possible with the specified parameters. After further discussion/investigation with the OP, we found that the variable 'eps' was being used in two different ways. It controls the shape of the potential function the OP uses, but the authors of the referenced appendix in the link use it as the ratio of the scalar field mass to the Planck mass. I've changed the name of this parameter to massRatio in the code below.
It also became apparent that it would be useful to be able to try out different equations for the potential function. To simply this process, and avoid having to re-code equations by hand, I modified the earlier code to allow defining potential functions externally and passing them into the body of the solver. The necessary derivatives are computed internally and used to generate the appropriate equations for each potential.
This is the original potential function:
u["baseline"][eps_][phi_[x_]] :=
1/8 (phi[x]^2 - 1)^2 + eps/2 (phi[x] - 1);
The [phi[x]] term at the end allow various derivatives to be performed. The [eps_] is for the constant parameter used in the equation; additional parameters may be added here if needed. The u["baseline"] is a way to label trial potentials. Any short descriptive string can serve as a label. It's also possible to omit the label and just use u0, u1, etc.
Here's the main function:
solve[phi_, r_, x_, xmin_, xmax_, a_, a0_, fv_, mrat_, u_] :=
Module[{dua, eq},
(* Compute the derivative of the potential wrt phi evaluated at \
phi=a *)
dua = D[u, phi[x]] /. phi[x] -> a;
eq["phi"] = phi''[x] + 3 r'[x]/r[x] phi'[x] - D[u, phi[x]] == 0;
eq["r"] = r''[x] + 8 Pi/3 mrat^2 r[x] (phi'[x]^2 + u) == 0;
eq["ic"] = {phi[xmin] == a + 1/8 dua xmin^2,
phi'[xmin] == 1/4 dua xmin, r[xmin] == xmin, r'[xmin] == 1};
ParametricNDSolve[
Flatten[{eq["phi"], eq["r"], eq["ic"]}], {phi, r}, {x, xmin,
xmax}, {a}]
];
Call it with
{xmin,xmax,a0,fv,mrat,eps} = {.01,12,-1.05,.93,.25,.11};
pnds = solve[phi, r, x, xmin, xmax, a, a0,fv,mrat,
u["baseline"][eps][phi[x]]]
Then solve for the optimal 'a' value:
a = (a /. FindRoot[phi[a][xmax] == fv /. pnds, {a, a0}])
and plot the result (I scaled r down to better fit both curves on the plot and added the Epilog to the plot at 'fv' to serve as a reference marker.):
Plot[Evaluate[{phi[a][x], r[a][x]/10} /. pnds], {x, xmin, xmax},
PlotLegends -> {"phi[x]", "r[x]/10"},Epilog -> Line[{{0,.93},{xmax,.93}}]]
There was also a request for a way to run this code with Manipulate for various inputs. In order to get acceptable output whether FindRoot converges or not, I wrapped the call with Enclose/ConfirmQuiet, which will throw a Failure box to the surrounding enclose if messages are generated.
Manipulate[
Module[{pnds, phi, r, x, a},
pnds = solve[phi, r, x, xmin, xmax, a, a0, fv, mrat,
u["baseline"][eps][phi[x]]];
{Plot[Evaluate[{phi[a0][x], r[a0][x]/10} /. pnds], {x, xmin, xmax},
PlotLegends -> {"phi[x]", "r[x]/10"},
Epilog -> Line[{{0, fv}, {xmax, fv}}]],
Enclose[ConfirmQuiet[
a = (a /. FindRoot[
phi[a][xmax] == fv /. pnds, {a, a0}])]]}], {{xmin, .01}, .01,
1}, {{xmax, 12}, 1, 31}, {{a0, -1.05}, -1.1, 0}, {{fv, 0.93},
0.093, .93},
{{eps, .11}, -.2, .2},
{{mrat, .25}, .0001, 1.}]
Here's a sample output:
[![enter image description here][1]][1]
It's also possible to verify that the function does in fact give valid solutions. Write the equations/boundary/initial conditions as lhs == 0, choose a value for the parameter a, generate interpolating functions, and plug these into the lhs of each equation. The equations should give zero for all x in the range, and the initial/boundary conditions at their endpoints. Here's code to test the result:
Manipulate[
Module[{pnds, phi, r, x, a, eq1, eq2, ic, ifn, subst, sol},
pnds =
solve[phi, r, x, xmin, xmax, a, a0, fv, mrat,
u["baseline"][eps][phi[x]]];
eq1 = phi''[
x] + (3 r'[x]/r[x]) phi'[x] - (1/2) phi[x] (phi[x]^2 - 1) - eps/2;
eq2 = r''[
x] + (8 Pi/3) eps^2 r[
x] (phi'[x]^2 + (1/8) (phi[x]^2 - 1)^2 + (eps/2) (phi[x] - 1));
ic = {phi[xmin] - (a + (1/8) ((1/2) a (a^2 - 1) + eps/2) xmin^2),
phi'[xmin] - ((1/4) ((1/2) a (a^2 - 1) + eps/2) xmin),
r[xmin] - xmin, r'[xmin] - 1,
{phi[xmax] - fv}};
ifn = {phi[a0], r[a0]} /. pnds;
subst = Thread[{phi, r} -> ifn];
sol = {{eq1, eq2}, ic} /. a -> a0 /. subst;
Column[{Plot[sol[[1, 1]], {x, xmin, xmax}],
Plot[sol[[1, 2]], {x, xmin, xmax}], sol[[2]]}]
]
, {{xmin, .01}, .01, 1}, {{xmax, 12}, 1, 31}, {{a0, -1.05}, -1.1,
0}, {{fv, 0.93}, 0.093, .93},
{{eps, .11}, -.2, .2},
{{mrat, .25}, .0001, 1.}]
I'm seeing numerical round off errors on the order of 5x10^-6 overall, so the solutions appear valid.