• 締切済み

FORTRANのプログラムについて

program dat real x(100), y(100) s2=0 read(*,*) m,h open(7,file='test2.txt') do i=1,m read(7,*,end=200) x(i),y(i) s1=h/2*(y(1)+y(m)) s2=s2+h*(y(i)) s3=h*y(1) end do 200 close(7) sum=s1+s2-s3 write(*,*) 'sum=',sum end 台形公式を求めるプログラムを書いています。 テキスト形式でまずデータを取り込みます。 刻み幅はhです。ただしデータ数は未知数です。 上のようにプログラムを書いたのですが、うまく働きません。どうすればよろしいでしょうか? ご教授お願いします

みんなの回答

  • KanjistX
  • ベストアンサー率55% (48/86)
回答No.2

補足ありがとうございます。 どのような意図でs1とs3を別々に置いたのかよくわからなかったので、一部改変したものを示します。 ・s1=h/2*(y(1)+y(m))をs1=h/2*(y(1)+y(i))に変更 ・s3=h*y(1)の行を削除 ・sum=s1+s2-s3をsum=s2-s1に変更 台形公式 Σ{i=1,n-1}{h/2*(y(i)+y(i+1))} =Σ{i=1,n}{h*y(i)} - h/2*(y(1)+y(n)) という式変形をもとに組み替えました。

  • KanjistX
  • ベストアンサー率55% (48/86)
回答No.1

「うまく働きません」の内容を教えていただけますでしょうか。 コンパイル・実行は確認しました。 計算結果が合わないというご質問でよろしいでしょうか。 たぶんですが、do文のi=1,mはi=1,m-1にすべきだと思います。 展開すればわかりますが、お示しのプログラムでは、h*y(m)だけ余計に加えています。

merco222222
質問者

補足

御回答ありがとうございました。 失礼しました。 コンパイルは通るみたいですが、計算結果があいません。 よろしくお願いいたします

関連するQ&A

  • FORTRANのプログラム

    今、実験の解析を行っています。 読み込みたいテキストファイルには -1,0.4 0,0,233 -1,0.9 ・・など左側には-1か0のどちらかがあります。 これを -1,0.4 -1,0.9 を含むファイルと 0,0.0233 を含むファイルの二つに分けたいのです。 今プログラムを作っているのですがどうしてもできません。 どうしたらいいのでしょうか? program dat real x(10), y(10) open(7,file='test.txt') do i=1,10 read(7,*,end=200) x(i),y(i) end do do j=1,10 if(x(j).eq.0.0) then open(8,file='aftest1.txt') write(8,*) y(j) else open(9,file='aftest2.txt') write(9,*) y(j) end do close(8) close(9) 200 close(7) end

  • Fortran90のプログラムについて

    大学で卒論のためにFortran90でランダムウォークのプログラムを作ってるんですが…2週間悩んでるんですが、できないところがあります。 「1次元のランダムウォークにおいて、ステップ数Nとxの値を与えたときのすべての可能な歩行を数え上げるプログラムを書け」というものです。 直接ステップ数を書き込んだプログラムを基にして任意のステップ数を入力するプログラムを作ってみたんですが、うまくいきません。 integer :: a(100,20), x, i1, i2, i3 x = 0 do i1 = -1, 1, 2;do i2 = -1, 1, 2;do i3 = -1, 1, 2 x = x + 1 a(x, 1) = i1;a(x, 2) = i2;a(x, 3) = i3 end do;end do;end do end が基にしたプログラムです。これはステップ数が'3'なので実行結果は「-1-1-1,-1-11,-11-1,-11-1,-111,1-1-1,11-1,111」というxの変位の仕方が出ます。 integer, allocatable :: a(:,:) integer :: i, n, x, l print *, 'ステップ数を入力:'; read *, n allocate(a(n, 2**n)) do l = 1, n do i = -1, 1, 2 x = x + 1 a(x, l) = i end do end do end という風に作ってみたんですが、'3'を入力しても同じ結果が出ません。わかりにくい文章で申し訳ないですがどなたかご教授お願いします。

  • FORTRAN→Cに翻訳

     どなたか、次のFORTRANのプログラムを、Cに、翻訳して頂けないでしょうか。C++ではなく、Cです。ANSI準拠のCでお願いします。  プログラムの内容は、最小二乗法による計算プログラムです。MS-DOS Ver3.3~6.0の頃の、MS FORTRANコンパイラ仕様のものです。その頃持っていたFORTRANの本も処分してしまい、今からFORTRANを学びなおすのにも多大な労力と時間がかかりそうなので、Cに翻訳して頂ければ大変ありがたいです。よろしくお願いします。 (“□”はタブ) ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆ C□LEAST SQUARE APPROXIMATION □PROGRAM MAIN9 □DIMENSION X(100),Y(100),S(0:18),T(0:9),SM(10,10),TV(10),AV(10) □WRITE(*,*) 'N ?' □READ(*,*) N □WRITE(*,*) 'x1,x2,..,xn ?' □READ(*,*) ( X(I),I=1,N ) □WRITE(*,*) 'y1,y2,..,yn ?' □READ(*,*) ( Y(I),I=1,N ) □WRITE(*,*) 'M ?' □READ(*,*) M □DO 110 K=0,M*2 □□VS=0. □□DO 100 I=1,N □100□VS=VS+X(I)**K □□S(K)=VS □110□CONTINUE □□DO 130 K=0,M □□□VS=0. □□□DO 120 I=1,N □120□VS=VS+Y(I)*X(I)**K □□□T(K)=VS □130 CONTINUE □□DO 140 I=1,M+1 □□□DO 140 J=1,M+1 □□□□K=I+J-2 □□□□SM(I,J)=S(K) □140 CONTINUE □□DO 150 I=1,M+1 □150 TV(I)=T(I-1) □□CALL SIMULE( AV, SM, TV, M+1 ) □□DO 160 I=1,M+1 □160 WRITE(*,1000) I-1,AV(I) □1000 FORMAT(1H ,'A',I1,'=',F10.5) □□STOP □□END ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆

  • FORTRANのプログラミングについて

    たびたび申し訳ありません。 またFORTRANに関しての質問です。 x y z 0 0 30 1 0 45 2 0 60 3 0 43 4 0 51 5 0 32 0 1 43 1 1 90 2 1 32 3 1 85 4 1 65 5 1 90 0 2 32 1 2 32 と続くファイルがあります。これをFORTRANをで書き換えて、 0 0 30 0 1 43 0 2 32 1 0 45 1 1 90 1 2 32 と続くデータにしたいのです。(これを以下目的のファイルという) 今のところ、次のようなプログラムを書き、特定のXに対しては、結果を吐き出すことに成功しています。 program dat real x1(100),h,y2(100),y1(100),z1(100) integer i,n,j,k,l,m,a(100) open(7,file='test.txt') open(9,file='af-test.dat') do i=1,100 read(7,*,end=200) x1(i),y1(i),z1(i) if(x1(i).eq.90)then write(9,*) x1(i),y1(i),z1(i) end if end do 200 close(7) close(9) end ここまではうまくいくのですが、これでは90以外の場合は出力されません。(あたりまえですが) 特定のXに限らずに例えばXを0から100まで吐き出されるような目的のファイル作るにはをどのようにしてプログラムを書けばいいかご教授ください。

  • fortran 途中まで考えたのですが。。。。

    エラトステネスのふるい(素数の倍数を除いていって残ったのが素数)で3桁の素数を求めて表示したいです。 私が考えたのは、 1・2~99までの数を素数かどうか調べて、素数を配列に入れていく 2・100~999まで素数の配列の中の数で割って、割り切れたらおしまい。割り切れなかったら表示していく ということです。 しかし下のプログラムではうまく素数配列ができていないようなのです。 ここまでかなり時間がかかったのでこのプログラムに手をいれて これ以外におかしくなるところもどこを直せばいいのか教えてくださるとうれしいです。 C C q223.f C PROGRAM q223 C IMPLICIT NONE C INTEGER N,i,K,s,l REAL a(99),b(99),c(99),X,Y C real M C a(1)=2 a(2)=3 l=2 C DO N=2,99,1 M=N**(0.5) S=M DO i=2,S,1 K=MOD(N,i) IF(K ==0)THEN exit ELSE IF(K /=0)THEN l=l+1 a(l)=N ENDIF ENDDO ENDDO C do N=100,999 do l=1,99 X=a(l) Y=N/X if(Y==0)then exit else if(Y/=0)then write(*,*)N end if end do end do c end よろしくおねがいします

  • fortranのプログラム

    fortranのプログラム 現在、fortranの勉強をしております。 そこで、質問があるのですが、 ある関数f(x,y,z)の座標(x,y,z)の値がデータとして与えられているとき、 S=10+f をfortranで計算したいと考えております。 ただ、関数fは複数(f1、f2、f3)あり、次々とfに代入してSを計算したいのですが、どのようにプログラムしたらいいか思いつきません。 どなたか、ヒントだけでもいいので、教えてください。 ちなみに、私が考えたプログラムは(下のプログラムはポイントだけ書いてあります。endやその他関係ないと思われるところは省いております。) do 100 k=1,3 S=S+fk(x,y,z) continue function f1 f1(s,t,u)=・・・ return end f2(s,t,u)=・・・ return end 使用しているバージョンは、fortran77(本当は90を使っているのですが、77だけで書いています)です。

  • FORTRANの質問です

    今、実験の解析を行っています。 読み込みたいテキストファイルには -1,0.4 0,0,233 -1,0.9 ・・など左側には-1か0のどちらかがあります。 これを -1,0.4 -1,0.9 を含むファイルと 0,0.0233 を含むファイルの二つに分けたいのです。 今プログラムを作っているのですがどうしてもできません。 どうしたらいいのでしょうか? と質問しました。説明不足気味だったので、追加で説明させていただきます。 データの数はかわります。5個だったり、900個だったりします。 この数はわかりません。 program dat real n(10), y(10) write(*,*)'k=' read(*,*)k open(7,file='test.txt') do i=1,k read(7,*,end=200) n(i),y(i) end do 200 close(7) open(8,file='aftest1.txt') open(9,file='aftest2.txt') do j=1,k if(n(j).eq.0) then write(8,*) y(j) else if(n(j).eq.-1) then write(9,*) y(j) end if end do close(8) close(9) end と書いたのですがデータの数と繰り返しの数が一致しないと、出力されません。 いちいちファイルをみるのは面倒なので、なんとか したいのですが

  • Fortran90のプログラミング

    DO型出力を用いて画像のようなダイアモンドを表示させたいです。 自分でプログラム作ったのですが全然わからないので教えてください。 「作成したやつ」 integer :: x,y do x = 1 , 7 y = 2 * x - 1 print "(13a1)" , ("*" , i = 1 , y) end do do x = 6, 1, -1 y = 2 * x - 1 print "(13a1)" , ("*" , i = 1 , y) end do end (画像が反転してます・・・縦に長いダイアモンドを表示させたいです)

  • fortran エラーについて

    fortranで、副プログラムを使ってデータを昇順または降順に並べ替えるプログラムを入力して実行しようとしたところ、 ・Unexpected junk in formal argument list at (1) ・Two main PROGRAMs at (1) and (2) という2つのエラーが出ました。 これらの改善方法を教えて頂きたいです。 初心者ですので簡単なところで間違えている可能性もありますが、ご指摘いただければ幸いです。 以下、実際に入力したプログラムです。 ------------------------------ implicit none integer::i,n real::x(1000),a(1000),b(1000) n=1000 open(10,file='input-data-1.txt') do i=1,n read(10,*) x(i) end do close(10) open(10,file='output-data-1.txt') do i=1,n call koukan(i,x(i),a(i),b(i)) write(10,'(i4,2f10.3)') i,a(i),b(i) end do close(10) stop end subroutine koukan(i,x(i),shoujun,koujun) implicit none integer::i,n,made real::x(1000),w,shoujun,koujun do made=n-1,1,-1 do i=1,made if(x(i)>x(i+1)) then w=x(i) x(i)=x(i+1) x(i+1)=w end if end do end do shoujun=x(i) do made=n-1,1,-1 do i=1,made if(x(i)<x(i+1)) then w=x(i) x(i)=x(i+1) x(i+1)=w end if end do end do koujun=x(i) return end ------------------------------

  • プログラミング Fortran

    以下のプログラムの空白部分が分かる方、是非力を貸して下さい!!(> <) 次の数列ai=1,…,N(1≦N≦100)                  ai=1, ai+1=2ai-3 に対して               S=Σai(※Σの上はN、下はi=1) を計算・表示するプログラムは以下のようになる。ここでは整数Nは端末から入力する。 common num,a(100),sum read(5,*) num call [ ] call pqrstu write(6,*) ‘a=’,(a(i),i=1,num) write(6,*) ‘sum=’,sum end * subroutine abcdef common num,a(100) a(1)=[ ] do 20 i=1,num a(i+1)=a(i)*2.0-3.0 20 continue end * subroutine pqrstu common [ ] sum=[ ] do 20 i=1,num sum=[ ] 20 continue end よろしくお願いします!!

専門家に質問してみよう