- 締切済み
MATLABの計算過程での質問です。
はじめまして。 MATLABのコードでどうしてもわからないことがあり質問させていただきます。 問題はerrorの計算で起こります。 error=Σ[((F_n+1)-(F_n))/(F_n+1)] ループ内の計算がiter=1以降に進まなくなりました。 いろいろ編集してみましたが、どうしてもerrorのところがうまく働きません。 良かったらアドバイスよろしくお願いします。 tol=tolerance N=number of maximum iterationです ---------------------------------------------------------------- tol=0.01; N=100; A=zeros(26,26); f0=zeros(26,26); A(11:26,1)=100; A(26,1:16)=100; f=A; iter=1;f0=0 n=1; for n=1:N for i=2:26-1 for j=2:26-1 f(i,j)=(1/4)*(A(i+1,j)+A(i-1,j)+A(i,j+1)+A(i,j-1)) error(i,j)= sum(abs((f(i,j)-f0(i,j))./f(i,j))); end end if error <=tol break; else A=f; f0=f; iter=iter+1 end end
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- sgwjn
- ベストアンサー率70% (47/67)
#2です。 実際に実行してみました。 一つ確認なのですが、このコード動いてはいないですよね? 実行環境では、 error(i,j)= sum(abs((f(i,j)-f0(i,j))./f(i,j))); この行で行列f0の参照インデックスのエラーが発生しました。 原因は、f0=0 をしているためです。 試しにここを削除すると、正しいかどうかは分かりませんが一応動作はしました。
- cametan_42
- ベストアンサー率62% (163/262)
まあ、この「教えてgoo!」だとインデント付けてコピペしてもそのように解釈されませんしね。 (確かに、このテの技術系質問版としては使いづらい、とは思います) 別のトコロにも書きましたが、「Matlabで~」と言う質問自体が凄くレスが付きにくい、です。個人で所有してるのか、あるいは大学のパソコンで用いてるのか知りませんが、フリーで使えるMatlab互換と言われる ・GNU Octave ・Scilab で質問した方がレスは付きやすい、とは思いますよ(これは答えを得る為のヒント、です)。ANo2のお方も仰っていますが「Matlabは高価」なんで、個人所有者は少なすぎると思います。(逆に言うと、GNU OctaveかScilabだったらタダで手に入るんで、ユーザーがMatlabユーザーに比してまだいる、と言う可能性があります) また、質問者も「Matlabは大学のパソコンで使ってるだけで自分のパソコンには入ってない」場合、「自分のパソコンでOctaveかScilabを入れておけば」レスの通り即座に試してみる事が出来るでしょう。そしてそのOctave/Scilabで書いたスクリプトをUSBメモリなんかに入れて大学に持っていけば、また新しくプログラムスクリプトを記述しなくても、ロードしてそのまま走らせられるでしょう。(まあ、「大学のパソコンにしかMatlabが入ってない」と言う前提ですが) さて、質問に上がってるコードをOctave上で走らせてみましたが、「動く分は動く」ワケですよね。26×26の行列があって、1列目の11~26行目が全部100、26行目の1~17列目までが全部100、そしてその他の要素は「全て0」になっています。これがfとして出力されていますね。 「動いてる」と言うことは「プログラムとしては間違ってない」と言う事です(意外でしょうが)。単に「質問者が狙った通りの計算ではない」と言うのが問題なんでしょう。 とすると、目的とする計算は何なのか、それが分からない限り、こちらからどう言うサジェストもしようがない、って事なのです。「どんなプログラムでも動く以上は"コンピュータの立場からすると"」間違ってないのです。 さて、何の計算をしたいのでしょうか?もうちょっと具体的に書くべきでしょうね。
- sgwjn
- ベストアンサー率70% (47/67)
#1の方も仰っている通り、見にくいコードですね。 初期化も重複してますし、もう少し整理した方が良いです。 また、上手く動かないとのことですが、どの様におかしいのかなどを詳しく書かないと回答者が実際に実行してみなければいけなくなります。 MATLABは高価なソフトです。個人で所有している方は限られていると思いますので、詳しく書いておかないと回答が付き難くなるかも知れませんよ。 ざっと見た限りですと、 f0=zeros(26,26); の後で f0=0 と初期化しているのに error(i,j)= sum(abs((f(i,j)-f0(i,j))./f(i,j))); ~~~~~~~~ と参照しています。 おかしくないですか?
- my3027
- ベストアンサー率33% (495/1499)
詳しく見ていませんが、もう一度すごく分かり難いプログラムですね。 値の代入にしても不必要何度もしたり、ループ毎の段下げもないので流れが分かりません。forループも3つも入れ子にするより、サブルーチンとかにした方がいいんじゃないですか? もっと簡略に書き直すことを勧めます。そうすれば悪い所もより見つけやすくなるでしょう。