2016-06-13 16 views
2

Der Code, den ich hier verwende, dient zur Veranschaulichung des möglichen Fehlers. Im Code habe ich drei Funktionen wie folgt definiert und versucht, sie zu visualisieren.Ist das ein Fehler in Matlab Funktionsaufruf?

die erste:

$$y_1(x)=5\sin(x)$$ 

Die zweite:

$$y_2(x)=12-8\cos(x)$$ 

Die 3. ist eine abschnittsweise Kombination der obigen beiden:

when x<0: 
$$y_3(x)=y_1(x)$$ 

when x>=0: 

$$y_3(x)=(y_1(x)+y_2(x))/2$$ 

Wenn ich den folgenden Code in Matlab ausführen , die als m2mPlot.m gespeichert wird:

function m2mPlot 
clear all 
close all 
clc 

global a b c; 
a=12; 
b=8; 
c=5; 
t=-pi:.1:pi; 

plot(t,y1(t),'b') 
hold on 
plot(t,y2(t),'m') 
plot(t,y3(t),'r') 
legend('y1','y2','y3') 


function y=y1(t) 
% The first function for testing 
global c; 
y=c*sin(t); 

function y=y2(t) 
% The 2nd function for testing 
global a b; 
y=a-b*cos(t); 

function y=y3(t) 
% The 3rd function for testing 
if t<0 % It seems this logic value is always FALSE, why? 
    y=y1(t); 
else 
    y=(y2(t)+y1(t))/2; 
end 

Ich habe:

enter image description here , die in der dritten Unterfunktion der logische Ausdruck gibt an, dass: t < 0 ist immer FALSCH, egal welchen Wert t tatsächlich ist.

Ist das ein Fehler in Matlab? Wie kann man ein solches Problem vermeiden?

Antwort

2

Dies ist kein Fehler in MATLAB, Sie verwenden es nur falsch.

Sie rufen y3(t) an, wobei t ein Vektor ist, d.h. t=-pi:.1:pi;. Aber der Code für y3 verwendet t in einem bedingten, d. H. if t<0. Da das Ergebnis von t<0 ein Vektor ist und die if-Anweisung einen Skalar erwartet, wird es nicht wie erwartet funktionieren. Wie Troy Haskin Punkte in den Kommentaren aus dem MATLAB docs:

wenn Ausdruck, Aussagen, Ende einen Ausdruck auswertet, und eine Gruppe von Anweisungen ausführen, wenn der Ausdruck wahr ist. Ein Ausdruck ist wahr, wenn das Ergebnis nicht leer ist und nur Elemente enthält, die nicht Null sind (logisch oder reell numerisch). Andernfalls ist der Ausdruck falsch.

Ihr t<0 Vektor enthält viele false Werte und so die if wertet es als false. Ich würde dir raten, einem MATLAB if einfach nur einen Skalar zu geben.

Wenn Sie Ihre y3 Funktion in einem vektorisierten Weise versuchen, diese stattdessen zu erstellen:

function y=y3(t) 
    y=y1(t).*(t<0) + y2(t).*(t>=0); 
end 
+1

Sie sind richtig auf dem [ 'if' Verhalten] (http://www.mathworks.com/help/ matlab/ref/if.html # description): "Ein Ausdruck ist wahr, wenn sein Ergebnis nicht leer ist und nur Elemente ungleich Null (logisch oder reell numerisch) enthält. Andernfalls ist der Ausdruck falsch." – TroyHaskin

+0

Vielen Dank! Ich habe den kleinen Unterschied vergessen, wenn das Eingabeargument kein Skalar ist. – user6043040