9回目課題解答解説


課題1 以下の関数を組み込み,数値微分を行ってみよう.
f(x)=(x * x) / 2
これについて,解析解,プログラム作成,関数電卓による解を比較してみて下さい.
比較した結果と考察をソースファイルのコメントに記述すること

関数の引数について

double diff(double fnc(double), double xx, double x0, double x1, int n)
fnc(double);微分しようとする関数
xx;導関数の引数(今回はxを指定)
x0;x標本の始点(今回は0くらいを指定)
x1;x標本の終点(今回は1くらいを指定)
n;標本数(今回は10くらいを指定)

関数の入ったソースはこちら→diff.c 20130605一部変更あり(エラーに対応)

メイン関数のソースファイルの参考

#include <stdio.h>
#include <math.h>
#include "diff.h" /*可能であれば分割コンパイルを*/

/*関数を記述,xに関する関数fnc*/
double fnc(double);


main(){
 double kai; /*計算結果*/
 double x; /*関数の変数*/
 double x0=0.0; /*始点*/
 double x1=1.0; /*終点*/
 int n=10; /*標本数*/

 kai=diff(fnc, x, x0, x1, n);

 printf("x0= %f\n", x0);
 printf("x1= %f\n", x1);
 printf("n= %d\n", n);
 printf("x0= %f\n", x0);
 printf("x~2/2= %f\n", kai);
}


double fnc(double x){
 return 0.5*x*x;
}

もし分割コンパイルをするためにヘッダファイルが必要であれば,diff.hを利用して下さい.

課題2 以下の関数を組み込み,数値積分を行ってみよう.
f(x) = exp(-x*x)
これについて,解析解,プログラム作成,関数電卓による解を比較してみて下さい.
比較した結果と考察をソースファイルのコメントに記述すること

関数の引数について
double integral(double fnc(double), double a, double b, unsigned int n, double se)
fnc(double型の引数);積分しようとする関数
a;積分の下限
b;積分の上限
n;初期分割数(今回は4くらいを指定)
se;相対許容誤差(今回は0.00001くらいを指定)

関数の入ったソースはこちら→integral.c

メイン関数のソースファイルの参考

#include <stdio.h>
#include <math.h>
#include "integral.h" /*可能であれば分割コンパイルを*/

double fnc(double x){
 return exp(-x*x);
}


main(){
 double kai; /*計算結果*/
 double x; /*関数の変数*/
 double a=0.0; /*下限*/
 double b=1.0; /*上限*/
 int n=4; /*初期分割数*/
 double se=0.00001; /*相対許容誤差*/

 kai=integral(fnc, a, b, n, se);

 printf("a= %f\n", a);
 printf("b= %f\n", b);
 printf("n= %d\n", n);
 printf("se= %f\n", se);
 printf("exp(-x*x)= %f\n", kai);

}

もし分割コンパイルをするためにヘッダファイルが必要であれば,integral.hを利用して下さい.