Instead of using fprintf I want to store all the i, xe, and f(xe) into a vector instead. That way I can call them later. Also I had another problem where I wanted to use another 'i' later on in the code. But it only allowed me to use 1. How can you use two different 'i's. So they don't get mixed up.
f = @(x) x^2-6;
xl = 0;
xu = 10;
xe = (xu+xl)/(2);
acc = 0.00001;
while abs(f(xe))> acc
i = i + 1;
fprintf('%d)\t%f\tf(x)=%f\n',i,xe,f(xe));
if (f(xe)*f(xl)) < 0
xu = xe;
else
xl = xe;
end
xe = (xu+xl)/2;
end

 Respuesta aceptada

per isakson
per isakson el 13 de Feb. de 2016
Editada: per isakson el 13 de Feb. de 2016
Add
M = zeros( 0, 2 );
before the loop and replace
fprintf('%d)\t%f\tf(x)=%f\n',i,xe,f(xe));
by
M( end+1, 1:2 ) = [ xe, f(xe) ];
You'll get a warning about "Growing ..." , but if speed is acceptable ignore it.
&nbsp
"fprintf into a stored variable" &nbsp If understood literally, replace
fprintf('%d)\t%f\tf(x)=%f\n',i,xe,f(xe));
by
C{end+1,1} = sprintf('%d)\t%f\tf(x)=%f\n',i,xe,f(xe));
and add C=cell(0,1) before the loop

10 comentarios

WhatIsMatlab-
WhatIsMatlab- el 13 de Feb. de 2016
Thank you for the reply. I will try this and see what happens.
Guillaume
Guillaume el 13 de Feb. de 2016
Editada: Guillaume el 13 de Feb. de 2016
if speed is acceptable ignore it.
Speed will decrease the longer the loop goes on (more and more elements need to be copied to a new memory location). If the loop converges fast enough, then indeed speed should not be an issue.
To stop the warning from appearing altogether:
M( end+1, 1:2 ) = [ xe, f(xe) ]; %#ok<AGROW>
per isakson
per isakson el 13 de Feb. de 2016
Editada: per isakson el 13 de Feb. de 2016
Welcome point.
On the FEX there is a solution and good discussion on the problem of pre-allocation when the final size is not known: Incremental growth of an array, revisited, by John D'Errico
How do I stop it from using the same 'i' for each while loop? I want it to start counting from zero for the second while loop
First While Loop
s = zeros( 0 );
while abs(f(xe))> acc
i = i + 1;
s( end+1, 1:1 ) = [xe];
if (f(xe)*f(xl)) < 0
xu = xe;
else
xl = xe;
end
xe = (xu+xl)/2;
end
Second While Loop
m = zeros( 0 );
while abs(ff(xxe))> aacc
i = i + 1;
m( end+1, 1:1 ) = [xxe];
if (ff(xxe)*ff(xxl)) < 0
xxu = xxe;
else
xxl = xxe;
end
xxe = xxu - ((ff(xxu)*(xxl-xxu))/(ff(xxl)-ff(xxu)));
end
per isakson
per isakson el 14 de Feb. de 2016
Editada: per isakson el 14 de Feb. de 2016
  • "How do I stop it from using the same 'i' for each while loop" &nbsp Do you mean the same i in the first and second while loop? In the code you show i is incremented but not used.
  • Did you inspect the values of m and s after running the code? These values are they not the ones you expect?
WhatIsMatlab-
WhatIsMatlab- el 14 de Feb. de 2016
Editada: WhatIsMatlab- el 14 de Feb. de 2016
I was just trying to use the 'i' to count my iterations if there is a better way of achieving this maybe you can help me.
  • I was using the 'i' to count my iterations for the problem. I may be doing that incorrectly. Yes, I was referring to the 'i' in the first and second while loop.
  • They are the values I expect but the iterations are incorrect because the second while loop is starting from the last 'i' value of the first loop.
Thanks
Guillaume
Guillaume el 14 de Feb. de 2016
Well, set i to 0 before the 2nd loop, or use a different variable.
WhatIsMatlab-
WhatIsMatlab- el 14 de Feb. de 2016
Setting 'i=0' before the loops worked. I tried changing the variable but I got an error. Thank you for taking the time to figure this problem out with me.
per isakson
per isakson el 15 de Feb. de 2016
  • "but I got an error" &nbsp we cannot help if you don't show what you did and what error Matlab reported.
  • "a better way of achieving this" &nbsp length(s) and length(m) tell the number of iterations in the two loops.
per isakson
per isakson el 15 de Feb. de 2016
This example illustrates
  • two ways to count the number of loop iterations
  • two ways to store result in the loop
N = 1e6;
M1 = zeros( 0 );
ii = 0;
M2 = nan( N, 1 ); % Pre-allocate
while sqrt(ii) < sqrt(N) - 10
ii = ii + 1;
M1( end+1, 1 ) = ii;
M2(ii) = ii;
end
M2(isnan(M2)) = [];
disp( all( M2 == M1 ) )
disp( ii )
disp( length(M1) )
disp( length(M2) )
outputs
1
980100
980100
980100
where "1" shows that M1 and M2 are identical.
[Run and Time], i.e. the profiler, shows that "M1" is slower.

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Loops and Conditional Statements en Centro de ayuda y File Exchange.

Productos

Preguntada:

el 12 de Feb. de 2016

Comentada:

el 15 de Feb. de 2016

Community Treasure Hunt

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

Start Hunting!

Translated by