2分法のプログラム

2分法のプログラム作成方法


2分法のプログラム(全体構成)
プログラム作成要領





2分法のメイン関数(変数宣言)
2分法のメイン関数(データの読み込み)
2分法のメイン関数(繰り返し計算)
2分法のメイン関数(結果の表示)
2分法の関数(関数の値を計算)
2分法のプログラム(全体構成)
始め
#include <stdio.h>
double func(double x);
/*==========================*/
/*
main function
*/
/*==========================*/
a, bを入力
f(a) f(b) > 0
yes
int main(){
b-a<0
yes
フローチャートに従い処理を書く
aとbを入れ替える
return(0);
}
/*=============================*/
/*
define function
*/
/*=============================*/
b-a>
no
yes
c=(a+b)/2
double func(double x){
yes
関数の計算方法を書く
return(y);
b←c
f(c) f(a) < 0
no
解cを表示
a←c
}
終り
2分法のメイン関数(変数宣言)

最初に変数宣言を行ってから、処理を書く
double eps=1e-15;
double a, b, c;
double test;
char temp;
int i=0;
/* precision */
2分法のメイン関数(データの読み込み)


計算の両端の a と b を読み込む。
a と b が不適切な場合、再度読み込む。
do{
printf("\ninitial value a = ");
scanf("%lf%c", &a, &temp);
printf("initial value b = ");
scanf("%lf%c", &b, &temp);
test=func(a)*func(b);
if(test >= 0){
printf("
bad initial value !!
}
}while(test >= 0);
f(a)*f(b)>0\n\n");
2分法のメイン関数(繰り返し計算)

設定した精度まで、繰り返し計算を行う。
while(b-a>eps){
c=(a+b)/2;
if(func(c)*func(a)<0){
b=c;
}else{
a=c;
}
i++;
printf(" %d\t%20.15f\n",i,c);
}
2分法のメイン関数(結果の表示)


結果を表示する。
表示の方法は、以下の通り。




改行して、solution x = と書く。
フィールド幅
少なくとも20カラム
精度
小数点以下15桁
最後に2回改行
printf("\nsolution x = %20.15f\n\n",c);
2分法の関数(関数の値を計算)
関数を使うときは、プロトタイプ宣言を忘れないこと。



変数の宣言を行う。
関数の計算を行う。
呼び出し側に値を返す。
double func(double x){
double y;
y=x*x*x-3*x*x+9*x-8;
return(y);
}
ニュートン法のプログラム作成方法


ニュートン法のプログラム(全体構成)
プログラム作成要領





ニュートン法のメイン関数(変数宣言)
ニュートン法のメイン関数(データの読み込み)
ニュートン法のメイン関数(繰り返し計算と結果の表示)
ニュートン法の関数(関数の値を計算)
ニュートン法の関数(導関数の値を計算)
ニュートン法のプログラム(全体構成)
#include <stdio.h>
#include <math.h>
#define IMAX 50
double func(double x);
double dfunc(double x);
/*===========================*/
/*
main function
*/
/*===========================*/
int main(){
フローチャートに従い処理を書く
return(0);
}
/*===========================*/
/*
define function
*/
/*===========================*/
double func(double x){
関数の計算方法を書く
return(y);
}
/*===========================*/
/* define derived function */
/*===========================*/
double dfunc(double x){
導関数の計算方法を書く
return(dydx);
}
始め
i=-1
x0を入力
i ← i+1
xi+1=xi-f(xi) / f'(xi)
解の精度検査
|(xi+1- xi) / xi| ≦ 
no
yes
反復回数検査
i ≦ imax
no
収束しないと
表示
終り
yes
解 xi+1 を表示
ニュートン法のメイン関数(変数宣言)


最初に変数宣言を行ってから、処理を書く
i番目の計算結果は、配列x[i]に格納される。
double eps=1e-15;
double x[IMAX+10];
char temp;
int i=-1;
/* precision */
ニュートン法のメイン関数(データの読み込み)

計算の初期値 を読み込み、配列x[0]に格納。
printf("\ninitial value x0 = ");
scanf("%lf%c", &x[0], &temp);
ニュートン法のメイン関数(繰り返し計算と結果の表示)


設定した精度まで、繰り返し計算を行う。
目的の精度に達したら結果を表示する。
do{
i++;
x[i+1]=x[i]-func(x[i])/dfunc(x[i]);
printf("
%d\t%e\n", i, x[i+1]);
if(fabs((x[i+1]-x[i])/x[i])<eps) break;
}while(i<=IMAX);
if(i>=IMAX){
printf("\n not converged !!! \n\n");
}else{
printf("\niteration= %d solution x=%20.15f\n\n",i,x[i+1]);
}
ニュートン法の関数(関数の値を計算)
関数を使うときは、プロトタイプ宣言を忘れないこと。



変数の宣言を行う。
関数の計算を行う。
呼び出し側に値を返す。
double func(double x){
double y;
y=x*x*x-3*x*x+9*x-8;
return(y);
}
ニュートン法の関数(導関数の値を計算)
関数を使うときは、プロトタイプ宣言を忘れないこと。



変数の宣言を行う。
関数の計算を行う。
呼び出し側に値を返す。
double dfunc(double x){
double dydx;
dydx=3*x*x-6*x+9;
return(dydx);
}