here, In my code, the statement to be executed after checking if abs(r1)==abs(v(i)) is not being executed. Why is that so? It is showing that Bm2 is an unrecognised variable, but clearly Bm2 will have a value if the if statement is executed.
r1 = round(r,1);
for i=1:length(v)
y2(i) = abs(p1* abs(v(i)*100)^4 + p2* abs(v(i)*100)^3 + p3*abs(v(i)*100)^2 + p4*abs(v(i)*100) + p5)/fd1;
B(i) = y2(i) * fd1;
end
for i=1:length(v)
if abs(r1) == abs((v(i)))
Bm2 = B(i) *10 ^-6;
else
end
end
for i=1:numel(u)
if u(i)==0
Bx(i)= Bm2;
else
y3(i) = abs((p11* abs(u(i))^3 + p12*abs(u(i))^2 + p13*abs(u(i)) + p14)/fd2) ;
Bx(i) = y3(i) * Bm2;
end
end
figure(2);
plot(u,Bx);

 Respuesta aceptada

Fangjun Jiang
Fangjun Jiang el 19 de Feb. de 2020
Editada: Fangjun Jiang el 19 de Feb. de 2020

0 votos

Most likely a "floating point data equal comparison" issue. see (1/3)==(1-2/3). They are not equal if you run it in MATLAB.

3 comentarios

GEON G BASTIAN
GEON G BASTIAN el 19 de Feb. de 2020
Thank you for your answer. How can this issue be solved?
because code is logically correct i guess. Just that the if statement is not being executed.
Fangjun Jiang
Fangjun Jiang el 19 de Feb. de 2020
The if statement is being executed but your code is not robust. Change to
if (abs(r1)-abs(v(i)))<=eps
Steven Lord
Steven Lord el 19 de Feb. de 2020
It could be a floating-point issue, or it could be that r is a non-scalar and not all elements of r are equal to any of the v(i)'s.
If it's a floating-point issue, comparing with a tolerance is the usual approach. Using ismembertol instead of the loop and the equality testing is another option.
x = 0:0.1:1;
y = 0.3;
y == x(4) % false
abs(y-x(4)) < eps % true
ismembertol(y, x, eps) % true
If a vector issue, calling any is a potential solution.
if x == 0.5
disp('Yes')
else
disp('No')
end
if any(x == 0.5)
disp('Yes')
else
disp('No')
end

Iniciar sesión para comentar.

Más respuestas (1)

David Hill
David Hill el 19 de Feb. de 2020

0 votos

You are overriding Bm2 unless there is only one case where abs(v)==abs(r1). You should be able to execute without loops. If you are having floating point issues, just add a tolerance.
r1 = round(r,1);
y2 = abs([p1,p2,p3,p4,p5]*abs((repmat(v,5,1)*100).^((4:-1:0)')))/fd1;
B = y2 * fd1;
Bm2 = B(abs(v)==abs(r1)) *10 ^-6;%is there only one case where v==r1? otherwise Bm2 will not be scalar
Bx(u==0)= Bm2;%Bm2 assumed to be scalar. Is Bx preallocated (Bx=zeros(1,length(u)))?
y3 = abs([p11,p12,p13,p14]*abs(repmat(u(u~=0),4,1).^((3:-1:0)')))/fd2);
Bx(u~=0) = y3 * Bm2;%Bm2 assume to be scalar
figure(2);
plot(u,Bx);

Categorías

Productos

Versión

R2019b

Etiquetas

Preguntada:

el 19 de Feb. de 2020

Respondida:

el 19 de Feb. de 2020

Community Treasure Hunt

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

Start Hunting!

Translated by