仕事で1970年代にFORTRAN77で作られた技術計算(発電所の熱精算)プログラムを使っています。(私はプログラムは使っていても、作ったことのない、ほとんど素人です)
このプログラムの規模として、総ステップ数が約60kステップ有ります。
このたび、このプログラムをMATLABに移植することになりました。
移植の理由は、FORTRANそのものが古い言語で、機能拡張などのメンテナンスを依頼しているソフト会社には、FORTRANの分かるエンジニアがいなくなったこと、だそうです。
(MATLAB使用は会社の指示です)
そこでお聞きしたいのは以下の点です。
1.FORTRANとは、そんなに古い言語になってしまったのか?
2.MATLABはある精度内で収束するように繰り返し計算するようなプログラムに向いているのか?
3.MATLABのネット記事のほとんどが大学関係者ばかり。企業では使われていないのか?だとしたら、その理由は?
4.MATLABの利点と欠点を述べた記事などがあったら紹介して下さい。
宜しくお願いします。
No.5ベストアンサー
- 回答日時:
No.4のお礼欄について
>演算時間はMaxでも2秒程度です
どの程度のコンピュータの場合の時間でしょうか?
FORTRANやCのようなコンパイラを使った場合とMATLABのようなインタープリタの場合とを比べると同じ様なコードだと2桁から3桁遅くなると思っておいてください。ただし行列計算のような内蔵されている機能に置き換えるとそんなに速度低下はおこりません。1桁程度見込んでいたらよいと思います。1970年代に実用的な速度が出ていたのでしたら、その当時と比べれば遅くなることはないと思います。
>「FORTRANからの脱却」
FORTRANのコードを変換するのではなく、仕様書から作りゼロからつくることになると思いますので、MATLABのライセンス料で悩む必要はないと思います。それとは桁違いの金額が必要にはずですので。
「FORTRANからの脱却」には反しますが、
計算部分は問題が無く、ユーザインターフェースを改善したいというときの方法として
1) 元のコードの計算部分をいくつかのサブルーチンにして、新しく作るプログラムからライブラリとして呼び出す。
全部CやFORTRANで書く必要はないので、メンテナンスしやすい言語で新しく作り、計算部分だけは基本的に元のコードを利用する。
2) 元のプログラムをそのまま使い、元のプログラムが解釈できる入力と、その出力を解釈できるプログラムを作成し、ユーザーインターフェースを改善する。
私自身は2)の方法もよく使います。自分だけや部署内で使う程度であればこれで十分ですので。仕事の合間をみて一週間程度で書いてしまいます。
この回答への補足
現在のプログラムは、古いなりにシステム化しています。
一つのデータ処理システムの中の計算本体(EXE)で、入出力はTXTファイルで行います。
システムはPC(Core2Duo/WinXP)に搭載しているので、ユーザは入力にCSVを使ったりしています。
(このPC上での演算時間が2秒程度です)
また、出力データ(約500種類)にはアドレス番号を振っておいて、必要であれば、内部処理でExcelに貼り付けることができます。Excelはリンクを張ったりマクロを設定して後続の作業に利用します。
また、計算結果は管理図書なので、マクロ処理(フォントや余白)でTXTからWordに変換しており、MATLABでも同様の処理をすることになります。
No.4
- 回答日時:
No.3の続きです。
MATLABとFORTRANは配列の扱いがずいぶん違います。この時代のFORTRANは配列の要素を1つずつ計算していくのですが、MATLABでは行列式やベクトル式のような扱いを普通します。幸い配列のインデックスは両方とも1からですので、まあそのまま置き換えることはできるかもしれませんが、MATLABの簡潔性は失われます。これくらい違うと移植というよりは、一から作り直す覚悟でやるほうが将来のメンテナンスを考えると良いように思います。
MATLABからFORTRANを呼び出し可能でしたら、ユーザーインターフェース部分をMATLABで書き、計算部分をFORTRANで残しておくのも手かと思います。
>「継続性のない使い捨てのプログラムをその場で書くのには適しているが...」
Scilabを使いこなした訳ではないですが、ある意味言い当てているように思います。
逆の言い方をすると、計算部分をサブルーチンなどの形で分けておくことで(MATLABのサブルーチンでも良い)、手軽にユーザーインターフェース部分や計算条件を変えられるメリットがあります。私自身は計算部分は独自Classやモジュールを使ったライブラリにし、それを数十行程度までの本体部分から呼び出す手法を多用しています。本体部分はずっと使う場合もありますし、使い捨てに近いものも多くあります。
ありがとうございます。
MATLABで将来の拡張性&メンテナンス性を持たせた作り込みとなると、現在のFORTRANから完全に乗り換えするしか方法は無いでしょう。この件は「FORTRANからの脱却」という方針なので、問題にならないと思います。
ただ、現場の何よりの懸念は「演算時間が桁違いにかかること」と「高額なライセンス料」です。
FORTRANでは、1ヶの計算ファイル(入力データ)に最大で30種類のケースをセットできて、演算時間はMaxでも2秒程度です。この時間で(昔のラインプリンターのイメージで)、7000行の解が得られます。
MATLAB代理店から詳細な話を聞いていませんが、会社のLAN下で使う場合は「ネットワークライセンス」&「同時にアクセスできるのは2~3人」のようなことで、かなり高額なライセンス料金のようです。
No.3
- 回答日時:
1) No.1、No.2でも触れられていますが、FORTRANは古くから言語ですが、ある意味Hotな言語でもあります。
というのも、現在でも高速なプログラムを一番書きやすい言語ですので、スーパーコンピュータなどで数値計算使われるプログラムの多くは FORTRANで書かれています。かなり注意して書いたCと普通に書かれたFORTRANで比較しますと、FORTRANは同程度かより高速なプログラムを書けます。コンパイラが最適化しやすいのが大きな理由です。
2) 収束をともなう数値計算の場合でも普通は倍精度浮動小数点程度の精度ですので、計算桁数でも多分問題ないと思います。
ただし、実行速度はFORTRANに比べて2桁以上遅いことを覚悟しておいた方がよいと思います。ただし作成した当時に比べて、2桁以上のCPUが高速化していますので、当時よりは速いものができると思います。
MATLABのようなスクリプト言語の場合は、コンパイラ言語で書かれた計算ライブラリが手に入ることが多いので、それを利用すれば速度低下はほとんどありません。
3)はパス。
4) No.2でありますのように、「言語屋としてはとっつきにくいソフト」に一票
類似したScilab、Octave, Rなどいろいろ使いましたが、それぞれ独特の癖があります。1つだけのスクリプト言語で完成すればよいのですが、適材適所でいろいろ使い分けていた時期がありますが、頭の中が混乱してきました。結局下記のようにしています。
最近の私のプログラムの作り方ですが、スクリプト言語(Ruby)をメインにして、 計算時間のかかる部分は必要に応じてFORTRANやCで書かれたライブラリをそれから利用し、グラフ化には(R)をそれから呼び出して使っています。
一時MATLABに似たScilabを使っていましたが、C等で書かれたライブラリやRなどを呼び出す方法が分からなかったので、現在は利用していません。
回答ありがとうございます。
MATLABのことをネット記事から見ていますが、皆さんが仰るように、扱いにくい面を持っているようですね。
中には、「継続性のない使い捨てのプログラムをその場で書くのには適しているが...」のような、手厳しい意見もありました。
未だ多くの記事を調べてはいませんが、FORTRANプログラムの持つ良さ(プログラムを書く側・使う側)が改めて実感されます。
No.2
- 回答日時:
2つも詳しくはないですが、答えれる部分のみ書いておきます。
1. 少なくとも20代のSEの間では化石扱いされています。
2. 「(割り切れないような)演算をしていくうちに誤差が出てきて、最終的な値が極端に狂うかどうか」と言う意味ならば、
シンボリック計算が実装されているので、最終的な値を、ある精度で丸めることはできると思います。
そうではなく、C言語のような誤差を予め考慮した演算を任意の桁数で連続で行いたいという意味ならば、
digitsによって演算精度を予め決めておくことで可能なようです。
3. 企業でも用いられています。知っている範囲では車関係の実験、制御が多いです。
4. あまり詳しくはないので、個人的な意見を言わせて戴くと、
「言語屋としてはとっつきにくいソフト」です。
知り合いの実験屋は重宝しているようです。
回答ありがとうございます。
現在のプログラムは、蒸気・水の質量流量や電気出力を、0.01%の精度で収束するように繰り返し計算をさせています。演算結果は単なる結果ではなく、それが保証値となることがあります。
MATLABを使った自社開発か、市販ソフトのカスタマイズの両案で考えてみたいと思います。
No.1
- 回答日時:
FORTRANの数値計算の後、研究者になってリタイアした者です。
1 古い古くないで言えば、一番古い高級言語ですね。
70年代から使っているとなるとFPRTRAN66かFORTRAN77で書かれたプログラムでしょうから、最近のアーキテクチャではチューニングが難しいと思います。特にFORTRAN66にはIF-THEN-ELSE構文がありませんから、論理構造がIF文による条件分岐か、計算型、割り当て型のGOTO文で構成されているはずで、これらの構文は構造化プログラムの領域外で、チューニングツールが対応していません。まあ、ダイクストラが構造化プログラミングを出版したのが1967年ですから、それ以前のFORTRAN66にこういった構造化要素を求めるのは無理でしょう(もっとも、ダイクストラもヴィルトのALGOLでの業績がなければ出来なかったでしょう。ヴィルトが1958年に既にALGOLを作っていたのは驚異です)。
2 誤差を扱うというのはプログラマのセンスで、言語仕様には依存しません。COBOLやPL/Iの十進計算は別ですが、言語仕様にはそもそも誤差の概念がなく、FORTRANもアーキテクチャ依存です。
3 企業ではスパコンを使うこともあるし、継承資産という家達でFORTRANを使っているケースも多いでしょう。また、企業では解析的問題にはNASTRAN、統計的問題ではSASのようなパッケージを使うことも大いです。研究的課題とは違うビヘービアがあります。
4 存じ上げませんが、数式がちゃんと定義されていて、テイラー展開できれば、私なら大概のプログラムはFORTRANで作れます(デバイス制御はアセンブラ併用ですが)。
早速の回答ありがとうございます。
MATLABにしてもソフトは、先ず慣れることだと思っていますが、FORTRANをうまく移植(ではなく、別なプログラムを作る?)できるのか、そこが最大の問題です。
実は、MATLAB採用の背景が分かりません。ただ、これまでの経験では、一つのソフトで多分野に対応できる物は少ないと思っています。FORTRANをMATLABに移植することと、カスタマイズして使える市販ソフトを当たってみることで、会社へ状況報告をしようと考えています。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) FORTRAN77の配列(除算) 2 2023/02/01 14:34
- その他(自然科学) 科学技術計算の仕事について 2 2023/02/04 18:09
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
- 計算機科学 fortranという言語は今でも科学技術計算でPythonと同じくらい使われてると聞いたのですが、そ 10 2022/08/25 00:43
- 中途・キャリア さて、社会人になってから13年目。 今まで、機械設計、機械製品の品質管理、部門の経営企画をやってきま 4 2023/07/17 08:59
- C言語・C++・C# C言語 3 2022/10/04 15:07
- インターネット広告・アフィリエイト アフェリエイトサイト 作成について 5 2022/05/13 21:31
- その他(プログラミング・Web制作) マウスオーバー→ホイール回転でスクロールできない 2 2022/10/31 10:06
- C言語・C++・C# numpyスライス機能を使った数値計算 2 2023/05/08 16:01
- システム CPUの問題について 2 2022/07/09 12:04
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで数字を入力すると自...
-
変形四角形の面積を計算するソフト
-
回転体の体積を求める方法
-
DRA-CADの計算機能につ...
-
エクセルの枠の複数選択
-
EXCELで2つの数値のうち大きい...
-
エクセルで二つの数字の小さい...
-
Excelで隣のセルと同じ内容に列...
-
スマートな関数を教えて下さい。
-
PowerPointで表の1つの列だけ...
-
エクセルで、2種類のデータを...
-
関数を教えて下さい。
-
エクセルのオートフィルタで最...
-
エクセルでオートフィルタのボ...
-
エクセルで最初のスペースまで...
-
SUMIFとCOUNTIFを合わせたよう...
-
「B列が日曜の場合」C列に/...
-
2つのエクセルのデータを同じよ...
-
エクセルで時刻(8:00~20:00)...
-
エクセル 時間帯の重複の有無
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセル 重なる時間の計算方法
-
エクセルで数字を入力すると自...
-
変形四角形の面積を計算するソフト
-
Excelについて質問があります。...
-
エクセルで1:00の90分後...
-
Excelでこんな関数ありませんか...
-
回転体の体積を求める方法
-
JWCAD勾配入力方法
-
エクセルで残業時間を時間帯に...
-
ファイルメーカー(File Maker...
-
勤怠管理で始業時刻を基準に計...
-
Excelについて教えてください。...
-
エクセルで年月期間を4桁表示...
-
a1=1/5,an+1=an/4an-1 おしえて...
-
(int)/(int)=(double)にする方法
-
エクセルの枠の複数選択
-
Excel関数で小数点になる前まで...
-
エクセル関数の意味は?
-
DRA-CADの計算機能につ...
-
EXCELで2つの数値のうち大きい...
おすすめ情報