どなたか、次のFORTRANのプログラムを、Cに、翻訳して頂けないでしょうか。C++ではなく、Cです。ANSI準拠のCでお願いします。
プログラムの内容は、最小二乗法による計算プログラムです。MS-DOS Ver3.3~6.0の頃の、MS FORTRANコンパイラ仕様のものです。その頃持っていたFORTRANの本も処分してしまい、今からFORTRANを学びなおすのにも多大な労力と時間がかかりそうなので、Cに翻訳して頂ければ大変ありがたいです。よろしくお願いします。
(“□”はタブ)
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
C□LEAST SQUARE APPROXIMATION
□PROGRAM MAIN9
□DIMENSION X(100),Y(100),S(0:18),T(0:9),SM(10,10),TV(10),AV(10)
□WRITE(*,*) 'N ?'
□READ(*,*) N
□WRITE(*,*) 'x1,x2,..,xn ?'
□READ(*,*) ( X(I),I=1,N )
□WRITE(*,*) 'y1,y2,..,yn ?'
□READ(*,*) ( Y(I),I=1,N )
□WRITE(*,*) 'M ?'
□READ(*,*) M
□DO 110 K=0,M*2
□□VS=0.
□□DO 100 I=1,N
□100□VS=VS+X(I)**K
□□S(K)=VS
□110□CONTINUE
□□DO 130 K=0,M
□□□VS=0.
□□□DO 120 I=1,N
□120□VS=VS+Y(I)*X(I)**K
□□□T(K)=VS
□130 CONTINUE
□□DO 140 I=1,M+1
□□□DO 140 J=1,M+1
□□□□K=I+J-2
□□□□SM(I,J)=S(K)
□140 CONTINUE
□□DO 150 I=1,M+1
□150 TV(I)=T(I-1)
□□CALL SIMULE( AV, SM, TV, M+1 )
□□DO 160 I=1,M+1
□160 WRITE(*,1000) I-1,AV(I)
□1000 FORMAT(1H ,'A',I1,'=',F10.5)
□□STOP
□□END
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
No.1
- 回答日時:
f2cを使う
http://www.netlib.org/f2c/
CコンパイラにGCCを使っているのなら、gfortranを使う。
https://gcc.gnu.org/wiki/GFortran
No.3
- 回答日時:
追記です。
試しにやってみましたが
CALL SIMULE( AV, SM, TV, M+1 )
が最終的にコンパイルできませんでした。
おそらく、連立方程式を解くサブルーチンかと思われますが、それが既存のライブラリのものか、自作のものかがわかりません。
simuleを用意しなければならない、という意味からも、Cで最初から書く方が楽かもしれません。
どうも、お礼をしない間にいろいろしていただいて、誠にありがとうございます。
自分でもソースを見直してみて、“SIMULE”の部分だけ他とつながらないことに気づき、ほかのソースを探したところ、見つかりました。
(“□”はタブ)
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
C□SIMULTANEOUS LINEAR EQ. BY LU-METHOD
□□SUBROUTINE SIMULE( X,A,BV,N )
□□REAL X(10),A(10,10),BV(10),L(10,10),U(10,10),Y(10),WV(10)
□□CALL LUDCOM( L,U,A,N )
□□CALL OUTMAT( L,N,N,' L(i,j) ')
□□CALL OUTMAT( U,N,N,' U(i,j) ')
□□DO 110 I=1,N
□□□WV(I)=0.0
□□□DO 100 M=1,I-1
□100 WV(I)=WV(I)+L(I,M)*Y(M)
□□□Y(I)=BV(I)-WV(I)
□110 CONTINUE
□□X(N)=Y(N)/U(N,N)
□□DO 130 I=N-1,1,-1
□□□WV(I)=0.0
□□□DO 120 M=I+1,N
□120 WV(I)=WV(I)+U(I,M)*X(M)
□□□X(I)=(Y(I)-WV(I))/U(I,I)
□130 CONTINUE
□□RETURN
□□END
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
です。
“LUDCOM”
“OUTMAT”
というサブルーチンが新たに出てきましたが、異なるソースにまたがった場合、どう対処すればよいのでしょうか。自分でもやってみようと思います。
No.4
- 回答日時:
「異なるソースにまたがる」ってのは, 何が「またがる」んでしょうか?
C で複数のソースから 1つの実行ファイルを作ることができるってのは, 当然知ってますよね?
具体的に、先の回答者さんがご教示くださった方法について、詳細にその使い方をお伺いしたいわけで、無用な揚げ足取りはご遠慮ください。今は、FORTRANのソースからの翻訳の仕方の話です。
サブルーチンLUDCOMとOUTMATのソースが見つかりました。No.1さん、もしご覧でしたら、コンパイルをお願いできますでしょうか。もしくは、上述の通りコンパイルの仕方を詳細にご教授くださいませんか。よろしくお願い致します。
(“□”はタブ)
LUDCOM
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
C□□LU DECOMPOSITION OF A MATRIX A(N,N)
□□□SUBROUTINE LUDCOM( L,U,A,N )
□□□REAL L(10,10),U(10,10),A(10,10),WM(10,10)
□□□DO 100 K=1,N
□□□L(K,K)=1.0
□100 U(1,K)=A(1,K)
□□□DO 150 I=2,N
□□□□DO 120 J=1,I-1
□□□□□WM(I,J)=0.0
□□□□□DO 110 M=1,J-1
□110 WM(I,J)=WM(I,J)+L(I,M)*U(M,J)
□□□□□L(I,J)=(A(I,J)-WM(I,J))/U(J,J)
□120 CONTINUE
□□□□DO 140 J=I,N
□□□□□WM(I,J)=0.0
□□□□□DO 130 M=1,I-1
□130 WM(I,J)=WM(I,J)+L(I,M)*U(M,J)
□□□□□U(I,J)=A(I,J)-WM(I,J)
□140 CONTINUE
□150 CONTINUE
□□□RETURN
□□□END
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
OUTMAT
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
C OUTPUT OF A MATRIX A(N,M)
□□□SUBROUTINE OUTMAT( A,N,M,CHR )
□□□DIMENSION A(10,10)
□□□CHARACTER CHR*10
□□□WRITE(*,*) CHR
□□□DO 100 I=1,N
□100 WRITE(*,1000) ( A(I,J),J=1,M )
□□□WRITE(*,*)
□1000 FORMAT(1H ,10F10.4)
□□□RETURN
□END
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
No.5ベストアンサー
- 回答日時:
念の為に書いておきますが、私は #2の「最小二乗近似が目的なら、このFortranのプログラムを捨てて、最初からC言語で書く。
あるいは、数値演算を得意とするツール(R,MATLAB等)を使う」が最適解だと思っています。紹介だけしておいて、それはまったく動かなかった、というのはあまり好きではないので、動作客員しただけで、f2cを積極的にするめているわけではありません。
f2cは、C言語に変換されるのですから、あとは、C言語で定番の分割コンパイル→リンクでできるような気はします。
VisualCを使うなら、プロジェクトに追加することになるでしょう。
gfortranもGCCの一部なので、-cオプションでオブジェクトファイルにして、最後にリンクすればいいように思います。
または、gfortran a.f b.f c.f 等とソースファイル名を並べるだけでいいような気もします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) FORTRAN77の配列(除算) 2 2023/02/01 14:34
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- Visual Basic(VBA) vba GetAsyncKeyState関数について 1 2023/08/24 12:08
- 中学校 Do you want a new bag? Want you a new bag? この二つの違い 3 2022/07/30 15:55
- その他(SNS・コミュニケーションサービス) 自分のpcがハッキングされたようなメールが来たのですがどうすればいいですか? 4 2022/10/02 16:14
- 英語 2つの英文の違いについて教えて下さい。 2 2022/03/30 16:33
- 英語 enough 名詞 to do 2 2023/08/09 22:50
- その他(プログラミング・Web制作) Fortranでの出力ファイル 2 2023/03/21 21:25
- 英語 do everything you wantとは 3 2023/06/18 22:40
- 工学 導電率σ、抵抗率ρをもとめよ。 多数キャリア密度n=1×10^21【m^-3】 少数キャリア密度p= 2 2023/05/09 18:44
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
0除算して、落ちるプログラムと...
-
C++ で、「)」が必要 というエ...
-
コンパイルできない
-
変数(関数)名の頭に_
-
Eclipseの環境設定について
-
コンパイラについて
-
io.hをincludeするとそのような...
-
PICマイコンによる乱数の表示に...
-
C言語
-
Visual C++とVisual C++.NETの違い
-
Windows環境でgnu系コンパイラ...
-
FORTRANとC++の連動について
-
C++でアボート(Abort)で処理が...
-
IPアドレス表示プログラム
-
timeBeginPeriod()関数が使え...
-
fortranでのNaNについて
-
C言語のワーニングメッセージの...
-
[コンパイラのパス(W)]
-
Photoshopで、できますか?
-
mod でうまく
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
0除算して、落ちるプログラムと...
-
C++ で、「)」が必要 というエ...
-
コンパイルできない
-
C++でアボート(Abort)で処理が...
-
変数(関数)名の頭に_
-
Visual C++とVisual C++.NETの違い
-
Eclipseの環境設定について
-
volatile修飾について
-
コンパイラについて
-
linuxのセキュリティ対策と致し...
-
__extension__
-
io.hをincludeするとそのような...
-
コンパイラフラグ(compiler fla...
-
PICマイコンによる乱数の表示に...
-
conio.h? curses.h?
-
【エラー】Cpadで初めてコンパイル
-
ABAQUS ユーザーサブルーチン...
-
関数の戻り値による変数の初期化
-
Delphiの逆コンパイル
-
プリコンパイラとは?
おすすめ情報