ページ 11

定積分について

Posted: 2010年6月26日(土) 15:36
by 初心者
#include <stdio.h>
#include <math.h>

/* 関数の定義 */
double func1(double x);
/* 台形公式 */
double traqezoidal( double a, double b, int n, double (*f)() );
/* sinの定義 */
double sin(double x);
/* π/2の定義 */
double M_PI_2;

int main(void)
{
int n=100;

printf("sqrt[5]*1/(4 + sin^2(x))) を [0,π/2]で積分します。分割数は%dです /n", n);
printf("結果は%20.15fです/n", trapezoidal(0.0, M_PI_2, n, func1) );

return 0;
}

/* 台形式 */
double traqezoidal( double a, double b, int n, double (*f)() )
{
double T, h;
int i;

h =( b - a ) /n ; /* 刻み幅の指定 */

/* 台形公式 */
T = ( (*f)(a) + (*f)(b) ) / 2.0;
for ( i = 1; i< n; i++) T += (*f)( a + i*h );
T *= h;

/* π/2の定義 */
M_PI_2 = 1.57079632679489661923;


return T;
}

/* 関数の定義 */
double func1(double x)
{
return( 1.0 / (4 + sin^2(x)) );
}


上のソースをコンパイルすると
(46):error C2297: '+':無効です。右オペランドには型 'double (_cdecl *)(double)'が指定されています。
(46):error C2064: -22 引数を取り込む関数には評価されません。
(46):warning C4033: 'func1' : 関数には戻り値が必要です。
と出ます。

どこを直せば良いのか教えて教えてほしいです。

Re:定積分について

Posted: 2010年6月26日(土) 15:45
by asdf
sin^2(x) は sin(x) * sin(x)に

printf("結果は%20.15fです/n", trapezoidal(0.0, M_PI_2, n, func1) );

のtrapezoidalをtraqezoidalに

あとは、関数へのポインタの(*f)()を(*f)(double)

とすればよいと思います。

Re:定積分について

Posted: 2010年6月26日(土) 15:47
by asdf
sin^2(x)というのは、
double func1(double x)
{
return( 1.0 / (4 + sin^2(x)) );
}

のところのことです

Re:定積分について

Posted: 2010年6月26日(土) 16:32
by 初級者
誤:traqezoidal
正:trapezoidal

Re:定積分について

Posted: 2010年6月26日(土) 19:03
by もぐりん
こちらの掲示板にも回答が付いていますが・・・。

http://www2.realint.com/cgi-bin/tarticl ... intc+33696

謝罪

Posted: 2010年6月27日(日) 10:56
by 初心者
すいません。
マルチポストを行ってしまい大勢の方に迷惑を掛けてしまいました。
自分の作ったソースが間違っていた場合、指摘していただきたいと思いますので今後もよろしくお願いいたします。