• ベストアンサー

数値解析に関する質問です。

/*kadai8 Euler’s Method for Ordinary Differential Equation */ #include <stdio.h> void euler(double *, double *); main () { int i; double v,t,tt,dt[5]; dt[0] = 2; dt[1] = 1; dt[2] = 0.1; dt[3] = 0.01; dt[4] = 0.001; printf("Program of Euler`s Method 1\n"); printf("-----------------------------------------\n"); tt = 50.0/9.80665; printf("Theoretical Solution : %lfs\n",tt); for(i=0;i<=4;i++){ printf("--------------------------------\n"); printf("Step Size : %lf s\n",dt[i]); v=50.0; t=0.0; while(v>0) { euler(&v,&dt[i]); t=t+dt[i]; } printf("Numerical Solution : %lf s\n",t); printf("Error : %lf s\n",t-tt); } return(0); } /*--------------*/ void euler(double *v,double *dt) { *v=*v + (*dt )*(-9.80665); } 以上のプログラムで関数eulerの引数にポインタがついているのはなぜか,またポインタを使用しない方法はないか?また、オイラー法より精度の高い解法はありますか? よろしくお願いします。

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

  • ベストアンサー
  • Interest
  • ベストアンサー率31% (207/659)
回答No.1

Q1: 関数eulerの引数にポインタがついているのはなぜか A1: 関数euler内部での計算結果を呼び出し元に返すため。もっとも、dt は関数 euler の中で更新されないのでポインタである必要はない。 Q2: またポインタを使用しない方法はないか? A2: ある。例えば関数 eulerを次のようにする。 double euler(double v, double dt) {  return v + dt * (-9.80665); } Q3: オイラー法より精度の高い解法はありますか? A3: ある。定番はルンゲ=クッタ法。数値計算法の教科書には常微分方程式の解法として必ずルンゲ=クッタ法の説明が書かれている。

その他の回答 (1)

回答No.2

ポインタを使わなくても大丈夫ですよ。 ただ、オーバーヘッドががあります。数値解析では無駄なオーバーヘッドはできる限り排除したいのでこういう形になっているのでは? 数値解析は学生時代にやっただけでかなり忘れてしまっていますが、ルンゲクッタ法とかって違いましたっけ?

関連するQ&A

専門家に質問してみよう