どうもお世話になっております。
以前、学校で最小二乗法による一次式近似のプログラムを教わりました。
(↓こんな感じになりました)
#include <stdio.h>
#include <math.h>
#define NMAX 20
void main(void)
{
int i=0,n;
double xi=0,fi=0,xi2=0,xifi=0;
double data_x[NMAX],data_f[NMAX];
double a=0,b=0;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%lf %lf",&data_x,&data_f);
}
for(i=0;i<n;i++){
xi+=data_x;
fi+=data_f;
xi2+=data_x*data_x;
xifi+=data_x*data_f;
}
a=(xi*fi-n*xifi)/(xi*xi-n*xi2);
b=(xi*xifi-fi*xi2)/(xi*xi-n*xi2);
printf("F(x)=%fx+(%f)\n",a,b);
}
さて、課題として、
入力されるデータ点を二次式で近似するための最小二乗法のプログラムを作成することになりました。
ある程度はわかるのですが、近似式をF(x)=a*x^2+b*x+cとしたときの係数a,b,cをどう求めるのか…。
どうぞよろしくお願いします。
最小二乗法に関する課題がわかりません
Re:最小二乗法に関する課題がわかりません
手元にある関数電卓の取扱説明書によりますと、 y=Ax2+Bx+C の定数項C、一次係数B、二次係数Aの計算式は下記のとおりです。 Σy Σx Σx2 C = ---- - B(----) - A(-----) n n n Sxy・Sx2x2 - Sx2y・Sxx2 B = ------------------------------------ Sxx・Sx2x2 - (Sxx2)2 Sx2y・Sxx - Sxy・Sxx2 A = ---------------------------------- Sxx・Sx2x2 - (Sxx2)2 ただし、 Sxx = Σx2 - ((Σx)2 / n) Sxy = Σxy - ((Σx・Σy) / n) Sxx2 = Σx3 - ((Σx・Σx2) / n) Sx2x2 = Σx4 - ((Σx2)2 / n) Sx2y = Σx2y - ((Σx2・Σy) / n)
Re:最小二乗法に関する課題がわかりません
ありがとうございます。
色々教科書や参考書、インターネットで係数の計算式を探したのですが見つからなかったので、
本当に助かりました。
これを元にプログラムを作ってみます。
色々教科書や参考書、インターネットで係数の計算式を探したのですが見つからなかったので、
本当に助かりました。
これを元にプログラムを作ってみます。