今日(2020/06/20)からアルゴリズムを勉強していこうと思う。選ばれたのはC言語です。理由は単純で今勉強中だから。メモ用として使っていくので詳しい解説はしない(というか知識がないからできない)。よく参考書にあるような数字の計算から始めるわけではないのでそこは理解していただきたい。では早速やっていこう。
環境構築に関しては以下の記事を参考にして構築した。(Windows)
※Macはわかりませんので各自で調べてください。
https://webkaru.net/clang/mingw-gcc-environments/
使用している書籍:C言語によるはじめてのアルゴリズム入門
著者:河西朝雄
#ラグランジュ補間
こちらを参考にした。
lagrange.c
#include <stdio.h>
// x[]:xの座標の配列,y[]:yの座標の配列,n:座標の数,t:座標の分割する範囲(main関数で使用)
double lagrange(double x[],double y[],int n,double t){
int i,j;
double s,p;
s = 0.0;
// 公式の通りにプログラムを記述
for(i=0;i<n;i++){
p = y[i];
for(j=0;j<n;j++){
if(i!=j){
p=p*(t-x[j])/(x[i]-x[j]);
}
}
s += p;
}
return s;
}
int main(void){
// x座標を定義
static double x[] = {0.0,2.0,3.0,4.0,5.0};
// y座標を定義
static double y[] = {0.8,3.4,4.9,2.9,2.0};
double t;
// tを0.2ずつ加算していき座標を求める
for(t=0.0;t<=7.0;t+=0.2){
printf("%7.2f %7.2f\n",t,lagrange(x,y,5,t));
}
}
#出力結果
0.00 0.80
0.20 -0.36
0.40 -0.94
0.60 -1.07
0.80 -0.83
1.00 -0.34
1.20 0.33
1.40 1.10
1.60 1.91
1.80 2.69
2.00 3.40
2.20 4.00
2.40 4.47
2.60 4.78
2.80 4.92
3.00 4.90
3.20 4.72
3.40 4.39
3.60 3.96
3.80 3.44
4.00 2.90
4.20 2.38
4.40 1.95
4.60 1.69
4.80 1.67
5.00 2.00
5.20 2.77
5.40 4.09
5.60 6.10
5.80 8.90
6.00 12.66
6.20 17.51
6.40 23.62
6.60 31.15
6.80 40.28
#まとめ
変数の初期化を書き忘れていたため変な挙動になってしまった。しかし原因がわからず今もたくさんググっている。具体的には以下のような出力結果がでた。初期化をし忘れたのはlagrange関数にある「s」という変数である。もう少し調べて原因がわかったら記事を更新して補足説明しようと思う。原因を知っている方やわからなくてもおそらくこうだろうという内容でもいいので教えていただきたいです。コメントお待ちしています。
0.00 0.80
0.20 70061828819985990000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.00
0.40 70061828819985990000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.00
0.60 70061828819985990000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.00
0.80 70061828819985990000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.00