今日(2020/06/20)からアルゴリズムを勉強していこうと思う。選ばれたのはC言語です。理由は単純で今勉強中だから。メモ用として使っていくので詳しい解説はしない(というか知識がないからできない)。よく参考書にあるような数字の計算から始めるわけではないのでそこは理解していただきたい。では早速やっていこう。
環境構築に関しては以下の記事を参考にして構築した。(Windows)
※Macはわかりませんので各自で調べてください。
https://webkaru.net/clang/mingw-gcc-environments/
使用している書籍:C言語によるはじめてのアルゴリズム入門
著者:河西朝雄
#非線形方程式
非線形方程式とは1次方程式以外の方程式のこと。まず、データを半分に分け根がどちらに存在するかを確かめる。このやり方は二分法というらしい。今回はこの手法を採用するが他にもやり方は存在する。
equation.c
#include<stdio.h>
#include<math.h>
#define f(x) ((x)*(x)*(x)-(x)+1)
#define EPS 1e-8 //1*(10^-8)という意味
#define LIMIT 50
int main(void){
double low,high,x;
int k;
low = -2;
high = 2;
for(k=1;k<=LIMIT;k++){
x = (low+high)/2;
// 探索範囲を半分にする
if(f(low)*f(x)<0){
high = x;
}
else{
low = x;
}
if(f(x) == 0 || fabs(high-low) < fabs(low)*EPS){
printf("x=%f\n",x);
break;
}
}
if(k>LIMIT){
printf("収束しない");
}
}
#出力結果
x=-1.324718
#まとめ
計算に関していつもどの程度で判定するか悩んでいる。現場だとどのくらいから精度が良いと言えるのかわからないので今のうちに基準を知っておきたい。もちろんその時の状況によると思うが。