自宅ではコンパイルできないので、プログラムが動くか教えてほしいです

このQ&Aのポイント
  • 自宅のパソコンではコンパイルできないため、プログラムが動作するか確認したいです。
  • 問題として、dx/dt = 1 + x^2, 初期条件x=0, t=0を0 < t < 1.5まで10等分で解きたいです。
  • オイラー法、2次ルンゲクッタ法、4次ルンゲクッタ法を使用して解く方法を試しましたが、正しい結果が得られませんでした。さらに、2階常微分でのルンゲクッタ法についても理解できていません。
回答を見る
  • ベストアンサー

fortran77 自宅ではコンパイルできないので

課題が出ているのですが、 自宅のパソコンではコンパイルできないので、 このプログラムで動くか教えてほしいです dx/dt=1+x^2 初期条件x=0,t=0 を0<t<1.5まで 10等分で解く オイラー法 f(x,t)=1+x**2 x=0,t=0 a=1.5 b=10 h=a/b do i=0,a,h x=x+f(x,t)*h write(*,*) x,t end do 2次ルンゲクッタ法 do i=0,a,h x=x+h{(1-m)*f(x,t)+mf(x+h/(2m),t++h/(2m)*f(x,y))} write(*,*)x,t end do 4次ルンゲクッタ法 do i=0, a,h k1=h*f(x,t) k2=h*f(x+h/2,t+k1/2) k3=h*f(x+h/2,t+k2/2) k4=h*f(x+h/2,t+k3/2) x=x+(k1+2*k2+2*k3+k4)/6 write(*,*) x,t end do これでx(t)=tantであることが求められるでしょうか?? 間違っている箇所を指摘していただけると嬉しいです。 あと2階常微分でのルンゲクッタ法というのが全く理解できません。 どなたか詳しく教えてください。 お願いします。

noname#150296
noname#150296

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

  • ベストアンサー
noname#129118
noname#129118
回答No.1

Vectorに無料コンパイラがありませんか。なければ、basicインタープリタでもOKですから、実行してみると良いのですが、、、 (fortranとbasicは言語仕様が似ているので便利かと思います) ●doループは整数刻みで、期待する値とは異なるはず…即ちバグ ●その他は文法エラーはなさそうです

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

そりゃぁもともと BASIC は「TSS で動いていた FORTRAN の簡略版」ではあるけど, さすがに今「fortranとbasicは言語仕様が似ているので便利かと思います」はないと思うよ>#1. フリーなコンパイラだって, GCC を含めいくつか存在するんだし. とりあえず「間違っている箇所を指摘していただけると嬉しいです」というなら完全なプログラムを出してほしい. まさか, これを「FORTRAN のプログラム」というつもりはないよね? あと, 最後の「2階常微分でのルンゲクッタ法」は基本的に「高階常微分方程式は連立 1階常微分方程式に直せる」ことを使っただけ. もちろん式の形によっては (ちょっとだけ) 精度がいい形にもなるけど.

noname#150296
質問者

お礼

ありがとうございます

関連するQ&A

  • Fortranの問題3問目です。急いでます><

    以下のプログラムを実行すると結果がNAN(数値エラー)となり、表示されない。 これは、ガウスの消去法における、ある問題に起因する。 正しい結果がでるようにするには、どうしたらよいか? 答えが正しく表示されない原因を究明し、正しい結果を表示する、 修正済みソースコードを提出しなさい。 ヒント: 一般に、どのような行列でも計算できるプログラムにするためには、 「ピボット」と呼ばれる操作を行う必要があるが、 今回は、ピボットをあらかじめ人間が行うことで回避してよい. プログラムの処理内容(アルゴリズム)を修正する必要はない。 program gauss implicit none c aは係数行列(4x3)、xは解、w は一時変数 double precision a(5,4),x(4),w integer i,j,k c キーボードから読み込む場合 write(6,*) 'input a(5,4)' c read(5,*) a c data文で一括初期化(代入)する方法 data a / & 0d0, 3d0, 7d0, 2d0, 65d0, & 2d0, 8d0, 5d0, 1d0, 65.4d0, & 5d0, 3d0,-5d0, 2d0, 3.8d0, & -2d0, 4d0, 0d0, -6d0, -35.6d0 & / write(6,*) 'データの確認表示' write(6,'(f8.2,f8.2,f8.2,f8.2,f8.2)') a c 前進消去 do k=1,3 do j=k+1,4 w = -a(k,j)/a(k,k) write(6,*) w,'*行',k,'を、行',j,'に足すと' do i=1,5 a(i,j) = a(i,j) + w*a(i,k) end do write(6,'(f8.2,f8.2,f8.2,f8.2,f8.2)') a write(6,*) '' end do end do write(6,*) '前進消去 終了' write(6,'(f8.2,f8.2,f8.2,f8.2,f8.2)') a c 後退代入 do k=4,1,-1 x(k) = a(5,k) do i=k+1,4 c 注:k=3のとき, do i=4,3 となるためループ内は1回も実行しない c k=2のとき, do i=3,3 となり、ループ内はi=3 で1回だけ実行 x(k) = x(k) - a(i,k)*x(i) end do x(k) = x(k) / a(k,k) end do c 解を表示 write(6,*) 'x = ',x stop end

  • 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 初心者です

    以下の連立一次方程式をSOR法で解く問題です。 初心者なりにガウスザイデル法を応用してプログラムしたつもりですが、やはり難しいです(答えは違います)。 どこをどうすれば良いのか分かりませんので、よろしければヒントや助言をいただきたいです。 PROGRAM SOR REAL A(10,10),B(10),X(10),X0(10) INTEGER N,I,J,K,Kmax,w N=3 A(1,1)=4 ;A(1,2)=1 ;A(1,3)=2 A(2,1)=1 ;A(2,2)=3 ;A(2,3)=1 A(3,1)=1 ;A(3,2)=2 ;A(3,3)=5 B(1)=16 B(2)=10 B(3)=12 X0(1)=1 ;X0(2)=1 ;X0(3)=2 w=1.2 Kmax=50 EPS=1.D-5 DO I=1,N D=A(I,I) S=B(I) B(I)=B(I)/D END DO DO K=1,Kmax DO I=1,N DO J=1,N if(J<I) X0(J)=X(J) S=S-A(I,J)*X0(J) END DO X(I)=(1-w)*X(I)+w*S END DO DO I=1,N S=S-(X(I)-X0(I))**2 END DO IF(S<EPS) GOTO 10 DO I=1,N X0(I)=X(I) END DO END DO 10 WRITE(*,*) K DO I=1,N WRITE(*,*) 'SOR法で求めた解は' WRITE(*,*) 'X(',I,')=',X(I) END DO END PROGRAM SOR !------------------------------------ ※wは緩和係数です

  • fortran77

    オイラー法とルンゲ・クッタ法 のプログラムを作るにあたっての質問です。 ネットで調べたら do i=0,N-1 x=x+h*f(x,y) t=t+h というのがでてきたのですが、 do文の中にiと言うものは一回も出てきていません。 どうしてこのようなものでまわるのでしょうか??? 初心者なので、わかりやすくお願いします。

  • fortran おそらく二重解法のエラー

    以下のようなプログラム(速度ベレル法による時間発展)を書いたのですが,エラーがでてしまいます. どこが悪いのかを教えていただけたらと思います. PROGRAM verlet implicit none integer::i,n,p real(8)::dt,k,m,ratio,ti real(8),allocatable::x(:),v(:),f(:) allocate(x(0:n)) allocate(v(0:n)) allocate(f(0:n)) dt=0.01d0 n=1000 k=1.0d0 m=1.0d0 ratio=k/m p=4 ti=0.0d0 x(0)=0.0d0 v(0)=1.0d0 f(0)=-k*(x(0))**(p-1) do i=0,45 x(i+1)=x(i)+dt*v(i)+f(i)/(2.0d0*m)*dt**2.0d0 f(i+1)=-k*(x(i+1))**(p-1) v(i+1)=v(i)+dt*(f(i)+f(i+1))/(2.0d0*m) end do do i=0,n ti=i*dt write(6,*) ti,x(i),v(i) end do deallocate(x) deallocate(v) deallocate(f) END PROGRAM verlet

  • fortran

    do I = 1,40 do F = 1,4 do L = 1,100 if (I == 1. .OR. L == 1.) then A (I,F,L) = 3. else A (I,F,L) = 3.* B (I-1,F,L) end if end do end do do F = 1,4 do L = 1,100 do M = 1,100 B (I,F,L) = B (I,F,L) + C (I,F,M,L) end do end do end do end do 簡素化したプログラムなので、わかりにくいと思うのですが、後で計算するB(I,F,L)をA(I,F,L)のDOループに最初に持ってくると、I=1orL=1のときは正しい計算をしてくれるのですが、そのほかのときはB(I-1,F,L)に値が入らないのです。ちなみにC(I,F,M,L)はA(I,F,L)のループの後に計算しましたが、省略しました。 ご回答よろしくお願いします。

  • 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 errorについて

    fortranを勉強していたのですがエラーがでてしまい、何時間かけても理解できなかったので質問させてください。 以下プログラム program test !ここからメインルーチン !前準備 配列の用意 implicit none integer N integer,dimension(0:N,0:N) :: A integer :: i,j,k read * ,N !初期状態の代入 do i=0,N do j=0,N A(i,j)=0 end do end do do i=N/2,N-1 A(N/2,i)=1 end do do i=N/2,N-1 A(N/2+1,i)=-1 end do !ループ 50回ループさせる do k=0,50 !状態の表示 call visualize !サブルーチン visualize subroutine visualize do i=0,N do j=0,N if(A(i,j)== 1) write(*,'(A1)',advance='NO') "*" if(A(i,j)== 0) write(*,'(A1)',advance='NO') " " if(A(i,j)==-1) write(*,'(A1)',advance='NO') "+" end do write(*,*) end do !end subroutine visualize call insert !サブルーチン insert subroutine insert do i=0,N do j=0,N if(A(i,j)== 1) A(i,j)=-1 if(A(i,j)== 0) A(i,j)=max(0,A(i-1,j),A(i,j-1),A(i,j+1),A(i+1,j)) if(A(i,j)==-1) A(i,j)=0 end do end do !end subroutine insert end do end program test これでコンパイラすると In file test.f90:48 subroutine visualize 1 Error: Unclassifiable statement at (1) In file test.f90:69 subroutine insert 1 Error: Unclassifiable statement at (1) とでます いろいろ調べたのですが全くわかりませんでした できればよろしくお願いします

  • 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です。ただしデータ数は未知数です。 上のようにプログラムを書いたのですが、うまく働きません。どうすればよろしいでしょうか? ご教授お願いします

  • FORTRANをご存じの方がいらっしゃいましたら、間違いを指摘していただきたいです。

    大学で現在FORTRANのシンプソン公式の課題が出ています。 自分で考えて下記プログラムを作ったのですが、どうしても 正しい答えが出力されません。 正しい答えとしては、分割数4とか5とかで πに限りなく近い値になるそうです。 (下に添付した物は、分割数を4にしています。) もしFORTRANをご存じの方がいらっしゃいましたら どこがどのように間違っているのか、ご指摘いただけないでしょうか? よろしくお願いいたします。 問題 4/(1+x^2)を、積分範囲:0~1 を、シンプソン公式を使って求めよ。 区間分割数については、各自適当に与え 分割数が多くなると精度が良くなる事を確認せよ。 シンプソン公式を使うと台形公式を使う場合より 少ない分割数で解(=π)に近づくか確認せよ。 ***ここから*** c numerical value integral c trapezoid formula c *** main program *** real a,b parameter (n=4) a=0 b=1 call simpson(a,b,n,sumf) write(*,*) 'sumf=',sumf end c *** end of main program *** c *** sub program *** subroutine simpson(a,b,n,sumf) dimension f(1000) m=2*n h=(b-a)/float(m) do 10 i=1,m+1 x=a+h*float(i-1) f(i)=func(x) 10 continue sumf=h/3.0*(f(1)+f(m+1)+4*f(m)) do 20 i=2,m sumf=sumf+4.0*(h/3)*f(2*i+1) 20 continue do 30 i=2,m sumf=sumf+2.0*(h/3)*f(2*i) 30 continue end c *** end of sub program *** c *** function sub program *** function func(x) func=4.0/(1.0+x**2) return end c *** end of function sub program *** ***ここまで*** もしお分かりになる方がいらっしゃいましたら、 お手数ですがご指導いただけないでしょうか? お願いいたします。