Problem with fsolve when using to find a single variable
1 view (last 30 days)
Show older comments
Hello,
I need help with a problem I am trying to solve using fsolve. The code is as follows:
C=0.25; %Nitrogen Concentration after time t in at%
Co=0.5; %Initial Nitrogen Concentration in at%
D=1.6613e-08; %Diffusion Coefficient at 450C in cm^2/sec
x=0.003; %Penetration depth in cm
t0=1; %Initial guess for time in sec
fun=@(t) [Co*erfc(x/(2*(D*t)^0.5))-C];
time=fsolve(fun,t0)
I would think that this would be a fairly straight forward application of fsolve but I am unable to solve using Matlab. The answer is time equals about 600 seconds which I found using Excel.
Can someone please let me know what I am doing wrong?
Thank you very much,
Mike
0 Comments
Answers (2)
Walter Roberson
on 18 Feb 2013
The calculation is sensitive to round-off. If not enough guard digits are used, the solution of roughly 595.40673113197968463 is only one of at least 14 possible solutions, the other 13 of which are imaginary.
2 Comments
Walter Roberson
on 18 Feb 2013
Do you have the symbolic toolbox? If so consider using it to create the solution, possibly using a higher Digits setting than the default.
Matt J
on 18 Feb 2013
Edited: Matt J
on 18 Feb 2013
I find I get pretty good results if I make the change of variables
z=x/(2*(D*t)^0.5);
It also avoids possibly illegal non-differentiabilities from the square roots you're taking
fun=@(z) Co*erfc(z)-C;
z=fzero(fun,t0);
t=(x/2/z/sqrt(D))^2
2 Comments
Matt J
on 18 Feb 2013
In fact, you don't even have to solve iteraitvely. Just use ERFCINV,
z=erfcinv(C/Co);
t=(x/2/z/sqrt(D))^2
Walter Roberson
on 18 Feb 2013
Technically, Mike does not have a sqrt() call: make has a ^0.5 call, which MATLAB defines in terms of logs. On the other hand, sqrt() and ^0.5 both have problems with differentiation at 0.
See Also
Categories
Find more on Startup and Shutdown in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!