As the ODEs posted by the OP are maybe too trivial for this, I took the liberty and changed them to a really coupled system (taken straight from the Help) in order to highlight the procedure.
The idea of the "shooting method" I mentioned in the comments is to try to find the initial condition for the 2nd variable, in this example $y(t)$, such that the requested terminal condition is satisfied.
So, let's assume the following system with initial conditions at $t_i=0$ $x(t_i)=1$ and $y(t_i)=y_0$, while the terminal condition at $t_f=20$ is $y(t_f)=0.15$. Then we set up the solution with NDSolve
as a free parameter for $y_0$ as:
ti = 0;
tf = 20;
yf = 0.15;
sol[y0_?NumericQ] := NDSolve[{x'[t] == -y[t] - x[t]^2, y'[t] == 2 x[t] - y[t]^3, x[ti] == 1, y[ti] == y0}, {x, y}, {t, ti, tf}]
Let us now define the value of $y(t)$ at $t_f$ as a function of the initial condition $y_0$ and use FindRoot
to solve for $y_0$:
Yf[y0_?NumericQ] := y[t] /. sol[y0][[1]] /. t -> tf
ic = FindRoot[Yf[y0] == yf, {y0, -1, -0.9}, MaxIterations -> 1000]
(* {y0 -> -0.612372} *)
Indeed this confirms that the value gives the proper "terminal condition":
Yf[ic[[1, 2]]]
(* 0.15 *)
Also, plotting the solution proves the same (the red point is the "terminal condition"):
soly0 = sol[ic[[1, 2]]][[1]];
ParametricPlot[{x[t], y[t]} /. soly0, {t, ti, tf}, Frame -> True, FrameLabel -> {"x(t)", "y(t)"}, FrameStyle -> Black,Epilog -> {Red, Point[{x[t], y[t]} /. soly0 /. t -> tf]},PlotRange -> {{-1.1, 1.1}, {-1.1, 1.1}}, PlotStyle -> Black]
However, caution is needed as many times there may be more than one initial conditions that give the same terminal condition as shown by the plot of $y_f$ vs $y_0$, as the function $y_f(y_0)$ in general may not be monotonic (as in this example):
Intuitively, this is due to the fact that more than one trajectories may pass from the same point, i.e. the terminal condition, for different initial conditions.
H[x]
! $\endgroup$