数値計算・近似式の問題がわかりません。
Posted: 2018年11月22日(木) 13:08
数値計算法の課題として出された問題なのですが、よくわかりません。
8個のデータ点(xi、yi)が与えられたとき、これを近似する3次関数「y= p0+p1x+ p2x^2+p3x^3」を与える。
・正規方程式を解くプログラムを作成し、3次関数の式を求めよ。(少数以下第3位を四捨五入して小数点以下第2までの値で示すこと)
・最小二乗近似のプログラムを作成し、-5から+7まで0.2刻みのデータ点について近似値を求め、グラフを作成せよ。
という問題です。
他に、正規方程式を書き下して係数を求める問題もあり、それは教科書をみればできたのですが、それ以降の問題がどうすればいいのかわかりません。よろしくお願い致します。
データ点は
i : 1 2 3 4 5 6 7 8
xi : -4.0, -2.0, -1.0, 0.0, 1.0, 3.0, 4.0, 6.0
yi : -35.1, 15.1, 15.9, 8.9, 0.1, 0.1, 21.1, 135.0
一応係数を求めるプログラムです。
8個のデータ点(xi、yi)が与えられたとき、これを近似する3次関数「y= p0+p1x+ p2x^2+p3x^3」を与える。
・正規方程式を解くプログラムを作成し、3次関数の式を求めよ。(少数以下第3位を四捨五入して小数点以下第2までの値で示すこと)
・最小二乗近似のプログラムを作成し、-5から+7まで0.2刻みのデータ点について近似値を求め、グラフを作成せよ。
という問題です。
他に、正規方程式を書き下して係数を求める問題もあり、それは教科書をみればできたのですが、それ以降の問題がどうすればいいのかわかりません。よろしくお願い致します。
データ点は
i : 1 2 3 4 5 6 7 8
xi : -4.0, -2.0, -1.0, 0.0, 1.0, 3.0, 4.0, 6.0
yi : -35.1, 15.1, 15.9, 8.9, 0.1, 0.1, 21.1, 135.0
一応係数を求めるプログラムです。
#include <stdio.h>
#include <math.h>
#define N 8
#define M 3
#define EPS .0001
double a[M+1][M+2];
int Jordan(void);
int main( int argc, char **argv ){
double x[N]={-4.0,-2.0,-1.0,0.0,1.0,3.0,4.0,6.0};
double y[N]={-35.1,15.1,15.9,8.9,0.1,21.1,135.0};
int i,j,k;
for(i=0;i<=M;i++)
for(j=0;j<=M+1;j++)
for(k=0;k<=N;k++)
a[i][j]=0.0;
for(i=0;i<=M;i++)
for(j=0;j<=M+1;j++)
for(k=0;k<=N;k++)
a[j][i] +=pow(x[k],(double)(i+j));
for(j=0;j<=M;j++)
for(k=0;k<=N;k++)
a[j][M+1]+=y[k]*pow(x[k],j);
if(Jordan()==1) return 1;
for(i=0;i<=M;i++)
printf("p%2d = %7.3lf\n",i,a[i][M+1]);
return 0;
}
int Jordan(void)
{
double pivot,delta;
int i,j,k;
for(i=0;i<=M;i++){
pivot=a[i][i];
if(fabs( pivot ) < EPS ){
printf( "ピボットが許容範囲誤差以下\n" );
return 1;
}
for( j=0; j<=M+1; j++ )
a[i][j] /= pivot;
for( k=0; k<=M; k++ ){
delta = a[k][i];
for(j=0; j<=M+1; j++)
if( k != i )
a[k][j] -= delta * a[i][j];
}
}
return 0;
}