以下是代码:
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中进行可视化但我无法弄清楚为什么变量ohrev
在1
时变为temperature
达到70
值。
它上升到95
,然后下降到0
,但它应该停在70
并再次转到95
,依此类推,但它不起作用。有什么建议吗?非常感谢你
答案 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