プロが教えるわが家の防犯対策術!

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個を羅列せずに省略して書く方法はありませんか?
どなたか分かる方よろしくお願い致します。

A 回答 (5件)

単に


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]

といった具合に与えればいいかと思います。
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございます。
まだ「インデックスが行列の次元を超えています。」
と出てしまうのは、どうやらまた別のところに問題があるということですね。。

もう少し、考えてみます。
どうもありがとうございました。

お礼日時:2007/04/24 21:58

>「インデックスが行列の次元を超えています。



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は長いのですが、↑のような短い簡単なものにしてみても
??? インデックスが行列の次元を超えています
というエラーが出てしまうのですが、いったい原因は何なのでしょうか?
度重なる質問、本当にすみません。

補足日時:2007/04/26 11:30
    • good
    • 0
この回答へのお礼

どうやらそれが原因だったみたいです。
とても助かりました。
本当にありがとうございました。

お礼日時:2007/04/25 19:20

>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ドット)を付ければ次行に継続できます。
    • good
    • 0
この回答へのお礼

度々すみません。。
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の行列のサイズを定義していませんでした。
こういった場合でも、行列のサイズの定義は必要ということですよね?

お礼日時:2007/04/26 18:59

>エラーは


>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=…」の式がエラーになりますね。
    • good
    • 0
この回答へのお礼

行の終わりの;を取り除いて実行してみたのですが、エラーが出てしまいます。。
syms V Y d t
はV Y d tに数値を入れるのではなく、記号とみなす(シンボリック化)という命令なので、実際に値を与えてから計算するという方法では困ってしまうのです。。
この記号化の後に行おうと思っているヤコビアン行列を求める関数では、実際の数値ではなく記号化したものしか扱えないとマニュアルに載っていたもので。。
どうもすみません。
もし、なにか良い解決方法がございましたら教えていただけると助かります。
よろしくお願いいたします。

お礼日時:2007/04/27 16:16

以下を参考にしてはどうでしょうか。



http://dl.cybernet.co.jp/matlab/support/manual/r …

Symbolic Math Toolboxの説明があります。
ヤコビアンについても
Symbolic Math Toolboxの使用
 計算
  微分
のなかで具体的な例が示されています。

その後に、具体的な数値による行列へ
subs コマンドをつかって変換してはどうでしょうか。

Symbolic Math Toolboxを使うと、
MatlabでもMaple(そのものズバリか?)やMathmaticaの様なことができるのですね。
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!