2017-01-20 4 views
1

Lassen Sie K=5, während alpha = 1:0.5:10.MATLAB: Warum bekomme ich eine komplexe Zahl mit acos?

Mein Code ist:

cos_theta_0 = -1./(2.*alpha)+sqrt(1.+1./(4.*alpha.^2)); 
theta_0 = acos(cos_theta_0); 

for h = 1:(K-2) 
    cos_theta(h,:)= cos_theta_0 - h.*log(2); 
    theta(h,:)= acos(cos_theta(h,:)); 
end 

Warum ich die Variable theta als complex double wieder tun?

+0

Was ist der * tatsächliche * Wert von 'alpha'. – Suever

+2

Weil Sie, wie Matlabs gute Dokumentation sagt, "acos" ein Argument außerhalb von "[-1,1]" gegeben haben? –

+0

'alpha' ist ein Array bestehend aus 19 Werten von 1 bis 10 mit einem 0,5-step @Suever – ElenaPhys

Antwort

1

Die cos Funktion sieht wie folgt aus:

Plot of sine and cosine
Image Source: Wikipedia, Trigonometric functions

Wie man deutlich sehen kann, ist die Cosinus nie oben 1 oder unter -1 geht. Sie arbeiten mit der acos, die die umgekehrte Funktion des Kosinus ist. Sie stellen grundsätzlich die Frage: "Welchen Wert für x macht cos(x) geben meine gegebenen y Wert?" Jetzt

, für h=3, Ihr Code erstellt cos_theta ‚s die unter-1 sind. Wie Sie aus dem Diagramm sehen können, ist es nicht möglich, solche Werte mit reellen Zahlen zu erreichen. Jedoch kann der Kosinus einer komplexen Zahl Werte über 1 und unter -1 erreichen. MATLAB erkennt korrekt, dass keine echte Lösung existiert, aber komplexe Lösungen - und liefert daher komplexe Winkel. Für h=1 und h=2 verhalten sich die cos_theta gut und sind kleiner als -1, so dass die Ergebnisse echt sind.

PS: For-Schleifen sind schlecht/langsam. Sie können dies löschen, indem Sie h einen Spaltenvektor anstelle eines Zeilenvektors erstellen (indem Sie ihn mit .' transponieren) und dann entweder bsxfun (in "alten" MATLAB-Versionen) verwenden oder die integrierte Übertragung in R2016 oder neuer verwenden.

h = (1:K-2).'; 
cos_theta = bsxfun(@minus, cos_theta_0 , h*log(2)); % For older than R2016 
cos_theta = cos_theta_0 - h*log(2);     % For newer than R2016 
theta = acos(cos_theta); 
Verwandte Themen