I need help with using a while loop

2 Ansichten (letzte 30 Tage)
Ikmal Rosli
Ikmal Rosli am 19 Apr. 2021
Kommentiert: Ikmal Rosli am 19 Apr. 2021
My problem I think is quite simple. But I just cannot get my brain around it.
I'm trying to use a while loop to iterate my code until m = 1.000e-5. But when I execute the code what I get is an infinite loop.
Here is the code:
c1 = 0.1;
v1 = 0.1;
v2 = 1;
p = 0;
m = 0;
while m ~= 1.000e-5
c1 = c1*v1/v2
m = c1*0.1
p = p+1
end

Akzeptierte Antwort

Paul Hoffrichter
Paul Hoffrichter am 19 Apr. 2021
Bearbeitet: Paul Hoffrichter am 19 Apr. 2021
Looks like you are trying to solve a difference equation. Take a look at what is happening:
c1 = 0.1;
v1 = 0.1;
v2 = 1;
p = 2;
m = 0;
while m ~= 1.000e-5
c1(p) = c1(p-1)*v1/v2; % ==> c1 = c1 * 0.1 since v1, v2 never change in loop
m(p-1) = c1(p)*0.1;
if p > 100 || m(p-1) < 1e-8
break;
end
p = p+1;
end
figure(1), plot(c1), title('c1'), xlim([1 15])
figure(2), plot(m), title('m'), xlim([1 15])
c1
m
Output:
c1 =
0.100000000000000 0.010000000000000 0.001000000000000 0.000100000000000 0.000010000000000 0.000001000000000 0.000000100000000 0.000000010000000
m =
1.0e-03 *
1.000000000000000 0.100000000000000 0.010000000000000 0.001000000000000 0.000100000000000 0.000010000000000 0.000001000000000
m is decreasing rapidly. Never compare real numbers for equality or inequality. Remove my if-break statement, and adjust your while-loop accordingly.

Weitere Antworten (1)

David Hill
David Hill am 19 Apr. 2021
c1 = 0.1;
v1 = 0.1;
v2 = 1;
p = 0;
m = 1;
while m > 1.000e-5%floating point errors, use >
c1 = c1*v1/v2
m = c1*0.1
p = p+1
end
  1 Kommentar
Ikmal Rosli
Ikmal Rosli am 19 Apr. 2021
Hello thank you. Is there a way to get around the floating point error. So that m is exactly equal to 1e-5

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Startup and Shutdown finden Sie in Help Center und File Exchange

Tags

Community Treasure Hunt

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

Start Hunting!

Translated by