- ベストアンサー
この計算式のプログラムを教えてください!
プログラム初心者です。 Fortranを用いて Y=∫{e^{-λ(s-t)}}×b(t)dt という式のプログラムをつくりたいと思っています。 範囲は、0からsまで積分です。 数値積分にも色々なやり方があり、また、プログラムもまだ始めたばかりなのでよくわかりません。 どなたかこの式のプログラムを教えていただけないでしょうか? 文章だけでは分かりにくいとは思いますが、宜しくお願いいたします。
- みんなの回答 (2)
- 専門家の回答
みんなが選んだベストアンサー
あなたの考える「式のプログラム」では、いったい何を入力して、何を出力するつもりなのかを補足してください。 ついでに計算精度についても考えがありましたら、それも補足してください。
その他の回答 (1)
- f272
- ベストアンサー率46% (8469/18132)
Y=∫[0→5](e^λ(5-t))b(t)dt この式を変形していきます。積分範囲[0→5]を区分して長方形で近似します。 Y=(e^λ(5-0.5))b(0.5) +(e^λ(5-1.5))b(1.5) +(e^λ(5-2.5))b(2.5) +(e^λ(5-3.5))b(3.5) +(e^λ(5-4.5))b(4.5) ここでb(0.5)をどう考えるかですが、与えられているのがb(0)とb(1)ですから(b(0)+b(1))*0.5としてみます。すると Y=(e^λ(5-0.5))(b(0)+b(1))*0.5 +(e^λ(5-1.5))(b(1)+b(2))*0.5 +(e^λ(5-2.5))(b(2)+b(3))*0.5 +(e^λ(5-3.5))(b(3)+b(4))*0.5 +(e^λ(5-4.5))(b(4)+b(5))*0.5 これならλも与えられているのだから計算できるでしょう。 Y=0.0 DO I=1,5 T=I-0.5 IF (I==1) THEN Y=Y+EXP(EL*(5-T))*(B(I))*0.5 ELSE Y=Y+EXP(EL*(5-T))*(B(I-1)+B(I))*0.5 END IF END DO ここでELはλのつもりです。ところでこれはs=5.0の場合でした。 それ以外のsについても対応できるように、全体をJのループで囲ってみましょう。 それからYの値も配列に入れて保存するように書き換えてみます。 DO J=1,L Y(J)=0.0 S=J DO I=1,J T=I-0.5 IF (I==1) THEN Y(J)=Y(J)+EXP(EL*(5-T))*(B(I))*0.5 ELSE Y(J)=Y(J)+EXP(EL*(5-T))*(B(I-1)+B(I))*0.5 END IF END DO END DO あとは変数の宣言をして入力と出力を作れば出来上がりです。 PROGRAM SAKU045 IMPLICIT NONE REAL,ALLOCATABLE,DIMENSION(:) :: B REAL,ALLOCATABLE,DIMENSION(:) :: Y PRINT*, 'INPUT L,EL' READ*, L,EL ALLOCATE (B(L)) ALLOCATE (Y(L)) PRINT*, 'INPUT B(1:L)' READ*, (B(I),I=1,L) ... DO J=1,L PRINT*, 'Y(',J,')=',Y(J) END DO END PROGRAM ちなみに全くプログラムは検証していません。
補足
説明が足らなくて申し訳ありません。 0からLまでの距離の線を考えています。 sは、この線の中に存在するあるポイントです。 0からLを距離tごとに分割し、断面がL/t個あります。 λとb(t)の値は既に求まっています。 λは、定数です。 b(t)は、その断面ごとの値を用います。 例えば、b(1)=2,B(2)=3,B(3)=4・・・ 距離30までの線で、s=5.0のポイントで、Lを距離1.0ごとに分割し、断面が30個ある場合を考えます。 s=5.0のポイントは、断面5個目にあるので、b(5)の値を用います。 Y=∫0→5 (e^λ(5-t))・b(5)dt 上記の場合、このような式になると私は考えています。 よって、入力は、λ、b(t)、L、s、tが必要なのではないかと思います。 精度は、どのくらいとは言えませんが、精度は高い方が良いです。 このような式で値が求まるとしかわかっていないので、何が出力されるかまでは、よくわかっていません。 よく理解していないのに質問してしまい、すみませんでした。