- 締切済み
MATLAB ヤコビアン行列 変数の指定
MATLABでヤコビアン行列を求めるプログラムを組みたいのですが、MATLAB初心者のため、どうしても変数を指定するところから先に進むことができません。 変数V(1)…V(10)、Y(1,1)…Y(10,10)には、本当は数値を入れたいのですが、シンボリック式でないとヤコビアン行列は扱えないようなので、symsで上の変数をシンボリック化したいと思っています。 上のように…と省略しているように、変数を指定する際、V(1)…V(10)の10個とY(1,1)…Y(10,10)の10×10=100個を羅列せずに省略して書く方法はありませんか? どなたか分かる方よろしくお願い致します。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- qqtester
- ベストアンサー率66% (10/15)
以下を参考にしてはどうでしょうか。 http://dl.cybernet.co.jp/matlab/support/manual/r14/toolbox/symbolic/?/matlab/support/manual/r14/toolbox/symbolic/ch2.shtml Symbolic Math Toolboxの説明があります。 ヤコビアンについても Symbolic Math Toolboxの使用 計算 微分 のなかで具体的な例が示されています。 その後に、具体的な数値による行列へ subs コマンドをつかって変換してはどうでしょうか。 Symbolic Math Toolboxを使うと、 MatlabでもMaple(そのものズバリか?)やMathmaticaの様なことができるのですね。
- info22
- ベストアンサー率55% (2225/4034)
>エラーは >P=[V(2)^2*Y(2,2)*cos(-t(2,2))... >+ V(2)*V(4)*Y(2,4)*cos(d(2)-d(4)-t(2,4)),1]; >の行に出ています。 行の終わりの「;」を通り除いて実行した時、 すべての行列要素の値が表示されるか確認してみてください。 そうすれば行列が定義できているか確認できますよ。 >ご指摘いただいた通り、行列の行と列が定義できてないことが原因だと思います。 Pの式の前に行列要素をすべて与えてからPの式の計算をしてみましたが エラーは出ませんでした。行列要素のすべても定義されていました。 clear V=[2:2:20] Y=[1:10 ; 11:20 ; 21:30 ; 31:40 ; 41:50 ; 51:60 ; 61:70 ; ... 71:80 ; 81:90 ; 91:100] d=[1:10] P=[1:2] t=100-Y P=… 質問ですが >syms V Y d t この行は受け付けなくてエラーになります。 関数として「V Y d t」を与えて見えるのですか? 行列が定義できていなければ「P=…」の式がエラーになりますね。
- info22
- ベストアンサー率55% (2225/4034)
>syms V Y d t >P=[V(1)^2*Y(1,1)*cos(-t(1,1)) + >V(1)*V(5)*Y(1,5)*cos(d(1)-d(5)-t(1,5));1]; >本当はもっとPは長いのですが、↑のような短い簡単なものにしてみても >??? インデックスが行列の次元を超えています >というエラーが出てしまうのですが、いったい原因は何なのでしょうか? Pは1行2列の行列ですか? d,tおよびPの行列のサイズが書いてないので回答しかねます。 式は簡略化して頂いていいですが、VやYのように行と列のサイズを書いてください。 またエラー行を書いていただけませんか?(式は簡略化しても良いですが、エラー原因の行と列指定の箇所は省略しないで下さい。) つまり、こちらでMatlabを使ってエラー発生が再現できず、エラー原因の調査ができません。 行列の行と列が正確に定義できていないことが考えられます。 なお、Matlabでは長い式は行末に「...」(3ドット)を付ければ次行に継続できます。
お礼
度々すみません。。 Pは1行2列の行列です。 V,dは1行10列でY,tは10行10列の行列です。 エラーは P=[V(2)^2*Y(2,2)*cos(-t(2,2))... + V(2)*V(4)*Y(2,4)*cos(d(2)-d(4)-t(2,4)),1]; の行に出ています。 ご指摘いただいた通り、行列の行と列が定義できてないことが原因だと思います。 例えば、symsでVを記号と定義しているので、それだけでPの中ではV(2)やV(4)を使って良いのだと勘違いしてしまい、V,d,Y,tの行列のサイズを定義していませんでした。 こういった場合でも、行列のサイズの定義は必要ということですよね?
- info22
- ベストアンサー率55% (2225/4034)
>「インデックスが行列の次元を超えています。」 V(1),V(2),…,V(10)に対して V(11)やV(12)を指定したり Y(11,5)とか、Y(3,12)などを指定したとき のエラーですね。
お礼
どうやらそれが原因だったみたいです。 とても助かりました。 本当にありがとうございました。
補足
昨日ご指摘いただいたところを考慮して、再びプログラムを組んでみたのですが、なぜかまだエラーがでてしまいます。 syms V Y d t P=[V(1)^2*Y(1,1)*cos(-t(1,1)) + V(1)*V(5)*Y(1,5)*cos(d(1)-d(5)-t(1,5));1]; 本当はもっとPは長いのですが、↑のような短い簡単なものにしてみても ??? インデックスが行列の次元を超えています というエラーが出てしまうのですが、いったい原因は何なのでしょうか? 度重なる質問、本当にすみません。
- info22
- ベストアンサー率55% (2225/4034)
単に Vと書けば V(1)…V(10) と同じことになります。 要素を指定する時は V(5) すべての要素を与える時は V=[0 1 2 3 4 5 6 7 8 9] Yのすべての要素に値を入れる時は Y=[0 1 2 3 4 5 6 7 8 9 ; 1 2 3 4 5 6 7 8 9 0 ; ... 2 3 4 5 6 7 8 9 0 1 ; 3 4 5 6 7 8 9 0 1 2 ; ... 4 5 6 7 8 9 0 1 2 3 ; 5 6 7 8 9 0 1 2 3 4 ; ... 6 7 8 9 0 1 2 3 4 5 ; 7 8 9 0 1 2 3 4 5 6 ; ... 8 9 0 1 2 3 4 5 6 7 ; 9 0 1 2 3 4 5 6 7 8 ] Yの2行目だけに値を入れる時は Y(2,:)= [1 2 3 4 5 6 7 8 9 0] Yの3列目だけに値を入れる時は Y(:,3)=[2;3;4;5;6;7;8;9;0;1] といった具合に与えればいいかと思います。
お礼
早速のご回答ありがとうございます。 まだ「インデックスが行列の次元を超えています。」 と出てしまうのは、どうやらまた別のところに問題があるということですね。。 もう少し、考えてみます。 どうもありがとうございました。
お礼
行の終わりの;を取り除いて実行してみたのですが、エラーが出てしまいます。。 syms V Y d t はV Y d tに数値を入れるのではなく、記号とみなす(シンボリック化)という命令なので、実際に値を与えてから計算するという方法では困ってしまうのです。。 この記号化の後に行おうと思っているヤコビアン行列を求める関数では、実際の数値ではなく記号化したものしか扱えないとマニュアルに載っていたもので。。 どうもすみません。 もし、なにか良い解決方法がございましたら教えていただけると助かります。 よろしくお願いいたします。