課題1
double euler(double (*fnc)(double, double), double t, double x, double h){
return (x + (*fnc)(t, x) * h);
}
形だけは簡単ですよね?おそらく数学的にはx(t), dx(t)/dtではないかと考えるかと思いますが、
ここでの数値計算では、xもtもただの変数としてとらえます。
(*fnc)(t, x)はt, xと(*fnc)を送って戻り値を獲得すると考えてください。
課題2
#include <・・・>
double euler(double (*fnc)(double, double), double t, double x, double h){
・・・
double fnc(double t, double x){
double b=0.02;
double a=0.1;
double g=9.807;
return (-1.0*b*x*x - a*x + g);
}
main(){
static double t, h, t0, tn, x;
static int i, n;
FILE *fp;
if ((fp = fopen("dat.txt", "r")) == NULL) {
printf("file open error!!\n");
exit(EXIT_FAILURE); /* (3)エラーの場合は異常終了 */
}
t0=0.0;
x=0.0;
tn=5.0;
h=0.001;
n=(int)((tn-t0)/h);
x = x0 + i * h;
fprintf(fp, "%f %f\n", t, x);
for(i=0; i<n; i++){
x = euler(fnc, t, x, h);
fprintf(fp, "%f %f\n", t, x);
}
fclose(fp);
}