Problem with solve and icdf

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)

 Accepted 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.

2 Comments

thanks a lot. That works fine.
As always, my pleasure.

Sign in to comment.

More Answers (0)

Categories

Find more on Mathematics and Optimization in Help Center and File Exchange

Products

Release

R2018a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!