2016-05-09 2 views
-1

Вот код:не MATLAB оценить состояние

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; 

Я comunnicating с MATLAB и делать визуализацию в InTouch, но я не могу понять, почему переменная ohrev не стал 1 когда temperature достигает 70 значение. Он поднимается до 95, затем идет до 0, но он должен остановиться на 70 и снова перейти к 95 и так далее, но он не работает. Какие-нибудь советы? Большое спасибо

+0

ваш код неполный - переменная температура не запускается. – 16per9

+1

Мое предположение: [не выполнять точные совпадения с числами с плавающей запятой] (http://stackoverflow.com/questions/686439/why-is-24-0000-not-equal-to-24-0000-in-matlab), особенно если они не рассчитаны. – TroyHaskin

+0

Я запускаю ваш код, и когда kvas становится 100, переменная температура поднимается до 70 и достигает его значения. – 16per9

ответ

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 никогда не может быть правдой.

Общее решение - ALWAYS проверить номера с плавающей точкой, используя допуски. Таким образом, вместо проверки равенства, выполните следующие действия:

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

Это общая проблема при работе с числами с плавающей точкой, так что я сильно recommmend больше читать на эту тему, если вы собираетесь писать научные программы в 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?

+0

Разве это не ваше второе имя Genius? Большое спасибо! Ну, вы знаете, это моя задача, я не выбрал matlab ... – s0re

+0

:) ну, как я уже упоминал, у вас будет эта проблема практически на любом языке, используя собственные инструменты, но легко работать. Существуют пакеты, которые позволяют проводить арифметические вычисления с высокой точностью, но они обычно намного, намного медленнее, чем использование встроенных возможностей с плавающей запятой. – gariepy

Смежные вопросы