|
一応コンパイルできるようにしました。tfunc()のプロトタイプ宣言が
違っていたり、関数中に全角スペースが入っていたりでコンパイルでき
ないのを直しました。
でも出力結果が思わしくないですね。そちらで追試してみて下さい。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
double euler( double (*)(double,double),double,double,double ); /* この行の意味がわかりません!?eulerとは何ですか? */
double func (double,double);
double tfunc (double); /* この行のtfuncにする理由が? */
int main(void)
{
double h,x,x0,xn,y;
int i,n ;
printf("\n** d^2y/dx^2+dy/dx+8y=0 **\n");
printf("\n X の初期値 X0 =");
scanf("%le",&x0);
printf("\n Y の初期値 Y0 =");
scanf("%le",&y);
printf("\n X の初期値 XN =");
scanf("%le",&xn);
if( xn <= x0) {
printf("\n* X の指定エラー\n");
exit(1);
}
printf("\n (X0,XN) の分割数 N =");
scanf("%d",&n);
if( n < 1) {
printf("\n* N の指定エラー\n");
exit(1);
}
h = ( xn -x0 ) / n ;
printf( "\n%15s%20s%20s\n\n","X","Y","真の値");
for (i=0 ; i < n ; i++){
x = x0 + i * h ;
printf( "%20.8e%20.10e%20.10e\n",x,y,tfunc( x ));
y = euler(func, x, y, h );
}
printf( "%20.8e%20.10e%20.10e\n",xn,y,tfunc( xn ));
return 0;
}
/*
* オイラー法
*/
double euler(double (*f)(double,double),double x, double y,double h)
{
return ( y + (*f)(x, y ) * h);
}
/*
* Y' = F(X,Y)を与える関数(例)
*/
double func (double x,double y)
{
return (y + sin( x ) ) ;
}
double tfunc( double x )
/* 上記例の真の解 */
{
return ( exp(x) - (sin(x) + cos( x )) * 0.5) ;
}
|