ルンゲクッタ法による数値計算の高速化

このQ&Aのポイント
  • C言語で4次のルンゲクッタ法を使用し、非線形連立微分方程式を計算するプログラムを作成しました。
  • 計算結果は指数関数的なグラフであり、ファイル軽量化と高速化のために必要なデータのみを抜粋して保存しています。
  • 調査の結果、Adaptive Runge-Kutta法を使用することで計算の高速化が可能なことが分かりました。具体的なC言語での実装方法について教えてください。
回答を見る
  • ベストアンサー

ルンゲクッタ法による数値計算の高速化(C言語)

C言語にて4次のルンゲクッタ法で 次の非線形連立微分方程式を計算するプログラムを作りました。(添付画像) 出力される計算結果は、 ある時点で変数xが指数関数で立ち上がり、また指数関数で立ち下がるグラフです。 ファイル軽量化と高速化のため、必要なデータ(x > 1E-5)だけ抜粋しsaveしています。 下記リンクのサイトを元に、 逐次計算→CSVファイル出力するプログラムは作れたのですが、 計算に時間が掛かり過ぎて困っています。 http://hooktail.org/computer/index.php?Runge-Kutta%CB%A1 ネットで調べると高速化の手法として、 Adaptive Runge-Kutta法というものがあり、 変化量が小さい区間はステップを大きく取り、 変化量が大きくなるとステップを細かくするという手法があると知りました。 ただし英語文献はいくつか見つかりましたが、具体的なCでの実装方法がわかりません。 Adaptive Runge-KuttaのC言語での実装方法についてお教えください。

質問者が選んだベストアンサー

  • ベストアンサー
  • f272
  • ベストアンサー率46% (7995/17093)
回答No.1

numerical recipe in cの16章2項がadaptive stepsize control for runge kuttaです。 cのプログラムも載っていますよ。 http://www.aip.de/groups/soe/local/numres/bookcpdf/c16-2.pdf

www-www-www
質問者

お礼

的確な回答、誠にありがとうございました。 文献を参考にプログラムを書いてみます。

関連するQ&A

  • オイラー法、2次ルンゲクッタ法、4次ルンゲクッタ法のC言語プログラムに

    オイラー法、2次ルンゲクッタ法、4次ルンゲクッタ法のC言語プログラムについて教えてください! 課題なのですが、まったくわからず困ってます>< 1 常微分方程式 dy/dx=f(x,y),y(0)=1 の数値解をオイラー法を用いて計算するプログラムを作為せよ。ただし、f(x,y)=3-6x^2-4x+2xyとする。 2 α=1,β=1,γ=1/2,σ=1/2 の場合の2次ルンゲクッタ法を考える。1と同じ常微分方程式(f(x,y)も同じ)を考え、その数値解を求めるプログラムを作成せよ。また、オイラー法と2次ルンゲクッタ法の実行結果を示して、2つの近似精度を比較せよ。 3 1と同じ常微分方程式(f(x,y)も同じ)を考え、その数値解を4次ルンゲクッタ法を使って求めるプログラムを作成せよ。また、オイラー法、2次ルンゲクッタ法、4次ルンゲクッタ法の実行結果を示して、3つの近似精度を比較せよ。 以上の3つです。 休んでいた自分が悪いのですが、ネットで調べてもよくわからなくて… わかる方、よろしくおねがいします…

  • C言語による数値計算について

    C言語による数値計算について 研究で使うため、C言語による数値計算を覚えたいのですが、何をしたらいいかわかりません。 一応わからなくてもやってみたらいいとか言われますが、そんなこと言われても、なにをしたらいいかわからないのです。できるようになるビジョンも見えません。 よくわかるCとかいろいろ参考書はありますが、別に数値計算用に書かれたものではないですし、つながりが見えませんし、まず数値計算を抜きにしてプログラミングというものを覚えようとしても、本に書いてあることが、全く謎でとっかかりがありません。 数値計算の本を見てみると、プログラミングとか全く関係なしに数値計算の手法を書いてあるものとか、最後に付録としてできあがったプログラミングが書かれているだけとかで全く手順がわかりません。 どうしたらいいのでしょうか?アドバイスをお願いします。

  • C言語のプログラミング教えて!!

    C言語で次の二つの微分方程式 y'=yの解をx=0~1の範囲 y'=-4yの解をx=0~4の範囲 を、Heun法、Runge-Kutta法により求めるプログラムを作りたい。 初期条件はx=0,y=1で、また、間隔Δxを変えたときの解の変化も調べたい。全くわからずお手上げ状態です。 分かる方がいましたら、回答よろしくお願いします。

  • 数値計算に適している言語

    物理実験で得たデータの計算処理や株価の予測系などの数値計算システムを作りたいのですが、PHP、Perl、Java、C#、VBのうちどれが適切なのでしょうか。 単純な平均を求めたりといったものから、高速フーリエ変換などを実装したいと考えています。 上記それぞれのシステム言語のメリット・デメリットなどがわかるとなお嬉しいです。 自分が取り扱えるシステム言語が上記のため、もっとその他にも候補があるかもしれませんが、ひとまずこの内容で比較情報いただけると幸いです。 よろしくお願いします。

  • C言語

    C言語による課題です.指数関数のマクローリン展開について,第n項までの近似値を求めるプログラムを作成し,各ステップごとに理論値との誤差を比較しなさい.(xとnは任意の値で自分で入力する.) 宜しくお願いします.

  • 次の連立微分方程式の解をRunge-Kutta法で

    dR/dt=102-(R-V)*0.019 dP/dt=(R-P)*0.019 dL/dt=(P-L)*0.007 dA/dt=(L-A)*0.033 dC/dt=(A-C)*0.004 dV/dt=(C-V)*0.001 この連立微分方程式の解をRunge-Kutta法で導き出し 関数Aの時間的変動をグラフ化したいのですが C言語で作成したプログラムを実行しても想定外の結果となってしまいます (想定:t=0からt=12あたりまでAは増加し、ピークを迎えた後減少する) というのも、とある論文を基に数値シミュレーションを試みている状況なのです Runge-Kuttaの理論に関してはWikipediaやPukiwikiを参照しました プログラムの実装で参考にしたWebは http://www.geocities.jp/supermisosan/rksimultaneousequation.html http://www.330k.info/essay/Explicit-Runge-Kutta-Butcher-Tableau などの”古典的Runge-Kutta”という部分を参考にしました 実際VC++6.0で作成したプログラムも添付したいと思います Runge-Kutta法の使い方(根本)から間違っているのか? プログラムのコードが間違っているのか? ご教授いただけますでしょうか

  • C言語とアセンブラ言語による計算プログラミング

    "AB間の距離を求めなさい。" 下の画像において、AC=r1、BC=r2、∠ACB=α°とするとき、AB間の距離dを求めなさい。 上記の問題について困っております。 この問題の解答については、C言語とアセンブラ言語によるプログラミングで考えるようになっており、FPU(MATH COPROCESSOR)を使用し、C言語側で変数や関数宣言、printfなどでの計算結果出力を記述し、アセンブラ言語側で計算するプログラム問題です。 原則として、C言語側で計算してはいけない仕様になっています。 そして、2つのオブジェクトファイルをリンクさせ、実行可能ファイル(.exe)を作成し、コマンドプロンプト に計算結果を表示する。とういう問題です。 ・アセンブラ言語側での使用する命令のプロセッサアーキテクチャのタイプは「.386」 ・作成するオブジェクトのメモリモデルは、Windowsなので「FLAT」 図の画像は添付してあるので、どうかご回答のほどよろしくお願い致します。

  • Javaによる数値計算 高速化

    大きな2次元配列を使った数値計算を実施しています。 これまではFortranをメインで使用していましたが、モデルへの機能追加などが容易なことから オブジェクト指向言語に取り組み、ようやくJavaに移植が完了しました。 事前に調べた所では、Fortran、C++、Javaいずれも速度に大きな差は無いとありました。 (そもそもこれは本当でしょうか?) 1~2割程度遅いのなら許容出来るつもりでしたが、いざ実行してみると、 Fortranで3ステップ進む時にJavaでようやく1ステップ進むといった感じで、少々困っております。 ⇒ そんなことあり得ないということであれば、自分のプログラムのバグを疑いますが。ただ、計算結果は概ね良好のようです。 それで、気になったのが、Fortranでは、コンパイル時に最適化してくれるのですが、 今調べたところJavaにはそれがないようです。 言われてみると、Fortranで最適化オプションを実施しなかった時にはこのくらいの遅さだったように思えます。 それで、前置きが長くなりましたが、Javaで最適化あるいは高速化する方法は無いのでしょうか? プログラミング自体が専門ではないので、できれば人間に分かりやすいコーディングのまま使いたいのですが。 初心者が陥りがちなところで、これを直せば、だいぶ速くなるというような一般的な注意事項などありましたら教えていただきたく存じます。

    • ベストアンサー
    • Java
  • Runge-Kutta,Runge-Kutta-Gillの二つの計算結果を比較して表示

    常微分方程式 dy/dx=1+y/x を下記の条件で解くというものです。 初期値x=1,y=1   計算区間(きざみ幅)h=0.05   計算区間[0,2]   真値 y=x(log|x|+1) Runge-Kutta法とRunge-Kutta-Gill法の2つの数値計算方法を用いて、計算結果を比較するプログラムを作るというものです。それぞれ表示させるのはxの値、yの値、真値、誤差です。Runge-Kutta法とRunge-Kutta-Gill法はユーザー関数にします。 初心者なのにこんな難しい課題だされて本当に困っています。自分でもがんばってプログラムを作ったのですが、表示させるのがうまくいきませんでした。計算結果を表示させるプログラムはメイン関数に置くのですか?それともユーザー関数に置くのですか?どなたか教えてください!よろしくお願いします。

  • 離散フーリエ変換をC言語でどの様に書けばいいですか?

    C言語でDFT離散フーリエ変換を書くにはどの様に書けばよろしいですか? Googleで検索すれば書き方は出てくるのですが、使ってる関数がいまいちよく分かりません。 ・データの入力 ↓ ・フーリエ変換の計算 ↓ ・結果の出力というのをやればいいのは理解できるのですが、C言語でどの様に書けばいいか分からなくて…

専門家に質問してみよう