Deprecated : The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
マトリクス構造解析 第9回
2024年度は、情報統括センターのパソコンで、WindowsではなくUbuntuを起動して行います。
Ubuntu上でのプログラムの編集やコンパイルについては、
(フォートラン(gfortran)入門 )を参照して下さい。
2023年度マトリクス構造解析II受講者へのお知らせ:
6/14からの対面授業では、PC実習室Bのパソコンの
WindowsのCygwin窓内でコンパイルしようと思います。
Fortranのプログラムは、xyzzyなりサクラエディタなりで作成して、
Windows内の(Documentsとかがある)Hドライブ内に保存して下さい。
Cygwin窓を立ち上げるには、スタート→その他→
Cygwin64 Terminalを選択して下さい。
Cygwin窓のフォントサイズなどを変更する場合には、
右クリック→オプションから、Textなどを選択して、
フォントサイズなどを変更して下さい。
Cygwin窓から、Hドライブ(Documentsとかのあるところ)を参照するには、
cd /cygdrive/h でHドライブに移動して、そこでコンパイルや実行を
行って下さい。
また、プログラム内で日本語を使っている場合は、保存オプションの
エンコード(文字コード)でShift-JISではなく、UTF-8を指定して下さい。
小さい字は補足説明なので、読み飛ばしてもいいです。
第9回以降は、コンピューターを使って
マトリクス解析を行うために、Fortranというプログラム言語を使う。
プログラム言語というのは非常にたくさんあって、常に新しいものが開発されている。
最近だと、業界にもよるが、
Julia
だの
Python
だのが流行りだろうか。
そうした中で、Fortranというのは、数値計算の分野で昔(1970年代頃から1990年代頃とか)
多用されていた古典的なプログラム言語だ。
今でも、数値計算の分野ではそれなりには使われていると思う。
というのは、マトリクス計算が簡単に書けるとか、数値計算に特化した
特徴があるのだが、そういうことを別にしても、
Fortran(少なくともFortran90以降のgfortranとか)は、
覚えることが少なく、割と簡単に使えるようになるプログラム言語だと思う。
プログラム言語の場合、
高機能で様々な領域で多用されているプログラム言語だということと、
そのプログラム言語がわかりやすく簡単に書けるかということは別のことだ。
最初にプログラムに触れてもらう教育用の言語として、
Fortran(gfortran)は、割とわかりやすくそう悪くないと私は思う。
これでプログラミングに興味を持った人は、
どんどん今時の新しい言語を勉強してみたらいいと思う。
以下は、Windows10またはWindows8にTDM-gccというツールをインストールする方法を
書いている。
MAC など、
それ以外のOSの人は、後藤に個別に相談すること。
パソコン操作やプログラミングに慣れていて、
自分の使い慣れたコンパイラーやエディタを使いたいという人はそれでも
構わない。
CPUが64ビットか32ビットかの確認:
デスクトップ画面左下のスタートボタン隣の「ここに入力して検索」に
「システム」と入力し、「システム情報」を開く。
「システムの種類」のところに「x64ベース」と書かれていれば、
64ビットということ。
32ビットの場合は、たぶん「x86ベース」と書かれているのでは
ないかと思う。
また、「x64ベース」であっても、32ビット用のWindowsが
インストールされている場合もあり、
そのときは、たぶん「32ビットオペレーティングシステム」
みたいに書かれているのではないかと思う。
つまり、もし「x86ベース」とか、「32ビットオペレーティングシステム」とか書かれていたら、以下で、32ビット用のツールを
インストールすべきということ
(32ビットマシンでの確認はしていないので、
うまくインストールできない場合は個別に相談)。
おそらく、最近の普通のスペックのWindows10のノートとかであれば、
ほぼ64ビットマシンではないかと思う。
http://tdm-gcc.tdragon.net/download の
ATDM-GCC 9.2.0 release
にアクセスし、64ビットマシンの場合は、
tdm64-gcc-9.2.0.exeを適当なフォルダにダウンロードする。
32ビットマシンの場合は、
tdm-gcc-9.2.0.exeの方を適当なフォルダにダウンロードする。
(32ビットマシンの人は、以下、tdm64-gcc-9.2.0.exeをtdm-gcc-9.2.0.exe
に読み替える)。
tdm64-gcc-9.2.0.exeでも64ビットか32ビットを聞かれたときに32ビットを
選択すれば、32ビットマシンにもインストールできるのかもしれない。
tdm64-gcc-9.2.0.exeをダウンロードしたフォルダ
(ブラウザーで特にダウンロード先の指定をしていなければ、
「ダウンロード」フォルダにダウンロードされていると思う)に
行き、
ダウンロードしたtdm64-gcc-9.2.0.exeを右クリックし、
「管理者として実行」を選択
すると、「この不明な発行元からのアプリがデバイスに
変更を加えることを許可しますか」と表示されるので、
「はい」をクリック
すると、TDM-GCC Setup というウィンドウが出てくるので、
Create をクリック
MinGW/TDM(32-bit)かMinGW-w64/TDM64(32-bit and 64-bit)を
選択するウィンドウが出てくるので、
64ビットマシンの人は、MinGW-w64の方を選択。
32ビットマシンに、tdm-gcc-9.2.0.exeでインストールしている
人は、たぶんこの選択は出てこないと思う。
Installation Directory というのが出てきて、
C:\TDM-GCC-64 というフォルダ名が書かれていると思う。
特にこだわりがなければ、このままとする。
この授業では、
プログラムの編集や実行は、すべて、
C:\TDM-GCC-64 のフォルダ内で行う。
パソコンの操作に十分に慣れている(インストールフォルダを指定したり、
コンマンドプロンプトを開いて、DOSコマンドで
そのフォルダに移動したりが自由にできる)人は、
自分で他のフォルダにインストールしたり、
他のフォルダでプログラムを編集しても構わない。
なお、Directory(ディレクトリ)とフォルダは同じ意味である
(UnixやLinuxではディレクトリと言うことが多く、WindowsやMacでは
フォルダと言うことが多い)
New Installation: Choose Components というウィンドウが出てくるので、
リストの一番上にある
gcc(TDM64 Curent: 9.2.0-tdm64-1)
の左側の「+」をクリックして、(たたまれている)内訳を表示させる。
すると、core, c++, fortran と並んでいるので、
fortran のところにチェックを追加して、
Installをクリックする。
インストールが始まり、数分?ぐらいすると、
Completed successfully と表示されるので、
Nextをクリック。
README-gcc-tdm64.mdがメモ帳で開かれるので、
一応、目を通してから閉じる。
これでインストールは終わり。
Completing TDM-GCC Setup と表示されるので、Finishをクリック。
プログラムを実行するウィンドウの開き方
スタートからTDM-GCC-64の中にあるMinGW Command Prompt をクリックすると
黒いウィンドウが開き、C:\TDM-GCC-64> と表示される。
プログラムの実行は、このウィンドウで行うが、
毎回スタートから、MinGW Command Promptを探すのがめんどうで
あれば、スタートの中にある
MinGW Command Promptをクリックを押したまま、デスクトップにドラッグして
ショートカットを作っておくといいだろう。
このウィンドウは、DOSコマンドというコマンドを受け付ける。
例えば、dir と打てば、このフォルダにあるファイルのリストが表示されるし、
exitと打てば、ウィンドウが閉じるので、
やってみてほしい。
なお、打ち込んだコマンドの履歴は記録されているので、
一度 打ち込んだコマンドは、↑↓キーで表示させて、
再実行できる。
コンパイルなど、長いコマンドを打ち込んだときは、
履歴を使えば、次に同じコマンドを実行するときは、
長いコマンドを打ち込まなくても済む。
MinGW Command Promptで表示されているC:\TDM-GCC-64>というのは、
C:\ドライブの中のTDM-GCC-64というフォルダ内に
いることを表している。
エクスプローラで同じ場所を参照するには、
エクスプローラを開き、C:\をクリックして、
その中のTDM-GCC-64というフォルダ内を参照すればよい。
プログラムはテキストファイル なので、
テキストエディタで編集する。
この授業では、Windowsに標準で入っているワードパッドを
使うことにするが、
使い慣れたテキストエディタがある人はそれを使って構わない。
後述するように、
ワードパッドは、勝手に.txtという拡張子をつけたりするので、
それをいちいち名前の変更で削除するのがめんどくさいという
人は、
情報統括センターのパソコンに入っている
xyzzy や
サクラエディタ
をインストールしても構わない(その方が作業は快適だと思う)。
スタートからWindowsアクセサリの中にある
ワードパッドを探してクリックすると、
ワードパッドが起動する。
いちいちスタートから探すのがめんどくさい場合は、
スタートで見つけたワードパッドをクリックしながら、
デスクトップにドラッグしてショートカットを作ってもよい。
では、ワードパッド上で、簡単なプログラムを書いてみよう。
まず、以下の2行を書いてみてほしい
print*, "日本語が表示できるか"
end
上の2行をコピペしてワードパッドに貼り付けてもよい。
自分で打ち込むときに注意することは、"は、半角英数で、
全角の❞ではない。print*,の前や後に半角スペースを複数
入れても構わないが、全角スペースを入れてはいけない。
printは、画面に表示させるということ。printについてる*は、
いろんなフォーマットを指定できるけど、
細かいことは気にせずに、
お任せのフォーマットで表示させるということ。
print*, の後に、
表示させたいものを「,」で並べていけばよい。
文字列自体を表示させたい場合は、
文字列を"文字列"のように半角のダブルコーテーションで
挟む。全角のダブルコーテーションを使うとエラーになる。
endはプログラムの終わり。
プログラムを保存するときは、ファイルの「名前をつけて保存」
を選び
(ここで、ファイルの形式を聞かれたら
「テキスト形式のドキュメント」を選択。後からも選択しなおせる)、
ファイルの種類は、「テキスト ドキュメント(*.txt)」を選択する。
ファイル名は必ず半角英数とし、全角文字は使わないこと。
プログラム名を例えば aaa とするなら、
必ずaaa.f90のように、.f90 の拡張子をつける
(こうすることで、Fortran90のプログラムだと認識されるようにする)。
ワードパッド特有の注意
ワードパッドでは、ファイル名を aaa.f90 と書いて保存すると、
aaa.f90.txt と更に、.txtというテキストファイルを表す
拡張子を勝手につけられてしまう(ことがある)。
エクスプローラで開いて「名前の変更」で.txtの部分を消すという
やり方でもよいが、
保存する際に、"aaa.f90" のように、ファイル名を半角英数の
「"」で挟んでから保存すると、.txt がつかずに保存できるようだ。
動画では、このやり方がわからずに、次項のように「名前の変更」
で.txtを消している。
エクスプローラのデフォールトの設定だと、
ファイルの拡張子を表示しない設定になっているので、
その場合、aaa.f90.txt みたいに .txt という余計な拡張子が
つけられてしまっていることに気づけない(動画でも最初そうなってた)。
なので、エクスプローラの表示で「ファイル名拡張子」にチェックを入れておくこと。
MinGW Command Prompt を開き、dir /w と打ってエンターを押すと、
ファイル(やフォルダ)が2列(以上)に並べて表示される
(/w をつけないと1列に表示されて上の方が見えなくなってしまう)。
今、保存した aaa.f90 が左上の方にあることを確認する。
さて、aaa.f90 は単なるテキストファイル なので、
このままでは、コンピューターが aaa.f90 に書かれた
プログラムの内容を理解して実行することはできない。
これを実行できるようにするには、
aaa.f90 に書かれたプログラムを、
コンピューターが理解できる機械語に翻訳する必要がある。
人間が理解できるプログラム言語で書かれたテキストファイル
(ソースコード )を
コンピューターが理解できる機械語に翻訳する操作のことを
コンパイル と言う。
aaa.f90 をコンパイルするには、以下のように打ち込んで、エンターキーを押す。
gfortran aaa.f90 -o aaa
gfortran の後にコンパイルしたいプログラム名(今回はaaa.f90)を書き、
その後に、 -o 実行ファイルのファイル名 を書く。
プログラムの実行ファイルは、プログラム名(今回はaaa.f90)と同じ
(拡張子を取ったもの)にしておくこと。
プログラムに間違い(バグ)があれば、ここで、エラーが出る。
エラーがでなければ、
(dir /w と打ち込んで確認すると)
aaa.exe という実行ファイルができあがっている。aaa.exeを実行するには、aaa.exeまたは単にaaaと打ち込んでエンターを押す。
するとプログラムが実行されて
「日本語が表示できるか」と表示される。
print*, "日本語が表示できるか"
end
1行目のprint*で、""で挟まれた文字列を画面に表示し、
2行目のendでプログラムが終了したということである。
プログラムの強制終了
プログラムが終了しない場合(無限ループを作ってしまった場合など)は、
Cntlキーを押しながらcを押すと強制終了できる。
長方形の短辺と長辺を入力すると長方形の面積を表示するプログラムを
作ってみよう。まず、エディター(ワードパッド等)で、
以下のように打ち込んでみよう。
コピペして貼り付けても構わない。
そして、適当な名前(ここでは menseki1.f90とする)をつけて保存する。
ワードパッドの場合は、"menseki1.f90"のように「"」で挟んで保存すること。
implicit none
real :: tanpen, tyouhen, menseki
print *,"長方形の短辺を入力して下さい"
read *,tanpen
print *,"長方形の長辺を入力して下さい"
read *,tyouhen
menseki=tyouhen*tanpen
print *,"長方形の面積は:",menseki
end
プログラムの中身を説明する。
implicit none
この宣言をしておくと、暗黙の型宣言(先頭文字がi-nの変数が整数型でそれ以外は実数型)が
無効になるので、うっかり宣言していない変数を書いたりすると、
コンパイル時にエラーが出て教えてくれるようになる。
必ず毎回、先頭にこの1行を書くということにしておけばよい。
real :: tanpen, tyouhen, menseki
これは、tanpen, tyouhen, menseki という3つの変数を実数として使うことを
宣言している
(
テキスト 参照箇所:
4.1.1. 基本的な型宣言 )。
ちなみに、整数型の変数を宣言する場合は、integerを使う。
print *,"長方形の短辺を入力して下さい"
これは、「長方形の短辺を入力して下さい」と画面表示するということ。
read *,tanpen
これは、キーボードから入力した数字を tanpen に入れるという
こと
(
テキスト 参照箇所:
7.2.1. 入出力文 )。
menseki=tyouhen*tanpen
この=は、右辺を左辺に代入するという意味で、等式を表しているわけではない。
この場合、
tyouhen と tanpen を掛け算した数値を menseki に代入する。
例えば、x を x+1 と置き換える場合は、x=x+1 のように書く
(tyouhen*tanpen=mensekiとかx+1=xみたいに
逆に書くとエラーになるので注意! )
テキスト 参照箇所:
2.1. 算術演算 )。
かけ算の$\times$は * で表す。
その他の演算は、以下のように表す。
$a + b$ a + b
$a - b$ a - b
$a \times b$ a * b
$\frac{a}{b}$ a / b
$a^{b}$ a ** b
$a\{b+c(d+e)\}^{(f+g)}$ a*(b+c*(d+e))**(f+g)
menseki1.f90を実行してみる
gfortran menseki1.f90 -o menseki1
エラーが出なければ、menseki1.exeができているので、
menseki1と打ってエンターキーを押す。
プログラムは上の行から順番に実行されていくので、
まず、1行目のimplici noneで暗黙の型宣言が無効化され、
2行目でtanpen, tyouhen, menseki の実数変数が宣言され、
3行目の"長方形の短編を入力して下さい"が表示され、
4行目のread*, tanpen で、キーボードから数値の入力を
待っている状態で止まっている。
そこで、例えば 3. と打ち込んでエンターキーを押してみる。
3と打ち込んでも構わないが、
実数(と自分が考えている数値)は、3.0とか3.と小数点を
つけておいた方がよい
(整数で入力すべき変数に実数を入力してしまった場合に
エラーで気づけるので)。
すると、3.がtanpenの中に読み込まれ、
5行目の"長方形の長辺を入力して下さい"が表示され、
6行目のread*, tyouhen で、キーボードからの数値の入力を
待っている状態で止まる。
そこで、今度は例えば 4. と打ち込んでみる。
すると、4.がtyouhenの中に読み込まれ、
7行目でtyouhen*tanpenを計算した数値(つまり4.* 3. で12.)が
mensekiに代入される。
8行目で、まず、"長方形の面積は:"を表示し、
「,」に続く mensekiの数値(12.)を表示する。
今回は、print*の*で、表示のフォーマットはお任せにしているので、
小数点以下が、12.0000000と表示されている
(もっと少ない桁とか多い桁とか、1.2E+02みたいな指数表記とかも
フォーマットを指定しようと思えば、細かく指定できる)。
プログラムに間違い(バグ)があると、
コンパイルしたときに、
そのバグがある行と、その行内でのおよその位置、
エラーの内容を表す単純な英語で
エラーメッセージが示される。
エラーメッセージを読めば、どういうエラーなのか、
ある程度は推測できると思う。
tyouhen*tanpen=mensekiと代入文の右辺と左辺を逆に書いてしまった場合。
7行目のtyouhen*tanpen=mensekiと書かれた行の
「1」で示した辺りに、Unclassifiable statement
(よくわからない文)がある。
print*文の右側のスペースの中に、全角スペースを1個 打ってしまった
(ワードパッド上では、全角スペースも半角スペースも空白にしか見えないので
気づけない)。
5行目の print*," と書かれた行の「1」で示した辺りに
Invalid character (無効な文字)がある。
print *,"長方形の短辺を入力して下さい"の右側の「"」を全角の「❞」にしてしまった。
3行目の print*," と書かれた行の「1」で示した辺りに、
Unterminated character
(終わらない文字列)、
文法的なつながりとここでのconstantの品詞が今ひとつわからないが、
constant beginning at (1)(の継続。「1」で始まったやつの)。
動詞のない名詞句と解釈すると、
「1で始まって終わらない文字列の継続」とか。
menseki1.f90 を参考にして、
三角形・台形などの幾何学図形の面積や、
円錐・球などの立体の体積を求めるプログラムを作りなさい
(長方形の面積はここに書いてあるのでダメ)。
WebClassの「プログラム課題1」から、
プログラム本体(例えば kadai1.f90 とか)をアップロードし、
こんな感じ の
実行画面
(仮にエラーが取れずにどうしても実行できなかった場合は、
コンパイル時にエラーが出ている画面)
を写真で撮影したものをアップロードする。
球の体積とかで、円周率$\pi$を使いたい場合は、
三角関数の逆関数を用いて$\pi$を与えることができる。
例えば、$\cos(\pi)=-1$から$\pi=\arccos(-1)$の関係を用いるのであれば、
pi=acos(-1.)
みたいに定義すればよい。もちろん、piを実数変数として定義する必要もある。
あるいは、$\sin(\frac{\pi}{2})=1$から$\pi=2\arcsin(1)$の関係を
用いるのであれば、以下のように与える。
pi=2.*asin(1.)
それほどの有効桁を必要としないのであれば、
pi=3.14159265
みたいに書いてもよい。