Fortran 数値計算の基本、do文IF文の組み合わせ例も解説してます

プログラム
Pocket

どうもYukiです。

2018年9月現在、大学院に所属し、研究の一環でプログラミング(言語はFortran)をしてます。

今まで、プログラミングに一度も触れてこなかったのですが、研究室に配属され、シミュレーションソフトを作る、研究テーマになってしまいました。

数値計算やFortranについて、1から勉強しましたが、やはり基本的な部分を理解するのに時間がかかってしまいました。

そこで、これから載せる内容が少しでも、数値計算やFortranの基礎理解に役立てばと思っています。

数値計算の基本

私の感覚ですが型の宣言do文if文が理解できれば、簡単な数値計算のプログラムを組むことが出来ると思います。

 

型の宣言

型の宣言とは使う文字をどのような型にするか決めることです。

Fortranだと、real , integer等があります。

ちなみにrealは実数型、integer整数型になります。

例えば、real a , integer i , と宣言します。

これで aの文字は実数型、iの文字は整数型を持つことになります。

もう少し具体的に説明すると、a , iに1という数字を入れると、a=1.000 , i=1という意味(表示される)になります。

型宣言は結構大事で、私自身、型についてよく分からないままプログラミングをしていて、不具合やバグが大量に発生しました(笑)。

具体的な失敗例で、integer ZZと宣言して、ZZ=SQRT(2)※√2という意味とプログラムし、不具合が起きました。

不具合の原因は単純でZZはinteger(整数型)で宣言しているのに、整数だけでは表すことができない、√2(1.414 )をZZに入れようとしたためです。

最初は慣れなくて、大変かもしれませんが、このような失敗をしないために実数型でいいのか、それとも整数型の方が良いのか等、型を考えながらプログラムをした方が良いです。

追記

Fortranには暗黙の型があるみたいですが、きちんと型の宣言した方がきれいなプログラムになると思います。

do 文

FortranやC言語で数値計算を行う=手計算で解くことが難しい計算を、パソコンに計算させるイメージを私は持っており、上記の場面では確実にdo 文が入っていると思います。

do 文を使用するに当たってf(x) = ax+bのような(何らかの関数)をプログラミングをすると思います。

そのためにもう少し型について説明します。

上記で説明した real aという宣言だと、一つの数字しか記憶することが出来ません。

例えば、

a=10+10

a=20+20

と書きます。

このように、プログラミングしてしまうと最初のa=20が上書きされてa=40が記憶されます。

様々な宣言の仕方がありますがここでは、real a(0:10)と宣言(プログラミング)します。

これにより、a(0),a(1),a(2)~a(10)まで数字を記憶することができます。

具体的に、

a(0)=10+10

a(1)=20+20

と書いた場合、数字が上書きされることなく、a(0)に20、a(1)に40という数字が記憶されます。

上記のことを踏まえて do文を説明していきます。

今回はdo 文を説明するのに手計算で解けてしまいますが、九九の2の段で説明したいと思います。

まず,do文を使うための構文(1連のセット)の例として

integer i

do i =1 , 9 , 1

end do

言葉で説明すると、do i と end do の間の式の中にある i という文字を1から1ずつ数字を増加させ、9で止めるという意味です。

(do i = 初期値 , 最終値 , 刻み幅)

具体例として、

real a (1:9)

integer i

do i = 1 , 9 ,1

a(i) = 2 * i

end do

と書きます。※ *は×という意味

このプログラムの意味をもう少し詳しく説明すると

iは1からスタートするので

a(1) = 2 * 1

iは1ずつ増加するので次は

a(2) = 2 * 2

これをiが9

a(9) = 2 * 9

になるまで計算します。

これでa(1) = 2 , a(2) = 4  ~ a(9) = 18 と

九九の2の段のプログラムが出来ました。

do 文は上記で説明したような意味を持ちます。

これにより関数計算がプログラミングできます。

if文

if文は場合分けの計算をするときに使います。

構文は

if()then     ※()の中が真なら式の計算をするという意味

end if

です。

具体例として、虚数の場合分けで説明したいと思います。

real a

real z

a = 3

if(a>=0)then

z = SQRT(a)

else if(a<0)then

write(*,*)’no calculation’

end if

このプログラムの意味は もし、aが0以上ならz=√aの計算をし、aが0より低いの値なら、no calculationを表示しろというプログラムです。

if文が使われる場面の例として、実際にはありえない値の補正等に使われます。

ある条件で計算したら 距離が-2[m]という解が導かれました。
-2[m]って現実ではありえないことですよね?

しかし、数値計算上ではこのような類のものが出てしまうことがあります。
そこでif文を使い、マイナス値が出たらすべて0[m]にする等、補正したりします。

if文はdo文よりは理解しやすいと思います。

do文とIF文の組み合わせ例

do文とIF文の組み合わせですが、どちらを先に置くかで意味が全く変わってしまいます。

例を挙げると

IF(i=5)then

do i = 1,10

x(i) = i

end do

end program

end if

もう一つは

do i = 1,10

x(i) = i

IF(i = 5)then

end program

end if

end do

です。

IF文とdo文の順番が違うだけなのですが、意味は全く違います。

まずは、赤文字の前者の説明から、IF文が先に来て、その中にdo文が入っています。このプログラムは恐らく機能しないコードです。

i = 5 の時 i をカウントするdo文が発動します。つまりIFを発動させるのに、do文を発動しなければならないのに、IFを発動させないと、do文が発動しません。

コードの破綻が発生してしまっています。

青文字の方はdo文が先に来て、その中にIF文が入っています。

これは正常に機能します。 do文が発動し、iがカウントされます。そして、iが5になったときにIF文が発動し、プログラム終了させるコードが発動します。

do文とIF文の順番の違いで永遠に終わらない計算が始まってしまう事があります。

因みに、筆者は経験済みです。(笑)

ミスに気付いた時の絶望…膨大な時間が無駄となります。このミスだけは回避したかったです。

まとめ

型の宣言do文if文について説明しました。
私もこの3つを理解するのに時間がかかりました。
この記事が少しでも役に立っていただけるのなら嬉しいです。

関連記事

1からプログラミングを覚えるなら独学じゃない方がいい理由

FORTRAN基本から中級レベルまでの記事を紹介 まとめ

6記事でGoogle AdSense合格しました、その時のブログの状態

地獄の研究室生活 大学4年生編

シミュレーションのメッシュとは?自作でメッシュの作り方