scilabヤコビ法で固有値と固有ベクトルを求めるプログラムでエラーが発生

このQ&Aのポイント
  • scilabのヤコビ法を使って固有値と固有ベクトルを求めるプログラムを作成していますが、エラーが発生しています。
  • 現在、プログラムの一部に「end」を入れると、「一貫性がない掛け算です。」というエラーが発生し、入れなければ「elseが抜けています...」というエラーが出ます。
  • scilab自体に詳しくないため、コードに間違いがあるかもしれません。解答をお願いします。
回答を見る
  • ベストアンサー

scilab ヤコビ法について、errorがでます

ヤコビ法で固有値、固有ベクトルを求めるプログラムを色々調べながら作っていたのですが、errorが出てしまい手詰まりになりました。あまり、scilab自体詳しくなく、多々間違いがあるかもしれませんが、学校でどうしても必要なため、どうか、解答の方をよろしくお願いします。 //初期化 A=[2 1 3;1 0 1;3 1 0] Pinf=eye(3,3) //ヤコビ法:Aの対角成分が固有値、 Pinfの行ベクトルが固有ベクトルになる for i=1:21, i if abs(A(1,2))>abs(A(1,3)) then theta=atan(2*A(1,2))/(A(1,2)-A(1,3))/2 P=[cos(theta),sin(theta);-sin(theta),cos(theta)]; elseif abs(A(1,3))>abs(A(2,3)) then theta=atan(2*A(1,3))/(A(1,3)-A(2,3))/2 P=[cos(theta),sin(theta);-sin(theta),cos(theta)]; else theta=atan(2*A(2,3)/(A(2,3)-A(1,2)))/2 P=[cos(theta),sin(theta);-sin(theta),cos(theta)]; end Pinf=P*Pinf A=P*A*P' ,end 現在、下から4行目のendを入れなければ、end または 「else が抜けています...」とerrorが出てしまい、また、endを入れると、その下の Pinf=P*Pinf の所で、「一貫性がない掛け算です。」とerrorがでます。 以上が、現在困っている状況になります。 よろしくおねがいします。

質問者が選んだベストアンサー

  • ベストアンサー
  • f272
  • ベストアンサー率46% (8018/17137)
回答No.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

teltel-bouzu
質問者

お礼

ありがとうございます。 おかげさまで、無事、プログラムを完成させることができました。

その他の回答 (2)

  • f272
  • ベストアンサー率46% (8018/17137)
回答No.2

少し修正。 > Pinfの行ベクトルが固有ベクトルになる ということですから,「Pinf=P*Pinf」で問題なかった。 でも,Pinfの列ベクトルが固有ベクトルになるようにした方がいいんじゃないかなあ?

teltel-bouzu
質問者

お礼

一応、考え直した結果、ある程度進展はしたと想うのですが・・・また、「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% (8018/17137)
回答No.1

ヤコビ法なら非対角要素で絶対値最大のものを求めるのだが,そうなっていない。 3*3行列の計算をしたいはずだが,Pは2*2行列になっている。 そのうえthetaの計算がヤコビ法に従っていない。 Pinfの更新の計算もヤコビ法に従っていない。 もうどうしようもないくらいおかしなことばかりです。

teltel-bouzu
質問者

お礼

ご指摘、ありがとうございます。 指摘を参考にもう一度考え直してみます。

関連するQ&A

  • scilab サイラボ(数学ソフト)

    数学ソフトscilabについて知っている方いますか?たとえば関数としてy=sin(x)としてこの関数を何回か微分した関数をベクトルか行列にいれていきたいのです。V=[cos(x) -sin(x) -cos(x) six(X) ]のようにです。sin(x)を微分するコマンドはないのでしょうか?derivatではうまくいかないし・・・お願い致します。

  • scilabについて

    scilabについて scilabで x=y/tan(%pi*(n+y/0.1))という式をグラフにしたいんですが、書いたプログラムが動きません。エラーはないはずですが... for n=-50:50; y=[-100:5:100]; deff('[x]=f(x)','x=y/tan(%pi*(n+y/0.1))'); if tan(%pi*(n+y/0.1))<>0 then; fplot2d(y,f) end end ちなみにnは-50から50の変数です。 どなたか原因を教えてください。お願いします。

  • 回転ベクトルの固有値、固有ベクトルについて

        回転ベクトル A = | cos(π/4) -sin(π/4) | のとき、              | sin(π/4) cos(π/4) | Aの固有ベクトル行列を求める式 B= P^-1 A P について、B、P^-1、Pのそれぞれどのような値になりますか。 (P^-1はPの逆行列)  

  • 行列の固有ベクトルの問題を教えて下さい。

    この問題が分かりません。お願いいたします。 行列A= (cos2θ sin2θ) (sin2θ -cos2θ) がある。(0≦θ<π) 固有値と固有ベクトルを求め、固有ベクトルを図示しなさい。 という問題です。 解いてみると、固有値は1と-1だと分かりました。 しかし、固有ベクトルでつまっています。 例えば固有値1として求めると、 (cos2θ-1)x+sin2θy=0 x=1のとき、y=(1-cos2θ)/sin2θ としてsin2θ≠0のときと=0の時、みたいに場合分けしたのですが、図示出来ませんでした・・・。 固有ベクトルの良い取り方があるのでしょうか? 解答、お願いいたします

  • ユニタリ行列と対角化について

    A= ( cosθ -sinθ) ( sinθ cosθ ) この2×2行列の固有値、固有ベクトルを求め ユニタリ行列Uを用いて対角化するというものなのですが まずdet(λE-A)=0 から λ=cosθ ± i|sinθ| が求まり そこから固有ベクトルを求めようとしたのですが sinθの正負で場合わけすると ひとつの固有値に対して固有ベクトルが二つでてきて それから先に進めません・・・。 通常の対角化と違うやり方をおこなわないといけないのでしょうか? 行列についてあまり詳しくないのでわかりやすく教えていただけるとうれしいです。 よろしくお願いしますm(__)m

  • scilabのエラーに関して

    よろしくお願いいたします。 Scilabを用いて二重振り子の数値解析を行なっています。 この先scilabが必要になるのでいろいろ使ってみているのですが、 うまくいきません。 オイラー法を用いて二重振り子の運動方程式を動かそうとしているのですが、 動きません。 ソースは //Matrix ccc1=zeros(20000,1); ccc2=zeros(20000,1); s1=zeros(20000,1); s2=zeros(20000,1); c1=zeros(20000,1); c2=zeros(20000,1); m1=0.10; //一重目質量 m2=0.08; //二重目質量 l1=0.4; //一本目長さ l2=0.3; //二本目長さ dt=0.05; //時間刻み幅 g=9.80665; //Gravitational acceleration c1(1)=%pi; c2(1)=%pi*0.5; s1(1)=0; //1. s2(1)=0; //2. //Eular method for t=0:1:100 z1=-m2*l1*s1(t+1)*s1(t+1)*sin(c1(t+1)-c2(t+1))*cos(c1(t+1)-c2(t+1)); z2=m2*g*cos(c1(t+1)-c2(t+1))*sin(c2(t+1)); z3=-m2*l2*s2(t+1)*s2(t+1)*sin(c1(t+1)-c2(t+1)); z4=(m1+m2)*g*sin(c1(t+1)); z5=l1*m1+l1*m2*sin(c1(t+1)-c2(t+1))*sin(c1(t+1)-c2(t+1)); ccc1=(z1+z2+z3+z4)/z5; ccc2(t+2)=ccc2(t+1)+dt*ccc2(t+1); s1(t+2)=s1(t+1)+dt*ccc1(t+1); c1(t+2)=c1(t+1)+dt*s1(t+1); z6=(sin(c1(t+1)-c2(t+1))*(m2*l2*s2(t+1)*s2(t+1)*cos(c1(t+1)-c2(t+1)))); z7=(sin(c1(t+1)-c2(t+1))*((m1+m2)*l1*s1(t+1)*s1(t+1))); z8=(m1+m2)*g*cos(c1(t+1)-c2(t+1))*sin(c1(t+1)); z9=(m1+m2)*g*sin(c2(t+1)); z10=(l2*m1+l2*sin(c1(t+1)-c2(t+1))*sin(c1(t+1)-c2(t+1))); ccc1=(z6+z7+z8+z9)/z10; ccc2(t+2)=ccc2(t+1)+dt*ccc2(t+1); s2(t+2)=s2(t+1)+dt*ccc2(t+1); c2(t+2)=c2(t+1)+dt*s2(t+1); end なのですが、 ccc2(t+2)=ccc2(t+1)+dt*ccc2(t+1); s1(t+2)=s1(t+1)+dt*ccc1(t+1); c1(t+2)=c1(t+1)+dt*s1(t+1); のあたりで、 「添字に誤りがあります」とエラーが出てしまいます。 20000行一列の行列を用意して、C言語のように配列を用いているのですが、、、。 ご教授よろしくお願いいたします。

  • sin cosの行列の固有ベクトルを教えて下さい

    行列 (cosθ sinθ) (sinθ ーcosθ) の固有ベクトルが分かりません。 固有値は計算して1,-1と分かったのですが、固有ベクトルは求めようとしてもうまくいかず困っています。 分かる方、お願いいたします

  • 行列について

    行列 A=E-αR, R= sin^2θ  sinθcosθ sinθcosθ cos^2θ があります。行列Aと行列Rの固有値と固有ベクトルの関係を示せ。 という問題があるんですがわかりません。 ヒントでもよいので教えてください。

  • scilabのエラーについて

    よろしくお願いします。 scilabにてオーバーラップを掛けてFFT解析をしたく、いくつかのWebを参考にさせて頂きながら 試しているのですが、”添字に誤りがあります”とエラーになってしまいます。 ソースは clear all; stacksize('max') v0=read_csv('C:\Users\*****\Desktop\scilab\data7.csv',",") v1 = evstr(v0);//上記v0データは文字列認識の為数値データに変換 //窓関数 N1=256; win_l = window('hn',N1); win_l_minus = win_l * -1; //FFTを実行 N=size(v1,1);//データ長 N2=N1/4; //N/2で50%オーバーラップ L = floor(N/N2)-1;//全サンプルに対するFFTの必要回数  y = 0;//出力ベクトルyの初期値 past_tail=zeros(1,N2);//ハーフオーバーラップ加算信号の初期値 for k=1:L n =N2*(k-1);//FFTの開始地点を更新   v2=win_l*v1( n+1 : n+N1 );//観測信号に窓を掛ける v3=fft(v2,-1);//FFT y1=fft(v3,1);//IFFT y=(y,past_tail + y1(1:N2));       //今回のIFFTの前半を前回のIFFT後半に加算してから出力ベクトルyに追加 past_tail=y1(N2+1:N1);//今回のIFFT結果の後半を記憶 end fv1dBuV=zeros(N,2); fv1dBuV(1,1) = 0;//DC =0Hzを入力 fv1dBuV(1,2) = 20*log10(abs(y(1)/N)/10.^-6);//dBuVに変換 sr = 4000; //sr:サンプリングレート[sample/sec] dt = 1/sr; // dt: サンプリング間隔[sec] T = N*dt; // T: 測定時間[sec] df =1/T; //Hz df: 1/測定時間->最低周波数、周波数分解能[Hz] for i=2:N fv1dBuV(i,1)=(i-1)*df///10^6;//周波数をMHzで記録 fv1dBuV(i,2)=20*log10(abs((y(i))/(N/2))/10.^-6); //N/2の左半分を使用して算出 end になります。(この後はPlot処理) y=(y,past_tail + y1(1:N2))で上記エラーが指摘されます。 プログラミングは初心者なのでどのように修正したらよいか 教えていただけると助かります。 また、オーバーラップを掛けてのFFT解析で他の方法があれば 教えてください。

  • 数学(行列,微分・積分、ベクトル)

    問1 次の微分・定積分を求めなさい。 (1)d/dx{log|cos(x)|} = -sin(x)/cos(x) (2)∫(0→1) xe^-x dx =1-2e^(-1) 問2 行列A= (3 4) (1 0) について以下の各問に答えなさい。 (1)行列Aの固定値と固有ベクトルを求めなさい。 Aの固定値は λ=4, -1 λ=4の場合の固有ベクトルは X1=C1(4,1) (C1:任意定数) λ=-1の場合の固有ベクトルは X2=C2(-1,1) (C2:任意定数) (2)(1) で求めた固有ベクトルを用いて、行列Aを対角化しなさい。 対角行列P= (4 -1) (1 1) とおく。 P^(-1)AP= (4 0) (0 -1) 問3原点O(0,0),点A(4,-1),点B(2,2)がある時以下の各問に答えなさい。 (1)ベクトルOAとOB長さと内積OA*OBを求めなさい。 OA=<4,-1>,OB=<2,2> |OA|= √17,|OB|=√8 OA*OB=8-2=6 (2)∠AOBをθとする時,cosθとsinθを求めなさい。 cosθ=3/√34 sinθ=5/√34 (3)三角形OABの面積を求めなさい。 S=1/2|OA×OB|=5 問4 曲線 y =x^2 と直線y=2x によって囲まれた部分の面積を求めなさい。 S=∫(0→2) 2x-x^2= 4/3 解答がないため,解答のチェックをお願いしたいのですが,よろしくおねがいします。

専門家に質問してみよう