こんばんわに!




































ここのところプログラムの勉強がはかどっているので、どんどんブログにあげちゃいます。
今日は方程式の解を求めるプログラムです。数値解法にもいろいろありますが、その中でも二分割法とニュートン法のプログラムを作りました。それらの方法についての説明または省略して、ソースコードだけ載せますね


































ここで求める方程式は y = x^2 - 3 です。解は1.7320508...となるのはわかると思います。
有効数字6桁まで正確な値を求め、処理の回数をそれぞれの方法で比較します。
#include<stdio.h>
#include<math.h>
#define eps 1.0e-5 /*有効数字*/
float func(float x); /*解を求めるべき関数*/
float dfunc(float x); /*導関数*/
int bisec(void); /*二分法で求める関数*/
int newton(void); /*ニュートン法の関数*/
int main(){
printf("解が求まるまで%d回\n",bisec()); /*二分法の計算回数*/
printf("解が求まるまで%d回\n",newton()); /*ニュートン法の計算回数*/
return 0;
}
int bisec(void){
int i = 0;
float a,b,m;
printf("解より小さい値を入力してください>>>");
scanf("%f",&a);
b = a+1;
/*aとbの間に解がない場合はbをインクリメントする*/
while((func(a)*func(b))>0){
b++;
}
do {
i++; /*収束までの回数をカウント*/
m = (a + b) / 2.0;
if( func(m) * func(a) < 0 ){
b = m;
} else {
a = m;
}
printf("%d回目の値:%.5f\n",i,m);
} while (fabs(a-b)>eps); /*解が有効数字6桁になったらループを終了*/
return i;
}
int newton(void){
int i = 0;
float a,b;
printf("0以外で適当な値を入力してください>>>");
scanf("%f",&a);
b = a;
do {
i++;
a = b;
b = a -(func(a)) / (dfunc(a));
printf("%d回目の値:%.5f\n",i,b);
} while (fabs(a-b)>eps); /*解が有効数字6桁になったらループを終了*/
return i;
}
float func(float x){
return x * x - 3;
}
float dfunc(float x){
return 2.0 * x;
}
#include<math.h>
#define eps 1.0e-5 /*有効数字*/
float func(float x); /*解を求めるべき関数*/
float dfunc(float x); /*導関数*/
int bisec(void); /*二分法で求める関数*/
int newton(void); /*ニュートン法の関数*/
int main(){
printf("解が求まるまで%d回\n",bisec()); /*二分法の計算回数*/
printf("解が求まるまで%d回\n",newton()); /*ニュートン法の計算回数*/
return 0;
}
int bisec(void){
int i = 0;
float a,b,m;
printf("解より小さい値を入力してください>>>");
scanf("%f",&a);
b = a+1;
/*aとbの間に解がない場合はbをインクリメントする*/
while((func(a)*func(b))>0){
b++;
}
do {
i++; /*収束までの回数をカウント*/
m = (a + b) / 2.0;
if( func(m) * func(a) < 0 ){
b = m;
} else {
a = m;
}
printf("%d回目の値:%.5f\n",i,m);
} while (fabs(a-b)>eps); /*解が有効数字6桁になったらループを終了*/
return i;
}
int newton(void){
int i = 0;
float a,b;
printf("0以外で適当な値を入力してください>>>");
scanf("%f",&a);
b = a;
do {
i++;
a = b;
b = a -(func(a)) / (dfunc(a));
printf("%d回目の値:%.5f\n",i,b);
} while (fabs(a-b)>eps); /*解が有効数字6桁になったらループを終了*/
return i;
}
float func(float x){
return x * x - 3;
}
float dfunc(float x){
return 2.0 * x;
}
ニュートン法のほうがかなり早く解が求められるのがわかるかと思います。
解が複数あっても一つしか求まらないのが、このプログラムの良くないところですね
入力する値を小さくするとマイナスの解が表示されます。
そのうち複数の解が表示されるプログラムも作ってみたいと思います(できれば...
)
プログラムの中身的には、最近紹介したものより簡単な気がしますね
それじゃ


