numeric solve issue for an equation involving a logarithm
Mostrar comentarios más antiguos
I am trying to solve an equation involving a common logorithm within a loop. I first solve an equation to get r(i). then I take that r(i) value and plug it into an equation to solve for b(i).The second equation is:
b(i)=solve('r(i)=.5*Log10(b(i)) + .5*b(i)')
It is having a lot of trouble solving this. This is the error message:
Warning: Could not find an exact (case-sensitive) match for 'Log10'.
/Applications/MATLAB_R2009aSV.app/toolbox/matlab/elfun/log10.m is a
case-insensitive match and will be used instead.
You can improve the performance of your code by using exact
name matches and we therefore recommend that you update your
usage accordingly. Alternatively, you can disable this warning using
warning('off','MATLAB:dispatcher:InexactCaseMatch').
This warning will become an error in future releases.
> In testloopwithgraph at 6
??? Error using ==> mupadengine.mupadengine>mupadengine.feval at 162
Error: no indeterminate(s) [numeric::solve]
Error in ==> solve>mupadSolve at 232
list = feval(symengine,'mlfsolve',eqns,vars);
Error in ==> solve at 93
[R,symvars,order] = mupadSolve(eqns,vars);
Error in ==> testloopwithgraph at 7
b(i)=solve('r(i)=.5*Log10(b(i)) + .5*b(i)');
I can numericaly solve this equation in mathematica with just a warning about how the output might not cover all values, but it does give me values. In my matlab code it won't give me values at all. Is there a way around this?
4 comentarios
Azzi Abdelmalek
el 21 de Sept. de 2012
what is b(i)?
Mac Sampson
el 21 de Sept. de 2012
Editada: Matt Tearle
el 21 de Sept. de 2012
Azzi Abdelmalek
el 21 de Sept. de 2012
(2:1:((n/2)-2)/1) % why /1 ?
Mac Sampson
el 21 de Sept. de 2012
Respuestas (4)
Azzi Abdelmalek
el 21 de Sept. de 2012
Editada: Azzi Abdelmalek
el 21 de Sept. de 2012
use
log10
not
Log10
6 comentarios
Mac Sampson
el 21 de Sept. de 2012
Walter Roberson
el 21 de Sept. de 2012
() is used for function calls in MuPAD. Use [] for indexing. Or better yet, use simple variables since you aren't importing any value from the workspace.
b(i) = solve('r=1/2*log10(b)+1/2*b','b');
Remember, when you use a string argument to solve(), values are not imported from the MATLAB workpace! If you want to import the value of r(i) then don't use a string argument to solve:
syms B
[...]
r(i) = [...]
b(i) = solve(r(i) = 1/2*log10(B)+1/2*B, B);
Azzi Abdelmalek
el 21 de Sept. de 2012
Editada: Azzi Abdelmalek
el 21 de Sept. de 2012
p=1;
n=1;
t=1;
n=10
for i=(2:1:((n/2)-2)/1);
r(i)=.5*log10((2*p)^((1 - 2*(i - 2))/(n - 4))*(t/2)^((2*(i - 2))/(n - 4)))+(i - 2)*(((n - 4)*p-2*p-.5*t)/(n - 4));
b(i)=solve(['-' num2str(r(i)) '+.5*log10(b) + .5*b'],'b');
end
Mac Sampson
el 21 de Sept. de 2012
Editada: Walter Roberson
el 22 de Sept. de 2012
Azzi Abdelmalek
el 21 de Sept. de 2012
Editada: Azzi Abdelmalek
el 21 de Sept. de 2012
do you want to use symbolic toolbox. In your case, implicit solution could'nt be found, unless you use just
syms b
%with r known
syms b
sol=solve(-r(1)+0.5*log10(b)+0.5*b,b)
Mac Sampson
el 21 de Sept. de 2012
Matt Tearle
el 21 de Sept. de 2012
If I understand your intent correctly, you're trying to solve the equation
r_i = (Log10(b) + b)/2
for b, given a (numeric?) value of r_i. Then you want to store that b value as b_i. (Repeat for i+1)
If so, then (1) you don't need to do this symbolically and (2) you are getting the error because solve can't figure out what the variable is.
I'd suggest using fzero:
for i = 2:n
% get r(i)
% solve for b(i) using b(i-1) as an initial guess
b(i) = fzero(@(b) (log10(b) + b)/2 - r(i),b(i-1));
end
4 comentarios
Mac Sampson
el 21 de Sept. de 2012
Matt Tearle
el 21 de Sept. de 2012
Yes, assuming you want to use the previous value for b as your initial guess. What errors do you get? It's entirely possible that fzero is failing to find the root.
Mac Sampson
el 21 de Sept. de 2012
Matt Tearle
el 21 de Sept. de 2012
Yes, I understand that, but fzero is a numerical solver, so it requires an initial guess for the solution. When doing stuff like this in a loop, it's not uncommon to use the previous solution as the starting point for the next solution. If r(i) varies somewhat slowly and smoothly with i, that would make sense. But it looks like maybe that's not the case here.
So, see my new answer...
Matt Tearle
el 21 de Sept. de 2012
Editada: Matt Tearle
el 21 de Sept. de 2012
Didn't see your comment with your code. This works:
imax = (n/2)-2;
r = zeros(imax,1);
syms b
for i = 2:imax;
r(i)=.5*log10((2*p)^((1 - 2*(i - 2))/(n - 4))*(t/2)^((2*(i - 2))/(n - 4)))+(i - 2)*(((n - 4)*p-2*p-.5*t)/(n - 4));
bsolve(i)=solve((log10(b) + b)/2 == r(i),b);
end
bnum = double(bsolve);
8 comentarios
Mac Sampson
el 21 de Sept. de 2012
Editada: Mac Sampson
el 21 de Sept. de 2012
Walter Roberson
el 21 de Sept. de 2012
Either update your MATLAB version to R2012a or later, or use
bsolve(i)=solve((.5*log10(b) + b)/2 - r(i),b);
Mac Sampson
el 21 de Sept. de 2012
Walter Roberson
el 21 de Sept. de 2012
By solving the general case in advance, you can avoid having to do the solve() each time. The general solution is
b(i) = (1/2)*10000^r(i)*exp(-4*r(i)*ln(10))*lambertw(2*ln(10)*exp(4*r(i)*ln(10)))/ln(10)
However, lambertw() is defined only by the Symbolic Math toolbox, which gives a fair bit of overhead if you need to do this many times. For MATLAB code for a numeric version of the principle branch of lambertw(), see http://www.mathworks.com/matlabcentral/newsreader/view_thread/32527
Mac Sampson
el 22 de Sept. de 2012
Walter Roberson
el 22 de Sept. de 2012
I'm not sure what you mean about inverting the function? Do you mean that given a particular b value, you want to find the r value ?
Mac Sampson
el 22 de Sept. de 2012
Walter Roberson
el 22 de Sept. de 2012
b(i) in terms of r(i) is the formula I show above, involving LambertW .
I tested in Maple and the results appear to be correct. However, in cases where r(i) is complex, there can be multiple solutions.
Mac Sampson
el 22 de Sept. de 2012
0 votos
1 comentario
Walter Roberson
el 22 de Sept. de 2012
Vote early, vote often!
Categorías
Más información sobre Numeric Solvers en Centro de ayuda y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!