- ベストアンサー
scilabヤコビ法で固有値と固有ベクトルを求めるプログラムでエラーが発生
- scilabのヤコビ法を使って固有値と固有ベクトルを求めるプログラムを作成していますが、エラーが発生しています。
- 現在、プログラムの一部に「end」を入れると、「一貫性がない掛け算です。」というエラーが発生し、入れなければ「elseが抜けています...」というエラーが出ます。
- scilab自体に詳しくないため、コードに間違いがあるかもしれません。解答をお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
あなたが書いたものからif文に関係ありそうなところを抜き出すと if abs(A(1,2)) > abs(A(1,3)) then if abs(A(1,2)) > abs(A(2,3) then elseif abs(A(1,2)) > abs(A(1,3)) then if abs(A(2,3)) > abs(A(1,2) then elseif abs(A(1,3))>abs(A(2,3)) then if abs(A(1,3)) > abs(A(1,2)) then else end となるけど,これで正しい文法に従っていると思うか? 多分,意図しているのはこれであろう。 if abs(A(1,2)) >= abs(A(1,3)) & abs(A(1,2)) >= abs(A(2,3)) then elseif abs(A(2,3)) >= abs(A(1,3)) & abs(A(2,3)) >= abs(A(1,2)) then elseif abs(A(1,3)) >= abs(A(2,3)) & abs(A(1,3)) >= abs(A(1,2)) then else //ここには来ない end
その他の回答 (2)
- f272
- ベストアンサー率46% (8469/18132)
少し修正。 > Pinfの行ベクトルが固有ベクトルになる ということですから,「Pinf=P*Pinf」で問題なかった。 でも,Pinfの列ベクトルが固有ベクトルになるようにした方がいいんじゃないかなあ?
お礼
一応、考え直した結果、ある程度進展はしたと想うのですが・・・また、「end またはelseが抜けています」とerrorが出てしまいました・・・。何度も、申し訳ないのですが、もし、よろしければ、また間違えているところの指摘をお願いします。 ↓がプログラムです。 //初期化 A=[2 1 3;1 0 1;3 1 0] Pinf=eye(3,3) //ヤコビ法:Aの対角成分が固有値、 Pinfの行ベクトルが固有ベクトルになる for i=1:20, i if abs(A(1,2)) > abs(A(1,3)) then if abs(A(1,2)) > abs(A(2,3) then theta=atan(2*A(1,2))/(A(1,1)-A(2,2))/2, P=[cos(theta),sin(theta),0;-sin(theta),cos(theta),0;0,0,1]; elseif abs(A(1,2)) > abs(A(1,3)) then if abs(A(2,3)) > abs(A(1,2) then theta=atan(2*A(2,3))/(A(2,2)-A(3,3))/2, P=[1,0,0;0,cos(theta),sin(theta);0,-sin(theta),cos(theta)] elseif abs(A(1,3))>abs(A(2,3)) then if abs(A(1,3)) > abs(A(1,2)) then theta=atan(2*A(1,3))/(A(1,1)-A(3,3))/2, P=[cos(theta),0,sin(theta);0,1,0;-sin(theta),0,cos(theta)]; else theta=atan(2*A(1,2)/(A(1,1)-A(2,2)))/2, P=[1,0,0;0,cos(theta),sin(theta);0,-sin(theta),cos(theta)]; end Pinf=P*Pinf A=P*A*P' ,end
- f272
- ベストアンサー率46% (8469/18132)
ヤコビ法なら非対角要素で絶対値最大のものを求めるのだが,そうなっていない。 3*3行列の計算をしたいはずだが,Pは2*2行列になっている。 そのうえthetaの計算がヤコビ法に従っていない。 Pinfの更新の計算もヤコビ法に従っていない。 もうどうしようもないくらいおかしなことばかりです。
お礼
ご指摘、ありがとうございます。 指摘を参考にもう一度考え直してみます。
お礼
ありがとうございます。 おかげさまで、無事、プログラムを完成させることができました。