matlab不会评估病情

时间:2016-05-09 18:57:25

标签: matlab conditional-statements

以下是代码:

  clear;
channel = ddeinit('view','tagname');
temperature = ddereq(channel,'temperature');
poistka = 0;
time = 0;
kvas = 0;
ohrev= 1;

steam=300;
pressure=100;
steam2= 50;
tempom = 1;
pom = 0;
while time<3600
ventil = ddereq(channel,'ventil');    
pause(0.1);
time= time+1;
pom = pom+1;

if (kvas<=100)
kvas = kvas+1;
end;

if (kvas>=100 && temperature<95 && ohrev==1)

     temperature = temperature+1;
    tempom=0;

end;

if (temperature==95)
    ohrev=0;

end;

if (ohrev==0)  
temperature = temperature -0.1;
tempom = 1;

end;

if (temperature==70)
ohrev=1;

end;

    end;

我与matlab进行通信并在intouch中进行可视化但我无法弄清楚为什么变量ohrev1时变为temperature达到70值。 它上升到95,然后下降到0,但它应该停在70并再次转到95,依此类推,但它不起作用。有什么建议吗?非常感谢你

1 个答案:

答案 0 :(得分:1)

问题在于您检查70度的具体温度:

if (temperature==70)
   ohrev=1;
end;

失败的原因与浮点数表示的基本问题有关。例如:

>> fprintf('%0.17e', 0.1)
1.00000000000000010e-01

请注意,在MATLAB(和大多数通用语言)中,浮点文字0.1并不完全表示为MATLAB浮点数。在第16个小数位有一点额外。因此,一旦开始从整数温度值中减去0.1

if (ohrev==0)  
    temperature = temperature -0.1;
    tempom = 1;
end;

您将不再拥有一个完全为整数值的数字。因此,测试temperature == 70永远不会成真。

一般解决方案是使用公差始终检查浮点数。因此,不要检查相等性,请执行以下操作:

tolerance = 1e-6;  %% 0.000001; use whatever makes sense for your program
if abs(temperature - 70) < tolerance
    ohrev = 1;
end

使用浮点数时这是一个普遍的问题,所以如果你要用MATLAB(或Python,或Java等)编写科学程序,我强烈建议你阅读更多关于这个主题的内容。

更多:资源:

http://www.mathworks.com/matlabcentral/answers/57444-faq-why-is-0-3-0-2-0-1-not-equal-to-zero

Why can't decimal numbers be represented exactly in binary?