2016-05-09 12 views
-1

Hier den Code bewerten:Matlab wird keine Bedingung

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; 

Ich comunnicating mit Matlab und tun Visualisierung in intouch aber ich kann nicht herausfinden, warum die Variable ohrev nicht 1 wurde, als temperature erreicht 70 Wert. Es geht auf die 95, dann geht es bis 0 aber es sollte bei 70 stoppen und wieder gehen zu 95 und so weiter, aber es funktioniert nicht. Irgendwelche Ratschläge? Vielen Dank

+0

Ihr Code ist unvollständig - die variable Temperatur wurde nicht gestartet. – 16per9

+1

Meine Vermutung: [führen Sie keine genauen Übereinstimmungen mit Fließkommazahlen] (http://stackoverflow.com/questions/686439/why-is-24-0000-not-equal-to-24-0000-in-matlab), vor allem, wenn sie berechnet nicht zugewiesen sind. – TroyHaskin

+0

Ich führe deinen Code und wenn Kvas 100 wird, erhöht sich die variable Temperatur auf 70 und erreicht ihren Wert. – 16per9

Antwort

1

Das Problem ist, wo Sie für die jeweilige Temperatur von 70 Grad überprüfen:

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

Der Grund dafür ist nicht mit grundlegenden Fragen in Bezug auf die Darstellung von Gleitkommazahlen zu tun hat. Zum Beispiel:

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

Beachten Sie, dass in MATLAB (und die meisten Allzweck-Sprachen) die Floating-Point-wörtliche 0.1 ist nicht genau als MATLAB Gleitkommazahl dargestellt. Es gibt ein kleines Extra in der 16. Dezimalstelle. Aus diesem Grund, wenn Sie beginnen 0.1 von Ihrem ganzzahligen Temperaturwert subtrahiert:

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

Sie nicht mehr eine Nummer haben, die genau einen Integer-Wert ist. Daher kann der Test temperature == 70 niemals wahr sein.

Die allgemeine Lösung ist IMMER überprüfen Sie Gleitkommazahlen mit einer Toleranz. Anstatt also Gleichheit zu prüfen, gehen Sie wie folgt vor:

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

Dies ist ein allgemeines Problem, wenn mit Gleitkommazahlen arbeiten, so dass ich recommmend stark mehr über das Thema zu lesen, wenn Sie wissenschaftliche Programme in MATLAB schreiben möchten (oder die Python oder Java, etc.)

Mehr: Ressourcen:

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

Ist nicht Ihr zweiter Name Genius? Vielen Dank! Nun, das ist meine Aufgabe, ich habe mich nicht für Matlab entschieden ... – s0re

+0

:) Nun, wie ich schon erwähnt habe, wirst du dieses Problem in fast jeder Sprache mit den nativen Tools haben, aber es ist einfach zu umgehen. Es gibt Pakete, die genaue arithmetische Berechnungen ermöglichen, aber sie sind normalerweise viel, viel langsamer als die eingebauten Fließkomma-Funktionen. – gariepy

Verwandte Themen