MATLAB: Problem with solve and icdf

erroricdfMATLABsolve

Hi, I need to solve equations of the type b = @(x,s) solve(bb==x-s*icdf('Normal',bb,0,1),bb)
and after the function call
>> b(0.2,0.4)
I get this error. Can anyone help me?
Best,
Christian
Error using symengine Unable to prove 'bb < 0 | 1 < bb' literally. Use 'isAlways' to test the statement mathematically.
Error in sym/subsindex (line 821) X = find(mupadmex('symobj::logical',A.s,9)) – 1;
Error in sym/privsubsasgn (line 1096) L_tilde2 = builtin('subsasgn',L_tilde,struct('type','()','subs',{varargin}),R_tilde);
Error in sym/subsasgn (line 933) C = privsubsasgn(L,R,inds{:});
Error in norminv (line 57) p(p < 0 | 1 < p) = NaN;
Error in icdf (line 91) x = norminv(p,a,b);
Error in @(x,s)solve(bb==x-s*icdf('Normal',bb,0,1),bb)

Best Answer

It is probably best to avoid the Symbolic Math Toolbox for such problems.
Try this:
b = @(x,s,bb) x-s*icdf('Normal',bb,0,1)-bb;
B = fsolve(@(bb)b(x,s,bb), 0.01)
You may need a different initial parameter estimate (I used 0.01 here), depending on what ‘x’ and ‘s’ are. This uses the Optimization Toolbox fsolve (link) function. It is more robust than fzero.