This equation is monotonically decreasing and generally behaves very well.
I repeat the process hundreds of times inside of multiple calls to ode45, and some testing with Profiler suggests that this is *the* most time consuming part of the entire code.
I tested four different root solving options, and they are listed below from most time (1) to least time (4). All for methods found the same solution. The solver (fzero or fminbnd) was called roughly 1100 times in each case. The total time of each program and the number of calls to the function [variants of @(f) (LHS - RHS)] are also listed below.
(1) f = fzero(@(f) (LHS - RHS), 0.01); Time = 1.444 s Calls = 25986
(3) f = fminbnd(@(f) abs(LHS - RHS), 0.0001, 0.1); Time = 1.402 s Calls = 15319
(2) f = fminbnd(@(f) (LHS - RHS)^2, 0.0001, 0.1); Time = 1.203 s Calls = 14156
(4) f = fzero(@(f) (LHS - RHS), [0.0001, 0.1]); Time = 1.048 s Calls = 13811
It seems that fzero has less overhead iff it is given a bounding interval, and you can't use fminbnd without a bounding interval anyways. I can't particularly talk to the robustness of the two different tools, but for simple root solving I recommend fzero with a bounding interval.