生成された上三角行列のプログラムと実行結果の納得性について

このQ&Aのポイント
  • 以下のプログラムは上三角行列を設定する正しく実行されるものではありません。
  • プログラムにおいて、要素としての一様乱数の生成は正しく行われていますが、上三角行列を設定する部分での処理に問題があります。
  • 具体的には、a(j+1:n,j) = 0.0d0 という部分で全てのjにおいて同じ値が代入されてしまっているため、実行結果が納得のいくものになっていません。
回答を見る
  • ベストアンサー

fortran 上三角行列

一様乱数を要素とする上三角行列を設定するプログラミングを行ったのですが以下のプログラムで call random_number(a(1 : j , j)) a(j+1 : n , j ) = 0.0d0 の部分を理解した上で実行したのですが、実行結果がそれぞれの列に同じ一様乱数が表示されました。プログラム内容と実行結果が納得のいく物ではないのですが、果たして以下のプログラムは上三角行列を設定する正しく実行される物となっているのでしょうか?教えて下さい。よろしくお願いします。 program list2_8 implicit none real(8), allocatable :: a(:,:) integer n, i, j write(*,'(a)', advance ='no') ' input n (1<=n<=100) :' read(*,*) n if (n < 1 .or. 100 < n) stop 'stop, n is invalid' allocate (a(n,n)) call random_seed do j = 1, n call random_number(a(1:j,j)) a(j+1:n,j) =0.0d0 enddo do i = 1, n write(*,'(100e12.4)') a(1, 1:n) enddo end program list2_8

noname#96313
noname#96313

質問者が選んだベストアンサー

  • ベストアンサー
  • f272
  • ベストアンサー率46% (8016/17133)
回答No.1

明らかにこれはおかしいよね。 write(*,'(100e12.4)') a(1, 1:n) 正しくはこれ。 write(*,'(100e12.4)') a(i, 1:n)

noname#96313
質問者

お礼

ありがとうございました。全く気づきませんでした。ご指摘ありがとうございました。助かりました。

関連するQ&A

  • fortranを用いた行列の掛け算について

    行列の掛け算についてなのですが、ある行列aを2乗した行列bを求める場合は以下のようなプログラムを書けば出来たのですが、これを3乗以上に拡張するためにはどうしたらよいのでしょうか? ______do i=1,3 ________do j=1,3 __________b(i,j)=0.D0 ____________do k=1,3 ______________b(i,j)=b(i,j)+a(i,k)*a(k,j) ____________enddo ________enddo ______enddo

  • fortran 行列ベクトル積

    行列ベクトル積を計算するプログラムを下のように書いたのですが、実行した結果の答えが実際計算した答えと異なります。初期の要素の設定がおかしいのでしょうか?教えて下さい。よろしくお願いします。 program list2_14 implicit none integer , parameter :: n = 2 real(8) a(n,n), x(n), y(n) integer i, j, k, l a(1,1:2) = (/1.2d0,3.4d0/) a(2,1:2) = (/5.6d0,7.8d0/) x(:) = (/9.0d0,10.0d0/) do i = 1, n y(i) = 0.0d0 do j = 1, n y(i) = y(i) + a(i,j) * x(j) enddo enddo do k = 1, n write(*,*) (a(k,l), l = 1, n) enddo write(*,*) x(:) write(*,*) y(n) end program list2_14 実行結果 1.2 3.4 5.6 7.8 9. 10. 128.4

  • fortran 3次元座標

    四面体の4頂点の3次元座標を設定するプログラムを例にならって以下のように書いたのですが、doループの内容がいまいちよくわかりません。p(1:3,m),p(1:3,n)が表されている値は理解できるのですが、出力されたファイルの内容が2行3列の答えが6つあって、なぜそのように答えが出てくるのかがわかりません。教えて下さい。よろしくお願いします。 rogram list2_11 implicit none integer :: m, n, fno = 10 real(8) p(3,4) call random_seed call random_number(p(1:3,1:4)) open(fno, file = 'tetra.d') do m = 1, 3 do n = m+1, 4 write(fno,*) p(1:3,m) write(fno,*) p(1:3,n) write(fno,*) '' enddo enddo close(fno) end program list2_11

  • fortran モンテカルロ法

    モンテカルロ法により円周率πを計算するプログラムを作ったのですが、以下のプログラムでモンテカルロ法から推定された円周率piの値が実行すると大きな数字になってしまって、うまく計算できてない見たです。式に問題があるのでしょうか?教えて下さい。 rogram list1_9 implicit none real(8) x, y, pi, pi0 integer :: n, i, im = 2**20 pi0 = 2.0d0*acos(0.0d0) n = 0 do i = i, im call random_number(x) call random_number(y) if(x ** 2 + y ** 2 <= 1.0d0) n = n + 1 enddo pi = 4.0d0*dble(n)/dble(im) write(*,*) ' pi, pi0, er = ', pi, pi0, pi-pi0 end program list1_9

  • fortran 実行結果がうまく表示されない

    グローバルモジュールを用いてプログラムを書いたのですが実行結果が表示されません、プログラム中に問題があるのでしょうか?教えて下さい。 module params implicit none integer :: n = 2 end module params module sample implicit none contains subroutine swapvec3(x,y) use params real(8), intent(inout) :: x(n), y(n) real(8) tmp(n) tmp(1:n) = x(1:n) x(1:n) = y(1:n) y(1:n) = tmp(1:n) end subroutine swapvec3 end module sample program main use sample implicit none real(8), allocatable :: a(:), b(:), tmp(:) integer n allocate(a(n),b(n),tmp(n)) call swapvec3(a,b) call random_seed call random_number(a) call random_number(b) call random_number(tmp) write(*,*) ' a = ', a(1:n) write(*,*) ' b = ', b(1:n) write(*,*) ' tmp = ', tmp(1:n) end program main 実行結果  a = b = tmp =

  • 上三角行列

    上三角行列の定義は「左下部分は0である行列」と教科書にのっていますが、対角成分と右上の部分に対して、0に関する制限はありますか?例えば、n次の正方行列Aは上三角行列である。このとき、「Aの右上部分と対角成分はすべて0ではない」とは言えますか?

  • 上三角行列同士をかけたときの積も上三角行列となることを示すには?

    正方行列AとBがともに上三角行列であるとき、積ABもまた上三角行列となることを示せ。 という問題がわかりません。 自分で解こうとしましたが、以下のような状態で、証明できていません(^_^;) 行列式|A|はAの対角成分を掛け合わせたもの。同様に行列式|B|はBの対角成分を掛け合わせたものになっている。また、|AB|=|A||B|より、積ABの行列式はAとBの全ての対角成分を掛け合わせたものとなる。よって、|AB|はAとBの対角成分のみから構成されているので、積ABもまた上三角行列である???

  • (1)2つの上三角行列A、Bの積ABは上三角行列になることを証明せよ。

    (1)2つの上三角行列A、Bの積ABは上三角行列になることを証明せよ。 (2)2つの上三角行列A、Bの積ABの行列式|AB|は|A||B|に等しいことを証明せよ。 明日提出の宿題で困ってるので教えてもらえませんか?

  • 行列の上三角化

    次の行列の固有値は全て実数であることを確かめ、直行行列をつかって上三角化せよという問題があります 行列は 1 2 0 0 2 0 -2 4 -1 の3×3行列です とりあえず、これをAとおき、|tE-A|を求めたところ、 t=1,-1,2となりました t=1,2の場合はtE-Aに代入し、固有ベクトルはそれぞれc[-1 0 1]とc[1 2 0]と求めることができました ところがt=-1のとき、簡約化した行列が 1 0 0 0 1 0 0 0 0 となってこの場合どう固有ベクトルを求めればいいのかが分かりません 以下の画像は私がt=-1をtE-Aに代入し簡約化する様子です 固有ベクトルは3つないと直行化して三角化できませんよね? だから3つ固有ベクトルが必要なはずなんですけどどこをどう間違えているのか教えてほしいです (簡約化なのかその先なのか)

  • fortran 配列受け渡し時の次元の一致

    fortran90、コンパイラはifortです。 普通メインプログラムとサブルーチン間での配列の受け渡しは、次元を揃えて渡すと思います。 とあるコード(以後コードA)を読んでいると、2次元配列を渡し、1次元配列で受け取っていました。 例 program test1 integer :: a(3,3) call testsub(a) end program subroutine testsub(b) integer :: b(9) end subroutine これが受け取り側でどう処理されているのかわからず、調べるために適当なテストコードを書きました。 a 123 456 789 ↓ b 123456789 になるとか 結果、コンパイルは通ったのですがサブルーチン側では全て0で置き換えられてしまいました。 コードAはpgiかなんかでコンパイルしていたようなのでコンパイラの違いでしょうか? よくわらなかったので質問させて頂きました。 質問をまとめますと、 (1)次元の異なる配列の受け渡しができるかどうか (2)その場合中身はどうなるか よろしくお願いします。 ---以下テストコード--- program testa implicit none integer :: a(3,3),i,j do i=1,3 do j=1,3 a(i,j)=j+(i-1)*3 enddo enddo do i=1,3 do j=1,3 write(6,*) a(i,j) enddo enddo call sub1(a) end program subroutine sub1(b) integer :: b(9),i do j=1,9 write(6,*) b(i),'sub' enddo end subroutine

専門家に質問してみよう