• 締切済み

Octaveについて

つぎなようなプログラミングをしたいとき a=[1:0.1:2]; b=1.2; c=sqrt(a.^2-b); d=[3.^(c*3),3.^(-c*3);c.*3.^(c*3),-c.*3.^(-c*3)]; これで、dはaが1から2を0.1きざみで変化する時の行列のあたいを返してくれるとおもったのですが,ためしにa=1のときの値を計算してみたら最初の値と計算結果が違いました。 調べたのですがどのようにしたらよいかわからなかったので、質問させてください。

みんなの回答

回答No.2

>あまり(.)の記号の意味がよくわかっていません。ある変化する値に対して一つ一つ対応するよ。ということなのでしょうか? と言うより、ベクトル、ないしは行列の要素に対して指定した計算結果を返す、と言うことです。 例えば、 octave:1> a=2 a = 2 とした場合、 octave:2> a^2 ans = 4 octave:3> a.^2 ans = 4 と、要素数が一つしか無い場合、同じ計算結果を返しますね。 一方、aがベクトル、例えば octave:1> a=[2, 4] a =   2 4 だった場合、 octave:2> a^2 error: for A^b, A must be square error: evaluating binary operator `^' near line 2, column 2 とエラーを返しますが、 octave:2> a.^2 ans =   4 16 とドットをつけると「要素に対して」演算を実行してエラーにはなりません。 つまり、3行目までの計算を考えると、 octave:1> a=[1:0.1:2]; octave:2> b=1.2; octave:3> c=sqrt(a.^2-b) c =  Columns 1 through 3:   0.00000 + 0.44721i 0.10000 + 0.00000i 0.48990 + 0.00000i  Columns 4 through 6:   0.70000 + 0.00000i 0.87178 + 0.00000i 1.02470 + 0.00000i  Columns 7 through 9:   1.16619 + 0.00000i 1.30000 + 0.00000i 1.42829 + 0.00000i  Columns 10 and 11:   1.55242 + 0.00000i 1.67332 + 0.00000i となり、仮にa=1の計算を実行しても octave:1> a=1; octave:2> b=1.2; octave:3> c=sqrt(a.^2-b) c = 0.00000 + 0.44721i と先ほどの計算の最初の値と一致していますね。 問題は4行目なのです。 そもそもaがベクトルだった場合、cの計算で得られる値もベクトルですし、実数のベクトル乗、と言う行列になるんで、「少々異常な計算」になるのも当たり前ですよね。 aが普通の数値でしたら、得られる結果は単に数値なので「素直な行列」が得られる。 違って当たり前だと思いますよ。 MatlabやOctaveの場合、コードの作成中は行末のセミコロン(;)を外してみて計算過程を逐次確かめた方がいいと思います。 確かに、完成形でのソースでは全ての実行結果を表示させる必要性はむしろ無いのですが、ソースを作る段階では怪しい部分はセミコロンを外して返り値を調べてみてください。

dakadaka22
質問者

お礼

ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

>調べたのですがどのようにしたらよいかわからなかったので、質問させてください。 と言うより、何がしたいのか良く分かりません。 ベクトルの状態で一気に計算すると、計算結果は「0.1刻み」ではなくって、計算に用いた数値に何らかの計算を適用した結果が出るのは当然だ、と思えるんですが? 少々説明不足ですね。

dakadaka22
質問者

補足

dの行列の各成分が、aに(1を代入した値)、(1.1を代入した値)・・・ という11個の行列が計算されると思ったのですが、同じプログラムでa=1を代入した時を検算として計算してみたのですが、その結果がその前に出力された最初の値と一致しないということです。 あと、あまり(.)の記号の意味がよくわかっていません。ある変化する値に対して一つ一つ対応するよ。ということなのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 根号の中が負の時の計算機での正負判断は?

    コンピュータで数値計算(言語はFortranやC)をする時、次のような場合はどう扱われるのでしょうか。 例1.sqrt(-4)の解は±2iの二つあるが、コンピュータではどうなる? 例2.a>b>0の時、sqrt(b-a)の解の正負符号はどうなる。 最初の値の符号に合わせられると聞いたことがあるが、本当ですか。もしそうならsqrt(b-a)=+・・・ 、sqrt(-a+b)=-・・・ となるのでしょうか。

  • 4次方程式の解

    この度はよろしくお願いいたします。 題名のとおりで 次のサイト様 ttp://www.akamon-kai.co.jp/yomimono/kai/kai.html の計算方法(フェラーリの公式)を用いて4次方程式を 代数的に解こうとしたのですが初めてプログラムをしたに等しいので うまく解が出てきてくれません。 見にくいとは思いますがプログラムを以下に示しますので どこを直せばよいかの修正方法・もしくは他の方法がありましたらどうかよろしくお願いします。 use Math::Complex; # 定数の入力 print "aの値は?\n"; $a = <STDIN>; print "bの値は?\n"; $b = <STDIN>; print "cの値は?\n"; $c = <STDIN>; print "dの値は?\n"; $d = <STDIN>; print "eの値は?\n"; $e = <STDIN>; # ω・p1~p3の式 $j = (-1 + sqrt(-3))/2; $k = (-1 - sqrt(-3))/2; $f = -8*$a*$c+3*$b*$b; $g = -72*$a*$c*$e+27*$a*$d*$d+27*$b*$b*$e-9*$b*$c*$d+2*$c*$c*$c; $o = -256*$a*$a*$a*$e*$e*$e+192*$a*$a*$b*$d*$e*$e+128*$a*$a*$c*$c*$e*$e-144*$a*$a*$c*$d*$d*$e; $p = 27*$a*$a*$d*$d*$d*$d-144*$a*$b*$b*$c*$e*$e+6*$a*$b*$b*$d*$d*$e+80*$a*$b*$c*$c*$d*$e; $q = -18*$a*$b*$c*$d*$d*$d-16*$a*$c*$c*$c*$c*$e+4*$a*$c*$c*$c*$d*$d+27*$b*$b*$b*$b*$e*$e; $r = -18*$b*$b*$b*$c*$d*$e+4*$b*$b*$b*$d*$d*$d+4*$b*$b*$c*$c*$c*$e-$b*$b*$c*$c*$d*$d; $h = $o + $p + $q + $r; # xの3乗根を指数対数で表した式 $s = exp(log($g+3*sqrt(3*$h)/3)); $t = exp(log($g-3*sqrt(3*$h)/3)); # 解 $x1 = 1/(12*$a)*(-3*$b+sqrt(3*($f+2*$a*($s+$t)))+sqrt(3*($f+2*$a*($j*$s+$k*$t)))+sqrt(3*($f+2*$a*($k*$s+$j*$t)))); $x2 = 1/(12*$a)*(-3*$b+sqrt(3*($f+2*$a*($s+$t)))-sqrt(3*($f+2*$a*($j*$s+$k*$t)))-sqrt(3*($f+2*$a*($k*$s+$j*$t)))); $x3 = 1/(12*$a)*(-3*$b-sqrt(3*($f+2*$a*($s+$t)))+sqrt(3*($f+2*$a*($j*$s+$k*$t)))-sqrt(3*($f+2*$a*($k*$s+$j*$t)))); $x4 = 1/(12*$a)*(-3*$b-sqrt(3*($f+2*$a*($s+$t)))-sqrt(3*($f+2*$a*($j*$s+$k*$t)))+sqrt(3*($f+2*$a*($k*$s+$j*$t)))); # 解が成立する時の条件 if($s*$t == 4*(12*$a*$e-3*$b*$d+$c*$c) , sqrt(3*($f+2*$a*($s+$t)))*sqrt(3*($f+2*$a*($j*$s+$k*$t)))*sqrt(3*($f+2*$a*($k*$s+$j*$t))) == 27*(-8*$a*$a*$d+4*$a*$b*$c-$b*$b*$b )){ print $x1 , "\n"; print $x2 , "\n"; print $x3 , "\n"; print $x4 , "\n"; } else{break;}

  • 行列式の問題

    Aはn次正則行列であり、detA=Dである。 n次正方行列Bは実数cを用いて B=-c(A-1) と表すことができる。 n=5, c=3, D=27であるとき、detBの値を求める *(A-1)はAの逆行列という意味で考えて下さい 上手な書き方がわからなかったので… detA=27とした場合Aの逆行列の値がどうなるのかがわかりません どなたかわかる方いましたらご教授お願いします。

  • cのプログラミングで虚数を含む行列の計算の考え方がわかりません

    cのプログラミングで行列の積を計算するものまではできたのですが、その行列の中に虚数を含むものの考え方がよくわかりません。 たとえば  ia b  c id    (a,b,c,dが実数、iが虚数) というような行列があるときこれと同じものの積を何回かするプログラムを作るとき、虚数をどのような対処をすればいいのでしょうか? よろしくお願いします。

  • 行列の値

    A=(0 1) B=(1 2) ( 1 0)、 (3 4)の時、(A^(t)・B^(-1))^(-1)を求めよ。という問題なのですが、 途中、Bがそのままの値で計算する理由はわかるのですが、Aの行列の値が変化していない理由がまったく理解できません。 どうやっても(0 -1)となってしまいます。 (-1 0) どうして行列の値が変化しないのでしょうか?

  • 行列の証明問題です。

    大学受験問題の参考書にのっているのですが、わかりません。よろしくお願いします。 この問題は、行列なので、行列の中は、(a,b,c,d)=(左上、右上、左下、右下)というように書かせてもらいます。 問題は、 2x2行列A=(a,b,c,d)に対し、Δ(A)=ad-bcとする。このとき、次の等式を証明せよ。 Aが逆行列をもつとき、Δ(A^-1)=Δ(A)^-1 私は実際に計算し、等号で結ぼうと思いました。 私の計算結果は次の通りです。 A^-1=1/(ad-bc)(d,-b,-c,a)より Δ(A^-1)=(1/(ad-bc))*(ad-bc)=1・・・I Δ(A)^-1=(ad-bc)^-1=1/(ad-bc) ですが、上記のように、答えがありません。 解答はこのように具体的には計算しない解法なのですが、 私のように実際に計算しても答えは合うはずですよね? でもどこが間違っているのかわかりません。 どなたかご存知の方、アドバイスをいただけませんか。 よろしくお願いいたします。

  • 平面の式と逆行列

    3点(0,2,2) (-2,0,0) (0,-2,-2次に)通る平面を求めました。 平面の式 ax+by+cz=0 にそれぞれ代入しa,b,c,dの連立方程式として求め、 2b+2c+d=0 -2a+d=0 -2b-2c+d=0 答えy-z=0 を得ました。次に、簡単化のため逆行列でa,b,cをdの式で求めようとしたところ、なんと行列式がゼロとなり求められません。 なぜ?直線上にない3点が定まれば平面が一意に定まり、当然逆行列も存在すると思ってましたが、違うのですか?また、この場合どうやって求めたらいいでしょうか?もちろんて計算ではなく自動計算化を考えてのことです。

  • 行列式の計算

       |C| [A B]| | という行列式はどのように計算すればよいのでしょうか。    |D| また、[A B][C D]はどのように計算すればよいのでしょうか。 すみませんが、お願いしますm(__)m

  • (4×4)行列の逆行列の求め方について

    以下の問題がわかりません。 どなたか簡単な解き方がわかる方いらっしゃいませんでしょうか。 下の行列について、逆行列を求めなさい。 (4×4)行列で要素は以下。 a -b -c -d b a -d c c d a -b d -c b a 答えは、 1/(a^2+b^2+c^2+d^2)*(以下の要素の行列) a b c d -b a d -c -c -d a b -d c -b a 余因子行列を使って一つ一つの要素を16回計算すれば出るのですが、 時間がかかりすぎてしまいます。 何か良いやり方はないでしょうか。

  • python numpyで行列作成

    numpyを使って行列計算を行おうとしていますが、肝心の行列作成でつまづいています。 下記のような書き方はできないんでしょうか? A = numpy.array([a, b, c], [b, c, d], [c, d, e]) (a~eは実数型の変数、3x3の行列を作りたい) web上で探した結果、数値は全てリテラルになってるようですが、 変数を使った初期化は無理ですか?