楕円積分を数値計算で求めようとしています。
Fortranを使っているのですが、まずニューメリカルレシピinCをFortranに直して実行しました。
きちんと翻訳して直したはずなので、それなりの値が出るのですが、どうも誤差が大きいようです。
それはMathematicaでの組み込み関数による計算と比較したことによります。どちらがより近いのかはわからないのですが・・・。(Mathematicaでの計算は正しい(かなり近い)値を返してくれているのでしょうか?どなたか知っておられたらそちらも教えていただけるとありがたいです。どの程度信用できるのか。。。)
どちらにせよ、いいプログラムはないでしょうか?
ちょっと難しいかもしれませんが、よろしくお願いします。

このQ&Aに関連する最新のQ&A

翻訳 比較」に関するQ&A: 翻訳ソフトの比較

A 回答 (1件)

わざわざ翻訳しなくても


Numerical Recipes in Fortranを
使えばよいのでは

参考URL:http://www.library.cornell.edu/nr/
    • good
    • 0
この回答へのお礼

はい、もちろんそうしようと思ってみたのですが、同じプログラムが見つからなかったんです。
日本語版の方では内容が違うようで。。。(他な項はきちんとそのまま直訳してあるのですが。)
でも、よく見たら見つけることができました。
+Mathematicaと答えが違うと質問に書いてしまいましたが、kの定義がMathematicaとその他の本やプログラムで違うことに気づき、僕の勘違いでした。
両方ちゃんと信用できる値が返ってきます。
ありがとうございました。

お礼日時:2005/04/21 13:58

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q[C言語]コンソールからのデータ入力時の誤動作の回避方法

趣味でプログラミングをしております。
環境は、以下です。
Windows10
Mingw-w64
gcc version 5.2.0 (Rev4, Built by MSYS2 project)

https://oshiete.goo.ne.jp/qa/9287118.htmlの回答2にて、
3つの数字を入力し、数字でない場合は再入力を促すプログラムを提示しました。
これについて、他の回答者様より「fflush(stdin); は一般にはやっていけない操作」との回答をいただきました。

私の環境では、fflush(stdin)を使用しないと以下の様に1回目に誤ったデータを入力すると、再入力時のメッセージが2回繰り返し表示されます。
(推測ですが、windowsで改行コードが2Byteであることから発生しているのではと考えています)

fflush(stdin)を使用しないで、この問題を回避する適切な方法がありましたらご教示ください。

よろしくお願いします。


----------実行結果(fflush(stdin)を使用しない場合)
$ ./a.exe
重複しない3つの数字:abc
重複しない3つの数字:重複しない3つの数字:abc
重複しない3つの数字:重複しない3つの数字:
----------


----------ソース
#include <ctype.h>

#define BUF_SIZE 3 // 3文字

int main(void){
char buf[BUF_SIZE + 1];
int user;

while(1){
fflush(stdin);
printf("重複しない3つの数字:");
fflush(stdout);

fgets(buf, BUF_SIZE + 1, stdin);
if(!isdigit(buf[0])) continue; // 1文字目が数字かチェック
if(!isdigit(buf[1])) continue; // 2文字目が数字かチェック
if(!isdigit(buf[2])) continue; // 3文字目が数字かチェック
break;
}
user = atoi(buf);
printf("number : %d", user);

return 0;
}
----------

趣味でプログラミングをしております。
環境は、以下です。
Windows10
Mingw-w64
gcc version 5.2.0 (Rev4, Built by MSYS2 project)

https://oshiete.goo.ne.jp/qa/9287118.htmlの回答2にて、
3つの数字を入力し、数字でない場合は再入力を促すプログラムを提示しました。
これについて、他の回答者様より「fflush(stdin); は一般にはやっていけない操作」との回答をいただきました。

私の環境では、fflush(stdin)を使用しないと以下の様に1回目に誤ったデータを入力すると、再入力時のメッセージが2...続きを読む

Aベストアンサー

>他の回答者様より「fflush(stdin); は一般にはやっていけない操作」との回答をいただきました。

規格にstdinに対して実施した場合の動作が明記されていないから。
だったかと。
実装依存する。ということです。


>推測ですが、windowsで改行コードが2Byteであることから発生しているのではと考えています

ライブラリー依存でしょうかね。
¥rと¥nの両方をfgets()が改行として処理したのかも知れません。
gccだし。

>fflush(stdin)を使用しないで、この問題を回避する適切な方法がありましたらご教示ください。

読み込み用のバッファをもう少し大きく用意する。でしょうか。

1回目、"abc"を読み込みます。
第2引数で指定した3バイトに達したため。
stdinのバッファには¥rと¥nが残ってます。

2回目、¥rを読み込みます。
fgets()の仕様により改行コードに到達したため。

1回目の読み込みで残るのに注意です。
# 2回目で¥rだけなのか¥r¥nなのか、はたまた¥r¥nが¥nに変換されるのか…はfgets()の後で内容確認してください。

>他の回答者様より「fflush(stdin); は一般にはやっていけない操作」との回答をいただきました。

規格にstdinに対して実施した場合の動作が明記されていないから。
だったかと。
実装依存する。ということです。


>推測ですが、windowsで改行コードが2Byteであることから発生しているのではと考えています

ライブラリー依存でしょうかね。
¥rと¥nの両方をfgets()が改行として処理したのかも知れません。
gccだし。

>fflush(stdin)を使用しないで、この問題を回避する適切な方法がありましたらご教示ください。...続きを読む

Qfortranプログラミングでの数値計算と可視化環

現在fortran77により数値計算し、可視化する環境を探しています。素人なので、アドバイス頂ければ幸いです。

背景:matlabで既にプログラム済みファイルを、fortranで書き直したい。プログラムは数値計算をしてその結果をグラフ(2D,3D)で可視化する物。matlab環境では計算時間がかかる為、fortranで時間短縮したい。

環境:Win XPへ所有しているマイクロソフトビジュアルFortran77(Ver調査中。7年くらい前の物)をインストールして、それを使おうと考えています。

疑問:どうやって計算結果を可視化するか?ポストプロセッサーとして、gnueplotやmatlabを使用するのは可能だと思うがそれが一番効率的なのでしょうか?ビジュアルFortranには可視化ライブラリみたいな物があるのでしょうか?

不足情報あればアップいたします。初心者ですが、アドバイスを宜しくお願いします。

追伸:研究室の過去の資産の関係でFortranを考えています。多言語でのメリットもあれば教えて頂たいですが、基本古い言語使用に対する中傷「のみ」はご遠慮下さい。

現在fortran77により数値計算し、可視化する環境を探しています。素人なので、アドバイス頂ければ幸いです。

背景:matlabで既にプログラム済みファイルを、fortranで書き直したい。プログラムは数値計算をしてその結果をグラフ(2D,3D)で可視化する物。matlab環境では計算時間がかかる為、fortranで時間短縮したい。

環境:Win XPへ所有しているマイクロソフトビジュアルFortran77(Ver調査中。7年くらい前の物)をインストールして、それを使おうと考えています。

疑問:どうやって計算結果を可視化...続きを読む

Aベストアンサー

MATLAB から C や FORTRAN の関数を呼び出すことも出来ます。

http://www.mathworks.ch/help/techdoc/matlab_external/f23224.html

高速化したい部分だけ外に出して,
結果を MATLAB で受け取って表示したり出来ます。

QC言語Char型配列に小数値を入れる方法

C言語Char型配列に小数値を入れる方法について質問なんですが、
分からなく質問させていただきました。

(例)23.8を

float f = 23.8
char c[100];

cの配列の中に23.8を入れる

c[0] = '2'
c[1] = '3'
c[2] = '.'
c[4] = '8'
c[5] = '\0'


上記みたいに入ってほしいんですが、そういうC言語の関数ありますか?
itoaやsprintfを使わないでお願いします。

Aベストアンサー

> いえ、HEWで作成していて itoaとsprintfが使用できなくて質問しました

マイコンが何か、またツールチェインが何か知りませんが、いずれにせよsprintfが使えるはずです。
メモリが足りないということでしょうか?

必要な情報は小出しにせず、すべて明らかにしてください。

Qfortranで積分範囲を求める。

今、S=∮3/4(1+cos^2(x))dx [0,theta]という式があります。

Sはわかっていて、求めたいのは、積分範囲のthetaです。

fortranで台形を使った積分式を求める式はわかるのですが、
その場合だと、積分区間がわかっていて、微小にわけて計算するので、
今回のように、積分区間のthetaを求める方法がわかりません。

どなたか、わかる方がいらっしゃったらご指導お願いします。

Aベストアンサー

基本的には「theta を求めるために方程式を解く」ことになります.

この問題に関しては「不定積分しろ」ですが.

QC言語はC言語でできている?

C言語はC言語でできている?

C言語はC言語でできていると耳にしたことがあります。

一体どういうことですか?

詳しく教えて下さい。

Aベストアンサー

歴史的な経緯を考えれば解ると思います。

当初は機械語でプログラミングをしていました。
それがアセンブラに変わります。
アセンブラでコンパイラが作成され、高級言語が作られていきます。
アセンブラまたは、高級言語の1つを使って、C言語用のコンパイラが作成されたとします。
今度は、そのC言語用のコンパイラを使用して開発ができるわけです。
ですので、そのC言語用のコンパイラを使用して、
C言語用の別のコンパイラを作成することも可能になります。

おそらく質問者さんの聞かれていることはこのことだと思います。

他の例では、MSは、VisualStudioで、次のバージョンのVisulaStudioを開発しています。
ややこしいですね。><

Qfortranによる数値計算について

gfortran を使用しています。
配列のサイズが大きすぎるとき、セグメンテーション違反になります。
スタックサイズを変更すると、可能になる場合もあるのですが、
それでも追いつかない場合、次にするべき方法はどのようなものがありますか?

ちなみに、Linuxを使用しています。
Bシェル?です。→これが何かくわしくわかりませんが、多分これです。

Aベストアンサー

allocate?

QネットワークエンジニアにC言語は必要でしょうか?

ITスキルを身につけようと思い、派遣会社に就職した者です。
特定派遣といって、派遣会社の正社員として企業に派遣されるそうです。なんかややこしいですね。

最初はPG、SEを目指す方向でC言語と基本情報技術者の勉強をしていたのですが、求人の都合や時期的な都合もありネットワークエンジニアを目指すことになりました。
せっかく勉強したC言語ですがネットワークエンジニアには必要ないのでしょうか?

あと、PG・SEとネットワークエンジニアはどちらのほうが給料が高いのでしょうか?
出来ればやりがいや大変さなども教えてほしいです。

質問が多くてすみませんが、TCP/IP を勉強するのに何かいい参考書があったら教えてほしいです。

よろしくお願いします。

Aベストアンサー

> 特定派遣といって、(略)なんかややこしいですね。

業界的にはわりとよくある話です。実質は一般派遣と大差ない待遇が多いです。

> せっかく勉強したC言語ですがネットワークエンジニアには
> 必要ないのでしょうか?

一言にネットワークエンジニアといってもピンきりですので。
ソフト屋と接点のある業務なら有用でしょうし、
ハード側でネットワーク設計/敷設ならあまり役に立たないかも知れません。(考え方を知ってて無駄にはなりませんが)

> あと、PG・SEとネットワークエンジニアはどちらのほうが給料が高いのでしょうか?

会社によってピンきりです。同じことやっても会社が上流なほど高給になる可能性が高いです。
ありがちな二次請、三次請などの特定派遣だと、
・"俗にPGと呼ばれる作業員"が多分一番安いです。
 (似て見えてもプログラマ(≠PG:設計/実装等の専門家)はもっと高給で普通)
・SEとは名ばかりの実質PG(結構います)はPGと大差ありません。
・ちゃんとしたSE(折衝/要件定義/設計等の専門家)はそれなりの高給なのが普通です。
 (が、派遣でこれらの業務をやらせてもらえる機会は少ないかも
  派遣であれば、"リーダクラス"などと呼ばれる中間管理職相当?)
・ネットワークは敷設作業員ならPG並み、設計できる上級者はSE並みなのでは。
あとは、残業や資格などの手当て次第になるかと思います。

> TCP/IP を勉強するのに何かいい参考書があったら教えてほしいです。

理解度によります。初心者に毛が生えた程度なら「TCP/IPの絵本」くらいからがいいかもしれませんし…。
いずれにせよ、書籍は自分の目で確認して納得したものを買うべきです。

> 特定派遣といって、(略)なんかややこしいですね。

業界的にはわりとよくある話です。実質は一般派遣と大差ない待遇が多いです。

> せっかく勉強したC言語ですがネットワークエンジニアには
> 必要ないのでしょうか?

一言にネットワークエンジニアといってもピンきりですので。
ソフト屋と接点のある業務なら有用でしょうし、
ハード側でネットワーク設計/敷設ならあまり役に立たないかも知れません。(考え方を知ってて無駄にはなりませんが)

> あと、PG・SEとネットワークエンジニアはどち...続きを読む

QFortran90/Fortran95→Fortran77

大学の授業でFortranを使ったプログラミングを勉強しています。

以下の文が大学のPCに入っているコンパイラでは問題なくコンパイルでき実行できるのですが、家のPCだとコンパイルすることが出来ません(以下の文でエラーが出ます)
大学のPCの開発環境はFujitsu-FORTRANだと思います(^ ^;
家のPCはSalford FTN77 Personal Edition CompilerとCPad for Salford FTN77を組み合わせて使用しています

なぜエラーがでるのか自分なりに考えた結果、Fortran90/Fortran95のプログラムをFortran77のコンパイラでコンパイルしているからだと思います(全くの勘違いだったら指摘して下さい)

Fortran90/Fortran95の開発環境がフリーで整えばいいのですが、見つからないのでプログラムを修正したいと思います そこで、力を貸していただきたいのです

前置きが長くなりましたが、エラーが出る文は以下のところです
open(8,file='freq_ex13.dat',action='write',status='replace')
ここを、Fortran77のコンパイラでコンパイルできるようにアドバイスを下さい よろしくお願いします

大学の授業でFortranを使ったプログラミングを勉強しています。

以下の文が大学のPCに入っているコンパイラでは問題なくコンパイルでき実行できるのですが、家のPCだとコンパイルすることが出来ません(以下の文でエラーが出ます)
大学のPCの開発環境はFujitsu-FORTRANだと思います(^ ^;
家のPCはSalford FTN77 Personal Edition CompilerとCPad for Salford FTN77を組み合わせて使用しています

なぜエラーがでるのか自分なりに考えた結果、Fortran90/Fortran95のプログラムをFortran77のコンパイラでコン...続きを読む

Aベストアンサー

action='write'を削除してみては?
8番にREADを使わなければいいだけの話です。
http://docs.hp.com/ja/B3908-90007/ch10s65.html#id21163286

Fortranはコンパイラ毎に独自の拡張が相当されてますから、移植する際にはどの拡張が使えるのか把握する必要があります。
使えない場合はコンパイルエラーが返ってくるのですぐにわかりますけど。
http://www.cc.nao.ac.jp/vppman/HTML/japan/langFort/fvp11/fvp00079.htm

参考URL:http://docs.hp.com/ja/B3908-90007/ch10s65.html#id21163286

QwindowsでもC言語を始めたいのですが…

某大学の数学科1回生です。

今までC言語を学んだことが無かったので、最近ASCIIの「C言語入門」
を購入しました。(4月から学校で講義が始まります。)
この入門書を読み進めていくにはUNIX系のOSがあるとスムーズに進行出来るようです。
しかし、僕が使用しているパソコンはwindows7で、
非UNIX系のOSなのでC言語でプログラミングをする環境が整っていません。

そこで、次のサイトhttp://www.ooyashima.net/db/prog.htmでコンパイラと
IDEとテキストエディタを手に入れる必要があります。

windowsのOSでも、UNIX系のOSを用いた時と同様にC言語プログラミングを
可能にするためには、先ほどのサイトで、コンパイラからテキストエディタまで
何を手に入れるのがベストでしょうか?

出来れば無料のソフトが良いです。

C言語やプログラミングに関しては全くの初心者なので、稚拙な文章となり
非常に読み辛かったかと思いますが、回答よろしくお願いいたします。

Aベストアンサー

かなり前にC言語への入門を少々齧った者です。
うーん、初心者様だけに少々混乱しておられるようですね。
若干整理しつつ回答させていただきます。

まず、あなたに必要なのは、
1.「テキストエディタ」(ソースプログラムの作成・編集・閲覧に必要)と、
2.「コンパイラ」(1で作成したプログラムを実行可能な形式へ変換するのに必要)と、
3.「リンカ」(実は2で変換したプログラムは単体じゃ実行できないので、出来合いのライブラリ等とリンクして本当に単体実行可能なプログラムにするのに必要)
です。
ただし、リンカの種類はコンパイラによって決められていることが多く、またリンカがコンパイラに付属していることも多いため、リンカ単体で意識すべきことはあまりありません。

または、
4.「IDE」(「統合開発環境」の略、テキストエディタ機能が内蔵されている上、ボタン押下一発でコンパイルとリンクを自動的にやってくれるので便利)
が必要になります。
コンパイラとリンカはIDEに内蔵されている場合と別途必要な場合がありますが、後者の場合もIDEによってコンパイラとリンカが決め打ちされていることが多いです。
ただし、IDEのテキストエディタ機能は動作が遅かったり、動作に独特の癖があったりして、使い勝手が好みに合わない場合があります。

ご指摘のサイトを参照した限りでは、完全に無料なのは「GNU Compiler」系だけです。他のコンパイラは「市販版コンパイラの勉強用・お試し版」といった位置づけで、「無料だが何か機能的制限がある」と思ってください。ただし「C言語入門書籍のサンプルプログラム作成程度なら、制限には引っかからない」「市販ソフトやそれに準ずる高機能・大規模なソフトを開発する際に、制限を解除された市販版が必要になる」と考えてください。

テキストエディタはいくつか試用しましたが「TeraPad」か「K2Editor」をお勧めしておきます。「EmEditorFree」は有料版「EmEditor」のお試し版で、あまり高機能ではありません(それでもWindows付属「メモ帳」よりは高機能ですが)。

なお「後学のためにも「UNIX環境互換」に強く拘りたい」かつ「3万円以上の初期投資が可能」の条件を満たすならば、自作するなり廉価なパソコンをもう1台購入するなりして、OSごと「Linux」(OSごと無料のUNIX互換OS)に入れ替えるという手段もあります。ややハードルは高いですが、安価な入門書も出版されています。

では、勉強頑張ってください。

かなり前にC言語への入門を少々齧った者です。
うーん、初心者様だけに少々混乱しておられるようですね。
若干整理しつつ回答させていただきます。

まず、あなたに必要なのは、
1.「テキストエディタ」(ソースプログラムの作成・編集・閲覧に必要)と、
2.「コンパイラ」(1で作成したプログラムを実行可能な形式へ変換するのに必要)と、
3.「リンカ」(実は2で変換したプログラムは単体じゃ実行できないので、出来合いのライブラリ等とリンクして本当に単体実行可能なプログラムにするのに必要)
です。
た...続きを読む

Qモンテカルロ法を用いた積分計算のプログラミング

今、指数関数の積分をモンテカルロ法を用いてMatlab上で計算しようとしています。

途中までプログラムを組みましたが、間違っている個所があるようなのです。
rand()の使い方が間違っているのでしょうか?

また、rand()は一様分布に従う疑似乱数を返すという解釈で合ってますでしょうか?
プログラム上にあるX2がとる値の大きさと、randのとる値の大きさは?と聞かれたのですが、
どのように答えていいか分りません。。。

下にプログラムを載せました。
よろしくお願いいたします。

N = 10000; %the number of calculation
a =0; %begin of interval
b =1; %end of interval
c = exp(b); %constant of max
f =0;

for n = 1:N;
X1 = a +rand()*(b-a);
%Generate values from the uniform distribution on the interval [a, b]
X2 = a + rand()*(1-0);
if (c * X2 ) < (exp(X1))
f = f +1; %count the number of point in the area
end

end
y = f*c*(b-a) / N % f/N:ratio of points, c*(b-a):area of integral
Int = exp(b) - exp(a)
err = abs(Int - y)

今、指数関数の積分をモンテカルロ法を用いてMatlab上で計算しようとしています。

途中までプログラムを組みましたが、間違っている個所があるようなのです。
rand()の使い方が間違っているのでしょうか?

また、rand()は一様分布に従う疑似乱数を返すという解釈で合ってますでしょうか?
プログラム上にあるX2がとる値の大きさと、randのとる値の大きさは?と聞かれたのですが、
どのように答えていいか分りません。。。

下にプログラムを載せました。
よろしくお願いいたします。

N = 10000; %the number of...続きを読む

Aベストアンサー

A No.2のKulesです。

Tacosanさんの回答で思い出しました。
そうか、長方形内部の点をランダムにうつからX1,X2は独立した乱数でないといけないですね。
で、今回は(a,0),(b,0),(a,exp(a)),(b,exp(b))を頂点に持つ長方形内にランダムにN点(X1,X2)を打って、
その中でX2<exp(X1)になってるものの数を数える、ということでしょうか。

とりあえずMatlab初心者ということなのでアドバイスのようなものを少し
(これも質問に対する回答からは少しずれていると思いますが)

・配列で何とかできることは配列の形でしてしまう
C言語などではスカラー量しか扱えない関数も、Matlabではベクトルの形で入力することができます。
randでいうと、
http://www.mathworks.co.jp/help/ja_JP/techdoc/ref/rand.html
を見てもわかるとおり、rand(m,n)でm行n列の擬似乱数値の行列を作れます。
よって、今回はforループでN回randを呼び出さなくても、
X1=a+rand(N,1)*(b-a);
でN行1列の一様分布擬似乱数が得られます。

・if文はlogicalを使って書き変えられないか考える
例えば
A=rand(5,1);
B=A<0.5;
とすると、例えばBは
[0;1;0;1;1]のように0or1で表される配列になります。
(B(k)=1(A(k)<0.5),0(else)というようになります)
ということは、これを使えば
sum(B)とすると、「A<0.5となる要素の数」を表すことができます。
(sum(B)は、Bの合計を出します)
このようにすることで、わざわざif文で1つ1つの要素を調べなくても、
一度に調べることができます。


以上より、例えば今回であれば
X1=a+rand(N,1)*(b-a);
X2=0+rand(N,1)*(c-0);
f=sum(X2<exp(X1));
とすれば、forループ部分で求めるべきfは求まります。

まあよっぽど非力なPCを使ってない限り双方の書き方に時間的な差は出ないと思いますし、
Nが極端に大きくなると配列を用意するメモリが足りなくなるので万能ではありませんが。


参考になれば幸いです。

A No.2のKulesです。

Tacosanさんの回答で思い出しました。
そうか、長方形内部の点をランダムにうつからX1,X2は独立した乱数でないといけないですね。
で、今回は(a,0),(b,0),(a,exp(a)),(b,exp(b))を頂点に持つ長方形内にランダムにN点(X1,X2)を打って、
その中でX2<exp(X1)になってるものの数を数える、ということでしょうか。

とりあえずMatlab初心者ということなのでアドバイスのようなものを少し
(これも質問に対する回答からは少しずれていると思いますが)

・配列で何とかできることは配...続きを読む


人気Q&Aランキング

おすすめ情報