2017-01-20 8 views
1

K=5とし、alpha = 1:0.5:10とする。MATLAB:なぜacosを使用して複素数を得るのですか?

私のコードは次のとおりです。

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 

私はcomplex doubleとして変数thetaを取り戻すのはなぜ?

Plot of sine and cosine
イメージソース:cos関数は次のようになります

+0

「alpha」の*実際の値は何ですか? – Suever

+2

Matlabの優れた文書では、 'acos'に' [-1,1] 'の外側に引数を与えているので、? –

+0

'alpha'は1から10までの19値からなる配列で、0.5ステップの@Suever – ElenaPhys

答えて

1

Wikipedia, Trigonometric functions

あなたがはっきりと見ることができるように、余弦1上または-1を下回ることはありません。余弦の逆関数であるacosで作業しています。あなたは基本的に質問: "xの値はcos(x)が私の与えたyの値を返しますか?"今

は、h=3のために、あなたのコードは-1以下あるcos_theta年代を作成します。グラフからわかるように、ではなく、のような値に実数で到達することができます。しかしながら、複素数のコサインは、1および-1より上の値に達することができる。。 MATLABは、実際の解は存在しないが、複雑な解は存在することを正しく認識しているため、結果として複素数の角度を返します。 h=1h=2の場合、cos_thetaはうまく動作し、-1より小さく、結果は実数です。

PS: Forループは悪い/遅いです。 hを行ベクトルの代わりに列ベクトルに置き換え(.'を使用して転置して)、bsxfun( "古い" MATLABバージョン)を使用するか、またはR2016以降の組み込みブロードキャストを使用して削除できます。

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); 
関連する問題