近似曲線
グラフがみにくいので近似曲線を書きたい。
家にある本探したら、載ってた。
最小二乗法かぁ(・_・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]