★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
コンピュータで計算してみよう
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
コンピュータを利用するにはアプリケーションが必要です。 解析で利用する場合はソフトベンダーより構造解析、流体解析、磁場解析、鋳造解析、射出成形解析等々のソフトウェアが出ているので、それを利用出来る環境のコンピュータを用意すればデータを用意して入力してあげることにより、モニターの画面あるいはプリンターに結果を出してくれます。
しかし自分が必要とするアプリケーションがない場合は自分でコンピュータを動かす為に命令群を作ってやる必要があります。これがプログラムです。1960年代から70年代位まではアプリケーションも少なかったので多くの方がアプリケーションを作っておりました。多分、皆様の近くの諸先輩に聞くと、その辺の事情を良く知っている方が多いかと思います。
−Fortranで計算してみる−
まずは簡単な計算をFortranで計算してみます。 1+2+3+4+・・・計算をやってみましょう。
Fortranのプログラムは以下のようになります。文法は昔のFortran77で書いております。 ただDO文で文番号は入れませんでしたが。このDO文の形式はFortran90の文法に従っております。
プログラム−1
c
program main
c
integer *4 sum
c
sum=0
N=10
c
DO i=1,N
sum=sum+i
ENDDO
c
write(6,200) N,sum
200 format(1h0,10x,"1+2+3+....+",i3,"=",i5)
c
stop
end
以下がGNU FortranでのCompile、Linkの方法です。
g77 -o SigmaN SigmaN.for
実行結果として N=10の時と 100の時を示しております。
SigmaN > SigmaN_out.txt
1+2+3+....+ 10= 55
1+2+3+....+100= 5050
上記のFortranはWindowsで動くGNU Fortranを使って WindowsXP上で計算したものです。 このようにプログラムを作って解析に対応したものを作ると解析プログラムになります。 それには解析の為の有限要素法等を勉強する必要があります。
−ExcelのVBAで計算してみる−
皆様の環境での手頃なプログラミング環境としてはExcelがあります。上記と同じように 1+2+3+4+・・・の計算をExcelのVBAを使ったものが以下のサンプル結果です。

Excelを利用して計算した結果
プログラム例 / プログラム−2
'
'================================================================
' ファイル編集処理
' 2010年7月27日 Coding by Iwata system support
'================================================================
'
Private Sub TextBox1_Change()
clm = UserForm2.TextBox1.Value
Cells(10, 1) = clm
Sum = 0
For i = 1 To clm
Sum = Sum + i
Next
UserForm2.TextBox2.Value = Sum
Cells(11, 1) = Sum
End Sub
−プログラムの種類と特徴−
プログラム言語は非常に多くの言語があります。 上のサンプル/プログラム−1は科学技術計算用のFortranであり、1954年にIBMのジョン・バッカスによって考案された、コンピュータにおける史上初の高水準記述言語です。Fortranは科学技術計算に向いた、手続き型の手続き型言語である。2010年現在でも使われ続けており、その仕様は初期の頃と比べればかなり拡張されたものとなってきています。
またFortranはコンパイラ言語です。コンパイラとは、まずFortranの文法に従ってプログラムを書き、できたものをFortranにより機械語にして、リンカで関連するモジュール等を一体にしてアプリケーションとして使えるようにしますが、この機械語に翻訳する機能がコンパイラです。コンパイル時にリンクもしてしまいますのでコンパイラというとリンカも含まれている場合が多いです。 コンパイラは最初の手間は少々かかりますが機械語になっているので実行時の速度は格段に速くなります。
コンパイラと比較されるのがインタープリタ言語です。これはプログラム−2の例のようなBasic言語が該当します。 インタープリタ言語はいちいちコンパイル処理をしないのでトライ&エラーが容易です。しかし計算時には計算中に機械語に翻訳する事になるので計算時間が莫大になります。この為に小規模で簡易的な計算に向いております。
他に皆さんが良く知っている言語にはC言語があります。 これは技術系のエンジニアの方が最近良く利用する言語であり、このC言語にオブジェクト指向にしたものがC++言語です。 共にコンパイラ言語になります。
他には歴史のある言語としては COBOL、PL/I、ALGOL、Ada、PASCAL等の言語があります。 多分、使われなくなった言語もあるかと思います。昔、人工知能の研究ではLispという言語もありました。 最近の言語ではインタープリタ系の言語が多く、JAVA、Perl、Python等が良く聞く言語です。
−計算の高速化−
計算の高速化にはソフトウェアでの高速化とハードウェアでの高速化があります。ここではソフトウェアでの高速化について説明いたします。ただソフトウェアの高速化についてはプログラムを作る人でないと対応できないので、全ての人に効果があるとは言いづらくなります。
Case1
まず四則計算である加算、減算、乗算、除算を考えた時には「コンピュータでの計算方法」で説明したように計算時間は 加算<減算<乗算<除算で加算が最も早く計算可能です。特に除算は乗算の5倍、計算時間がかかると言われておりますので除算を乗算に変換できるのであれば変換しておくことが重要です。
例としては C=A/B という計算がある場合。 D=1/Bを先に計算しておき、 C=A*D にすると計算が早くなります。 ただ一つくらいではあまり影響がありませんので繰り返し計算で何度も現れるような場合に効果があります。
Case2
DOループの内部の計算でDOループの外に出せる計算は外に出す。例えば
x = a + b
DO i=1,N
sum=sum+dfloat(i) / half + sin(x)
ENDDO
のような場合
x = sin(a + b)
DO i=1,N
sum=sum+dfloat(i) / half + x
ENDDO
とDOループの外に出すことにより無駄な計算を減らす事ができる。
この例の場合、50%程早くなります。
Case3
配列データ操作をDOループで行う場合は、メモリー領域を連続にアクセスするようにプログラムを作成する。
例えば2次元配列 data(10000,10000)の場合
DO i=1,N
DO j=1,N
sum=sum+dfloat(i) / half
data(i,j) = sum
ENDDO
ENDDO
に比べて
DO i=1,N
DO j=1,N
sum=sum+dfloat(i) / half
data(j,i) = sum
ENDDO
ENDDO
は2倍以上早くなります。これはデータが
![]()
![]()
![]()
![]()
![]()
![]()
![]()
1,1
2,1
3,1
4,1
5,1
6,1
7,1
8,1 ・・・・・・・・・・・・・・・・
とデータが蓄えられるから配列の左側の添え字が連続して変わるようにプログラミングすると連続して
データ領域をアクセスするようになります。