近似曲線

グラフがみにくいので近似曲線を書きたい。

家にある本探したら、載ってた。

最小二乗法かぁ(・_・D フムフム

数学の記号とかもう忘れたなぁ・・・

c言語によるはじめてのアルゴリズム入門

自分のは第6刷で、平成5年だから20年前!∑(゜∀゜)

捨てなくてよかった・・・

ちょっと見やすくなったかな?

ソース
[csharp]
class Polyfit : List<KeyValuePair<DateTime, int>>
{
private double[] x,y,s,t;
private double[,] a;
public Polyfit(List<KeyValuePair<DateTime, int>> data, int M)
{
int N = data.Count;
x = new double[N];
y = new double[N];
a = new double[M+1,M+2];
s = new double[2*M+1];
t = new double[M+1];

int i, j, k;
double p, d, px;

for (i = 0; i <= 2 * M; i++)
s[i] = 0;

for (i = 0; i <= M; i++)
t[i] = 0;

// データの取得
for (i = 0; i < N; i++)
{
x[i] = i;
y[i] = data[i].Value;
}

for (i = 0; i < N; i++)
{
for (j = 0; j <= 2 * M; j++) // s0からs2mの計算
s[j] = s[j] + Math.Pow(x[i], j);

for (j = 0; j <= M; j++) // t0からtmの計算
t[j] = t[j] + Math.Pow(x[i], j) * y[i];
}

// a[][]にs[],t[]の値を入れる
for (i = 0; i <= M; i++)
{
for (j = 0; j <= M; j++)
a[i, j] = s[i + j];

a[i, M + 1] = t[i];
}

// はき出し
for (k = 0; k <= M; k++)
{
p = a[k, k];
for (j = k; j <= M + 1; j++)
a[k, j] = a[k, j] / p;

for (i = 0; i <= M; i++)
{
if (i != k)
{
d = a[i, k];
for (j = k; j <= M + 1; j++)
a[i, j] = a[i, j] – d * a[k, j];
}
}
}

// 補間多項式によるyの値の計算
for (i=0,px=0; px<N; px++,i++)
{
p = 0;
for (k = 0; k <= M; k++)
p = p + a[k, M + 1] * Math.Pow(px, k);

this.Add(new KeyValuePair<DateTime, int>(data[i].Key, (int)p));
}

}
}
[/csharp]

コメントを残す

%d人のブロガーが「いいね」をつけました。