Define
g[t_?NumericQ] := BSplineFunction[pts][t][[1]]
Then,
Minimize[(g[t] - 2.1875)^2, t]
(* {0., {t -> 0.25}} *)
which is the desired result. (NMinimize[(g[t] - 2.1875)^2, t]
and FindMinimum[{(g[t] - 2.1875)^2, 0 <= t <= 1}, t] // Chop
also give the desired result.)
Why this works while
FindMinimum[(f[t][[1]] - 2.1875)^2, t]
(* {0., {t -> 2.1875}} *)
does not can be seen from the FindMinimum
documentation (Details and Options section):
FindMinimum first localizes the values of all variables, then evaluates f with the variables being symbolic, and then repeatedly evaluates the result numerically.
In other words, FindMinimum
first converts (f[t][[1]] - 2.1875)^2
to (t - 2.1875)^2
and then minimizes the latter expression. The function g
prevents this from happening by blocking symbolic evaluation.
Incidentally, Plot
does not first do symbolic evaluation and so does not create this problem. Forcing it to perform symbolic evaluation first yields a curve different from that in the question.
Plot[Evaluate[(f[t][[1]] - 2.1875)^2], {t, 0, 3}]

which does have a minimum at t == 2.1875
, as expected.
BSplineFunction[]
does not do well when all you need is one component for optimization or root-finding. If need be, you can reconstruct the expression in terms ofBSplineBasis[]
, as was done here. $\endgroup$f[t][[1]]
evaluates tot
, so theFindMinimum
expression in the question really isFindMinimum[(t - 2.1875)^2, t]
, which is satisfied by{0., {t -> 2.1875}}
. $\endgroup$