• 締切済み

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

みんなの回答

  • qqtester
  • ベストアンサー率66% (10/15)
回答No.5

以下を参考にしてはどうでしょうか。 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)
回答No.4

>エラーは >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=…」の式がエラーになりますね。

aimar_2007
質問者

お礼

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

  • info22
  • ベストアンサー率55% (2225/4034)
回答No.3

>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ドット)を付ければ次行に継続できます。

aimar_2007
質問者

お礼

度々すみません。。 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)
回答No.2

>「インデックスが行列の次元を超えています。」 V(1),V(2),…,V(10)に対して V(11)やV(12)を指定したり Y(11,5)とか、Y(3,12)などを指定したとき のエラーですね。

aimar_2007
質問者

お礼

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

aimar_2007
質問者

補足

昨日ご指摘いただいたところを考慮して、再びプログラムを組んでみたのですが、なぜかまだエラーがでてしまいます。 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)
回答No.1

単に 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] といった具合に与えればいいかと思います。

aimar_2007
質問者

お礼

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

関連するQ&A

  • matlabについて

    こんにちは。matlabについての質問です。 matlabについてまったくの初心者なのですが、大学のパソコンに入っているmatlabでsymsという変数の指定をしても、エラー表示がでてしまいます。これはどうやらmatlabに追加のtoolが入っていないと使えないということが調べていたらわかりました。この場合たとえば、f=x^2-x-1でf=0をxについて説くという場合どのようにmatlabに入力すればいいのですか?いろいろ調べたのですがよくわからなくて・・・。また、僕みたいな超初心者でもわかりやすいmatlab入門書やサイトで、お薦めの本などありましたら、教えていただきたいです。お願いします。

  • matlabにおける行列の格納

    matlabにおける質問です。 (matlabもとよりプラグラミング初心者です。) 例えばx=[1 2 3;3 4 5]となっているとき for i=1:10 y(1)=i*x end のように、しても、y(1)とxの次元が合わないというエラーが 出ると思います 行列を、このように「i番目」といった添え字のついた変数に 代入するには、どうしたらよいのでしょうか。 初心者のため大変初歩的なことですが、どなたかご教授ください。 とても焦っております。。。

  • ヤコビアン(関数行列式)について 高度な数学の質問になります

    座標変換のことについての質問です。 現在、テンソル解析をしていて、 y=f(x1,x2,x3) x=g(y1,y2,y3) の座標変換を考えています。 この二つの座標変換が、可逆で、一対一対応していることを説明したいのですが・・・。 この際、関数行列式(ヤコビアン)が0になってしまうと、逆行列が存在せず、 逆変換が、出来なくなってしまうようなのですが、これはどうしてなのでしょうか? そもそもヤコビアンが0になってしまうと逆変換が出来なくなると言う認識は正しいでしょうか? ヤコビアンが0になると、逆行列が出来なくなる理由、逆変換が出来なくなる理由を、簡単でもかまいませんので、 教えてください。

  • matlab matファイルから一部だけを読み込む

    Matlab初心者です、よろしくお願いします。 Matlabでn×m行列のデータが入っているmatファイルからx×y行列のデータを変数に読み込みたいのですが、どうすれば良いのでしょうか? ご教授していただけると助かります。 よろしくお願いします。

  • matlabについて教えてください

    プログラミング初心者です。matlabについて教えてください いまmatlabのプログラム上に、x, y, z, という、それぞれ5行1列の変数があります。 これらをまとめて、linuxのテキストエディタ(geditなど)で読み込める1つのファイルを作りたいと思っています。 作りたいファイルは、1列目にx、2列目にy、3列目にz の値が並んでいるような感じです。 どうかやり方を教えて下さいますようお願いします。

  • MATLABのシンボリックの係数行列の順序について

    現在MATLABについて勉強しているのですが、y=3*x^2+4*x+2のような任意の1変数多項式において、 最高次の係数で規格化(y=3/3x^2+4/3*x+2/3)したく、cf=coeffs(y)で係数の行列([2 4 3])を返し、 最高次の係数の要素(cf(end))で、多項式を割った式(y/cf(end))を求めたのですが、 上記のように係数の行列要素が次数の低い順にいつでもなっていると最高次の係数の要素はcf(end)で良いのですが、 与える多項式によって、係数行列要素の順序が変わってしまいます([2 3 4]、[3 4 2]のように)。 任意の1次多項式において規格化できるようにしたいのです。 どなたか初心者でも理解できるようご教授お願い致します。

  • MATLABとC++

    こんにちわ。資料を参考にしつつMATLABからC言語へ変換する作業をしているのですが、どちらに関しても初心者レベルで遅々としてはかどりません…。 分からないことの一つとして、MATLABは行列計算がしやすいがC言語はそうではないということからなのですが、MATLABで A = zeros(10,20,30) というのは次元10×20×30をもつゼロ行列 ということは分かったのですが、これは 数学で習う行列、2×2 や3×3など二次元な数字の並びを、三次元にまで拡張した表し方ということでしょうか?? また、上の式をC言語で書き表すとすると どのように書き表せるのでしょうか?どなたか分かるかた 教えていただければと思います。

  • 行列式の計算を、パソコンで変数を変数のままで計算するには?

    複雑な行列の計算をパソコン上で行いたいのですが、行列の要素を変数のまま計算してくれるソフトや方法はありませんでしょうか? ちょっと質問の内容がわかりにくいかもしれませんが、たとえば A =[cos(a)] B = [sin(b)] とあった場合 A+B=[cos(a)+sin(b)] のような解が欲しいのです。 MATLABで計算しようとしたのですが、計算結果が数値でしか得られなかったので困っています。 よろしくおねがいします。

  • ヤコビ行列について

    ヤコビ行列について解いてみたのですが、あっているのか不安です・・・ f(x,y)=x+y^3,g(x)=x^2+yについてヤコビ行列を求めるのですが fx,fy,gx,gyを求めて (fx)(gy)-(fy)(gx)=(1*1)-(3y^2-2x)=1-6xy^2 になりました。 答えがないので合っているかわかりません。 これで大丈夫なのでしょうか教えてください。 ちなみにこのあとこの式から関数行列式を求めなければいけないのですが、 教科書では関数行列式またはヤコビアンと載っていました。 となるとこの答えは違うのでしょうか?

  • ヤコビ行列式とは?

    ヤコビ行列式∂(x、y)/∂(r、θ)と ∂(r、θ)/∂(x、y)をx、yの関数およびr、θの関数の2通りの式で求めたいのだが変数がたくさんある上に、偏微分の意味がいまいち分かってないのでやり方を教えてください。ヤコビ行列式ってなんですか?

専門家に質問してみよう