掃き出し法のC言語のプログラム [数値解析]
C言語のコンパイラは持っているけれど、Fortranのコンパイラなんて持っていないというヒトもいるかもしれないので、C言語による掃き出し法のプログラムを紹介するにゃ。
#include <stdio.h>
#define N 20 //20元連立1次方程式まで解ける
void Hakidashi(double a[][N+1],int n) { // 掃き出し法
double piv, t;
int i, j, k;
for (k=0; k < n; k++) {
piv = a[k][k];
for (j=k; j<n+1;j++) {
a[k][j]=a[k][j]/piv;
}
for (i = 0; i < n; i++) {
if (i != k) {
t=a[i][k];
for (j=k; j < n+1; j++) {
a[i][j]=a[i][j]-t*a[k][j];
}
}
}
}
}
main() {
double a[N][N+1];
int i, n;
a[0][0]=2; a[0][1]=3; a[0][2]=1; a[0][3]=4;
a[1][0]=4; a[1][1]=1; a[1][2]=-3 ; a[1][3]=-2;
a[2][0]=-1; a[2][1]=2; a[2][2]=2; a[2][3]=2;
n=3;
Hakidashi(a,n);
for (i=0; i < n; i++) {
printf("x[%d] = %f\n",i,a[i][n]);
}
}
1次元の配列ならば、C言語で数値計算のプログラムを書いてもいいのだけれど、C言語は、そもそもUNIXというOS開発用のために作られたアセンブラ的な言語なので、配列の始まりが1ではなく0からとか、2次元以上の配列の場合、配列の大きさをあらかじめ他のプログラムに知らせないといけないなど、多次元配列を用いた数値計算には向いていないように思うんだよね。この他にデータの入出力もC言語は面倒。やっぱ、本格的な数値計算をする場合、科学技術用の数値計算をするためだけに開発されたFortranにまさるプログラミング言語は存在しないんだにゃ。
Fortranが一番だけれど、コンソール画面からのデータの入力は面倒というデメリットはあるけれど、数値計算をするならば、CよりはJavaの方がいいと思うにゃ。
Fortranから十進BASICなどのBASICへのプログラムの書き換えは楽なので、BASICのプログラムはここでは示さないケロ。十進BASICには、掃き出し法のサンプルプログラムがあったような気もするし・・・。
Fortranから十進BASICなどのBASICへのプログラムの書き換えは楽なので、BASICのプログラムはここでは示さないケロ。十進BASICには、掃き出し法のサンプルプログラムがあったような気もするし・・・。
2017-10-24 17:00
nice!(0)
コメント(3)
数値計算でFortran最強説に一票。
昔々のFortranは引数付きサブルーティンを持てなかったのです。全ての変数はメインルーティンレベルで、競合しないように宣言しなければならなかった。If文(計算型Goto文)の仕様はお粗末で、「Goto文だけ」で構造化プログラムを書かなければならなかった。そういう訳で、非常にバグの格調高い美味しそうな(?)スパゲッティープログラムはすぐ出来た(^^;)。
その系譜はFortran90(Windows対応)以降にも引き継がれ、無名共通ブロックやExtarnal文の伝統として現在も残っている。
しかしFortranは速かった。何故か?。「全てをメインルーティンレベルで処理」するからです。Fortranの基本仕様にサブルーティンは存在しないのだ!(^^;)。
一般にメインルーティンはヒープと呼ばれるメモリ領域に格納される。そこはCPUの直轄領。アクセスは最も速い。
一般にサブルーティンはスタックと呼ばれるメモリ領域に格納される。そこはヒープの属領。そこにアクセスするには、引数渡しにおける値コピーなどの無駄な作業が介在し、ちょっと効率が悪い。ちょっとも、チリも積もれば山となる。それをオーバーヘッド負荷という。
現在のFortran(Degital Visual Fortranなど)は数々の進化を遂げ、数値計算に対するコンパイラースイッチは最も豊富。引数付きサブルーティンも当然のごとくサポートされ、ポインターさえ持てるようになった。それでもともとマイノリティー言語だったFortranは、マニア垂涎の対象となり、ますます絶滅危惧種の地位を固めてる気もするが・・・(^^;)。
しかし騙されてはいけない。Fortranにサブルーティンはないのだ!。
言語仕様でサブルーティンを書けるようになったとしても、Fortranのコンパイラーは、ローカル変数を全てメインルーティンレベルの変数に翻訳する。FortranのExeは、ヒープ領域でしか活動しない。だから速い。
それが証拠に、Fortranのサブルーティンには参照渡ししか存在しない(コンパイラースイッチをいじったら知らないが)。内部仕様として値渡しがあり得ないからだ。
でもFortranは不便だ。Windows3.1の時代、Windowsはまだ拡張Dosのようなありさまで、混成言語開発もあまりサポートされていなかった。それでVBの入力インターフェイスの皮をかぶせた、Windowsの皮を被ったDosプログラムなんて、そこらじゅうに存在した。
Windows OSからDos Exeを呼び出す最も簡単な方法は、Batchを利用する事だった!。非常に規制の緩い時代だったので、Batchには何でも出来た。ちょっと複雑な制御状況に出くわすと、Batch自身を書きかえて実行するBatchなんていう、とんでもない荒業まで存在した!。
この状況はその後少し改善されたが、当時の揶揄としてこんなのがある。
Visualとは名ばかりのオブジェクト志向なVisual C。オブジェクト志向とは名ばかりのVisualなVisual Basic。絶対にVisualでもオブジェクト志向でもないVisual Fortran・・・と(^^;)。
徹頭徹尾に手続き型でVisualでないFortranは、科学技術計算の王道なのだ!。
by ddtddtddt (2017-10-25 10:15)
授業に使います。
by おちんぽ丸 (2019-04-15 09:21)
Piv=0になった時にエラー出ます。
by kn (2020-06-08 20:51)