近似計算するプログラムと近似計算法の実装方法について

このQ&Aのポイント
  • 近似計算法である4次のRunge-Kutta法を用い、プロット点を一斉にdos画面に表示したい場合、どのようなプログラムにすれば良いのか解説します。
  • 4次のRunge-Kutta法の一部分のプログラムを探し、その実装方法を説明します。
  • 最終的に多数のプロット点をエクセルに出力し、グラフを作成する方法も解説します。
回答を見る
  • ベストアンサー

近似計算するプログラム

近似計算法である4次のRunge-Kutta法を用い、プロット点を一斉にdos画面に表示したい場合、全体的にどのようなプログラムにすれば良いのでしょうか?最終的にはその多数のプロット点をエクセルに出力し、グラフを作りたいと思っています。 何を近似するのかは気にしていないので、色々探したところ、あるサイトから4次のRunge-Kutta法の一部分のプログラムを見つけ、以下のを使用することにしたのです。プログラムは全くの無知なので、どのくらいの量になるのか想像出来ませんが、もし短い容易なプログラムになるのであれば載せて頂けると有難いです。コンパイラはVBC++です。 反復 { v1dt = v(x[j] ) * dt v2dt = v(x[j] + v1dt/2 ) * dt v3dt = v(x[j] + v2dt/2 ) * dt v4dt = v(x[j] + v3dt ) * dt x[j+1] = x[j] + (v1dt + 2*v2dt + 2*v3dt + v4dt)/6 }

noname#5999
noname#5999

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

  • ベストアンサー
  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.1

こちらのような書籍を購入しておくと、後々お役に立つと思います。 C言語による最新アルゴリズム事典 http://www.matsusaka-u.ac.jp/~okumura/algo/ -- > あるサイトから こういうサイトのURLなども提示してくれると、いろいろ参考になるんですが…。 > もし短い容易なプログラムになるのであれば 比較的短いです。 Sinéad page - harm_osc_rk.c http://www.maths.tcd.ie/~ryan/teaching/harm_osc_rk.c.html

参考URL:
http://www.matsusaka-u.ac.jp/~okumura/algo/
noname#5999
質問者

補足

早くのご回答、本当に有難う御座いました。この http://www.maths.tcd.ie/~ryan/teaching/harm_osc_rk.c.html にあるプログラムが、neKo deuxさんが作ってくださったプログラムですよね? 更にお勧めの書籍まで紹介して頂き、大変感謝しています。 >こういうサイトのURLなども提示してくれると、いろいろ参考になるんですが…。 確かに提示すべきでした。申し訳ありません。一応、そのサイトのURLをお教えしますので、そのサイトをneKo deuxさんに見て頂いた上でこのスレッドを締め切らせてもらいますね。 http://www.damp.tottori-u.ac.jp/~ooshida/edu/ode/euler2rk.html

関連するQ&A

  • 数値解シミュレーション

    http://www.damp.tottori-u.ac.jp/~ooshida/edu/ode/euler2rk.html に掲載されていることについてなのですが、そのサイトにも例として載っている物理法則の単純な dx/dt=v , dv/dt=a=f/m の近似を、サイトの下の方に載ってる4次Runge-Kutta法を用いてプログラムで表したいのです。最終的には>out.txtにしてエクセルに取り込んでグラフにしたいのですが、その為には多数の近似のプロット点が必要なのです。4次Runge-Kutta近似による多数のプロット点の値を出すようなプログラムを組んでもらえないでしょうか?知識がないもので宜しくお願いします。コンパイラはVBC++です。 以前似たような質問をして、http://www.maths.tcd.ie/~ryan/teaching/harm_osc_rk.c.html のようなプログラムを組んで頂いたのですが、私の説明不足の為 dx/dt=v , dv/dt=a=f/m の近似にはなっていないようなので、改めて質問させて頂きました。

  • 次の連立微分方程式の解を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法の使い方(根本)から間違っているのか? プログラムのコードが間違っているのか? ご教授いただけますでしょうか

  • 方程式の計算を教えることになったのですが...

    y'=y+x^2 , y(0)=1 のときのy(3)の値をEuler法およびRunge-Kutta法により求める問題を教えることになったのですが、分かりやすくプログラムを教えるためにはどういう風に教えればいいのでしょうか? 皆さんの考えを教えてください。

  • プログラムについて

    2つの微分方程式をEuler法、Heun法、Runge-Kutta法により求める。また、間隔Δxを変えたときの解の変化を調べたい。ただし、初期条件はx=0,y=1とする。分かる方がいましたら、回答よろしくお願いします。

  • 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法はユーザー関数にします。 初心者なのにこんな難しい課題だされて本当に困っています。自分でもがんばってプログラムを作ったのですが、表示させるのがうまくいきませんでした。計算結果を表示させるプログラムはメイン関数に置くのですか?それともユーザー関数に置くのですか?どなたか教えてください!よろしくお願いします。

  • 近似式。

    xとyからなるデータを複数とって、グラフ上にプロットすると、点が散在しながらも、なにがしかのまとまりがあって、そのデータを何かの曲線y=f(x)に近似したくなったとします。 しかし、何に近似していいかは分かりません。 何かの関数に近似したくても、何に近似するべきか分からないときは、どうしたらいいですか。 例えば、直線に近似しようと思っても2次式に近似しようと思っても、指数関数に近似しようと思っても、最小二乗法を使えば、それに近似されます。 このように、この種類の関数に近似させてやる!ということを決めていれば、それに近似されますが、近似させる関数の種類を限定したくないけど、何かの関数にしたいと思ったら、どうしますか。

  • Javaプログラムのフローチャートについて

    下に記述したのは4次のルンゲクッタ法のJavaによるプログラム例です。このプログラムの簡単なフローチャートを作成してプレゼンしたいのですが、作成した経験がなく、本等をみてもいまいちわかりません。どなたかご教授いただきたく、お願い申し上げます。 // 2階常微分方程式に対する Runge-Kutta 法による積分メソッド public void Runge_Kutta(double x[], double y[]){ double xi, vi, k1, k2, k3, k4, l1, l2, l3, l4; for(int i = 0; i < iMax-1; i++){ xi = x[i]; vi=y[i]; k1 = dt*vi; l1 = dt*fun(vi, xi); k2 = dt*(vi+0.5*l1); l2 = dt*fun(vi+0.5*l1, xi+0.5*k1); k3 = dt*(vi+0.5*l2); l3 = dt*fun(vi+0.5*l2, xi+0.5*k2); k4 = dt*(vi+l3); l4 = dt*fun(vi+l3, xi+k3); x[i+1] = xi+(k1+2.0*(k2+k3)+k4)/6.0; y[i+1] = vi+(l1+2.0*(l2+l3)+l4)/6.0; if(y[i] < ymin){ Max=i; break;} if(Math.abs(y[i+1]-y[i]) < diff && Math.abs(x[i+1]-x[i])< diff){Max=i; break;} } }

    • ベストアンサー
    • Java
  • ルンゲクッタ法による数値計算の高速化(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言語での実装方法についてお教えください。

  • 近似直線を伸ばすには?

    エクセルの散布図において近似直線を引いた場合、プロットした点がない範囲にも近似直線を延長することはできますか? 例えば、x軸の範囲が10から60までデータがあるとします。 その時、近似直線を引いたときも10から60までしか線が引かれません。 それをx=0から100ぐらいまで線を延長したいです。 回答よろしくお願いします。

  • エクセル近似曲線(範囲指定)

    10個のプロット点によって作られているエクセル曲線の、右端3つのみの直線近似曲線が引きたいのですが何かいい方法はないでしょうか? 右端3つのみの近似曲線の関数(y=○x+▽)も知りたいです。 「近似曲線の追加」→「直線近似」でやると すべてのプロット点に対する近似直線しかかけません。 宿題の期限が近く、困っています。 どなたかお助けください。よろしくお願いします。

専門家に質問してみよう