.
.
Cプログラミング入門
(2018)
第12回
−宿題2の解説,演習2−
松田七美男
宿題2:概要
.
.
ある関数
f (x)
の区間
[
−1, 1]
における定積分値を,
3
点における積
和で近似する,
3
次のガウス積分公式
∫
1 −1f (x) dx
≃
3∑
i=1c
if (x
i)
=
5
9
f
(
−
√
3
5
)
+
8
9
f (0) +
5
9
f
(√
3
5
)
を用いて,試行関数
1
1 + sin(x)
に対して,定積分
∫
θ 01
1 + sin x
dx = tan
(
θ
2
−
π
4
)
+ 1
を数値的に確かめなさい.
宿題2:注意と実行例
. . 13
次のガウス積分公式を内部で用いた,積分区間
[a, b]
の
定積分を求める関数を,関数
f
へのポインタと
a, b
を仮
引数として以下のように定義しなさい.
double G3(double (*f)(), double a, double b)
. . 2試行関数
tfunc
を以下のように定義しなさい.
double tfunc(double x)
. . 3積分の上限
θ
は,学生番号を
50
で割った値としなさい.
例)
1Y17B123
→ θ = 2.46
.
実行画面例
.
.
$ ./hw2018-2
宿題2:ヒント
ガウス積分公式を適用するには,積分区間を
[a, b]
から
[
−1, 1]
に変換しなければなりません.それには,一次変換
ux + v = ξ
[
u = 2/(b
− a), v = −(b + a)/(b − a)
]
を用
いて,
∫
b af (x) dx =
1
u
∫
1 −1f
(
ξ
− v
u
)
dξ
とすればよいことは明かです.
解答例
double G3(double (*f)(), double a, double b) {
double x[] = {-sqrt(0.6), 0, sqrt(0.6)}, c[] = {5.0/9, 8.0/9, 5.0/9}, u = 2/(b - a), v = (b + a)/(a - b), s = 0;
int i;
for (i = 0; i < 3; i++) s += c[i]*f((x[i] - v)/u);
return s / u; }
double tfunc(double x) { return 1/(1+sin(x)); }
int main(int argc, char **argv) {
double q = 2.46;
printf("q = %.3f, I1 = %.3f, I2 = %.3f\n",
q, G3(tfunc, 0, q), tan(q/2 - M_PI/4) + 1);
return 0; }
.
関数へのポインタを用いた汎用関数
.
f
は仮の名前,実際には
cos
が渡される
.
試行関数
tfunc
と積分区間
0, q
を引数に呼び出し
解答例
double G3(double (*f)(), double a, double b) {
double x[] = {-sqrt(0.6), 0, sqrt(0.6)}, c[] = {5.0/9, 8.0/9, 5.0/9}, u = 2/(b - a), v = (b + a)/(a - b), s = 0;
int i;
for (i = 0; i < 3; i++) s += c[i]*f((x[i] - v)/u);
return s / u; }
double tfunc(double x) { return 1/(1+sin(x)); }
int main(int argc, char **argv) {
double q = 2.46;
printf("q = %.3f, I1 = %.3f, I2 = %.3f\n",
q, G3(tfunc, 0, q), tan(q/2 - M_PI/4) + 1);
return 0; }
.
.
関数へのポインタを用いた汎用関数
.
f
は仮の名前,実際には
cos
が渡される
.
試行関数
tfunc
と積分区間
0, q
を引数に呼び出し
解答例
double G3(double (*f)(), double a, double b) {
double x[] = {-sqrt(0.6), 0, sqrt(0.6)}, c[] = {5.0/9, 8.0/9, 5.0/9}, u = 2/(b - a), v = (b + a)/(a - b), s = 0;
int i;
for (i = 0; i < 3; i++) s += c[i]*f((x[i] - v)/u);
return s / u; }
double tfunc(double x) { return 1/(1+sin(x)); }
int main(int argc, char **argv) {
double q = 2.46;
printf("q = %.3f, I1 = %.3f, I2 = %.3f\n",
q, G3(tfunc, 0, q), tan(q/2 - M_PI/4) + 1);
return 0; }