THX VISITING!

レッスン 3

Since 24/July/2000.
もろほくナビ賃貸物件検索が登場!
 
 
 
coordinated by kura
HIROSHiSMに戻る。




Fortran ResQ > レッスン概要 > レッスン3:Fortranの積分 [初心者向け]
 
さて、ここからはフォートランの有効利用領域の繰り返し計算に入ります。積分をやりますが、積分というのは所詮は足し算ですので、それほど難しくないと思います。


問題3-1.

f(x) = ax2+bx+cをd〜eまで積分し、分割数nの違いによる答えの変化をグラフ化するプログラムを作成しましょう。積分の方法は、台形公式でもシンプソン法でも何でも構いません。但し、a〜e、nは別のファイルから読み込むこととします。ただの積分でも良いのですが、分割数による違いを付けると2重ループになるので、付けました。いきなりで難しい人は、まずは分割数なしでやってみても構いません。

これだけだとあまりに不親切っぽいので、台形公式の考え方について説明します。積分というのは、高校生の頃習ったかと思いますが、積分する範囲をdxごとの短冊状に区切って、それを足し合わせる。で、dxを無限小にするというヤツでした。

ただ、数値計算においては、この無限小ってヤツが出来ません。数値計算の情報は全て離散量であり、厳密な連続量を表現出来ません(どんなに頑張っても点のデータで線にはなれない)。

で、しょうがないから、なるべく誤差の少ない近似を考えます。台形近似はかなり簡単なものですが、長方形近似よりは誤差が少なかろうというものです。イメージは以下の通りです。シンプソン法は自分で調べてください。

fig.3.1
[ 図-3.1 ]

fとかの関数の設定法が分からない人はこちらを参照してください。
keyword[parameter,dimension,do]

解答例

プログラム本体 - ex3.f -
01 c    
02 c sample program for ex3.f
03 c  integral
04 c    
05     parameter(ni=120)
06     dimension x(ni),f(ni)
07 c    
08     open(10,file='ans.d',status='unknown')
09     open(11,file='ivalue.d',status='old')
10     read(11,*) a,b,c
11     read(11,*) d,e
12     read(11,*) nj
13     close(11)
14 c    
15     do j=1,nj+1,2
16      n=j
17 c    
18      dx=(e-d)/float(n)
19 c    
20      do i=1,n+1
21       x(i)=d+(i-1)*dx
22       f(i)=a*x(i)**2+b*x(i)+c
23      end do
24 c    
25      s=0.
26      do i=1,n
27       ds=(f(i)+f(i+1))*dx*.5
28       s=s+ds
29      end do
30 c    
31      write(10,*) n,s
32 c    
33     end do
34     close(10)
35     end

初期設定ファイル - ivalue.d -
01 1,2,4
02 -10,3
03 100
04      
05     read(11,*) a,b,c
06     read(11,*) d,e
07     read(11,*) nj

グラフ
ans

解説

それほど解説することがないのですが、doループのiは台形を足していくときの繰返しを表し、jで分割数を変化さています。

18行目のfloatは整数nを実数に変化させています。dx(実数)=(e(実数)-d(実数))/n(整数)とやるとおかしくなるコンパイラがあるためです。逆に実数を整数にしたい場合は、intとします。ex) int(a) 詳しくはこちらを参照。

ivalue.dと言うファイルが初期値を与えるファイルです。最初の3行だけで構いません。

GraphはSma4Winで作りました。縦軸が答え、横軸が分割数になっています。意外とあっさり収束することが分かります。
 

 Copyright © 2000-2004 Hiroshi Kurabayashi. All Rights Reserved.アクセス解析