牛顿插值法


上半年学的数值逼近,其中的很大一部分是关于插值计算的。插值其实是总容易用计算机来实现的。
下面的为牛顿插值法c情况下的实现。
引用内容
/******************************************************
* 用牛顿插值法依据N个已知数据点即使函数值
* 输入: n--已知数据点的个数N-1
* x--已知数据点第一坐标的N维列向量
* y--已知数据点第二坐标的N维列向量
* xx-插值点第一坐标
* 输出: 函数返回值所求插值点的第二坐标
******************************************************/
double newton(int n,double x[N],double y[N],double xx)
{
double d[N],b;
int i,j;

for(i=0;i<=n;i++)
d=y;
for(i=n-1;i>=0;i--) /*求差商*/
for(j=i+1;j<=n;j++)
{
if(fabs(x-x[j])<EPS)
return 0;
d[j]=(d[j-1]-d[j])/(x-x[j]);
}
b=d[n];
for(i=n-1;i>=0;i--)
b=d+(xx-x)*b;
return b;
}


#include <iostream>
#include <string>
#include <vector>
#include <iomanip>
using namespace std;

const int n=6; //设置初值的个数
//////////////////////////////////////////////////////////////////
//
//input_data():输入相关的数据
//
//////////////////////////////////////////////////////////////////
void input_data(float x[n],float y[n][n])
{
cout<<"输入插值点x[0,1,…,"<<n-1<<"]的值:"; //输入插值点
for(int i=0;i<n;i++)
cin>>x[i];
cout<<"输入插值点的函数值:"; //输入插值点的函数值
cout<<endl;
for(i=0;i<n;i++)
{
cout<<"f("<<x[i]<<")=";
cin>>y[i][0];
}
for(i=0;i<n;i++) //初始化y矩阵的其它数据
for(int j=1;j<n;j++)
y[i][j]=0;
}
//////////////////////////////////////////////////////////////////
//
//output_data():输出相关的数据
//
//////////////////////////////////////////////////////////////////
void output_data(float x[n],float y[n][n])
{
cout<<"x[k] f(x[k]) ";
for(int i=1;i<n;i++)
{
cout<<i<<"阶 ";
}
cout<<" ";
for(i=0;i<n;i++)
{
cout<<x[i]<<" ";
for(int j=0;j<n;j++)
cout<<y[i][j]<<" ";
cout<<" ";
}
cout<<" ";
}
//////////////////////////////////////////////////////////////////
//
//calculate_data():求各阶均差
//
//////////////////////////////////////////////////////////////////
void calculate_data(float x[n],float y[n][n])
{
for(int j=1;j<n;j++)
for(int i=j;i<n;i++)
{
y[i][j]=(y[i][j-1]-y[i-1][j-1])/(x[i]-x[i-j]);
}
}
//////////////////////////////////////////////////////////////////
//
//calculate_fx():用插值法计算f(x)的函数值
//
//////////////////////////////////////////////////////////////////
void calculate_fx(float x[n],float y[n][n])
{
cout<<"输入计值点的x值:";
float x_num,fx=y[0][0],mid;
cin>>x_num;
for(int i=1;i<n-1;i++)
{
mid=1;
for(int j=0;j<i;j++)
mid=mid*(x_num-x[j]);
fx=fx+y[i][i]*mid;
}
cout<<" 计值点x="<<x_num<<"的函数值f("<<x_num<<")="<<fx;
}
void main()
{
float x[n],y[n][n];
cout << setiosflags(ios::fixed); //和下一句结合起来用来设定小数位的位数
cout << setprecision(5);
input_data(x,y); //输入相关的数据
output_data(x,y); //输出相关的数据
calculate_data(x,y); //求各阶均差
output_data(x,y); //输出相关的数据
calculate_fx(x,y); //用插值法计算f(x)的函数值
}
下面的为牛顿插值法c情况下的实现。
引用内容
/******************************************************
* 用牛顿插值法依据N个已知数据点即使函数值
* 输入: n--已知数据点的个数N-1
* x--已知数据点第一坐标的N维列向量
* y--已知数据点第二坐标的N维列向量
* xx-插值点第一坐标
* 输出: 函数返回值所求插值点的第二坐标
******************************************************/
double newton(int n,double x[N],double y[N],double xx)
{
double d[N],b;
int i,j; 
for(i=0;i<=n;i++)
d=y;
for(i=n-1;i>=0;i--) /*求差商*/
for(j=i+1;j<=n;j++)
{
if(fabs(x-x[j])<EPS)
return 0;
d[j]=(d[j-1]-d[j])/(x-x[j]);
}
b=d[n];
for(i=n-1;i>=0;i--)
b=d+(xx-x)*b;
return b;
} 

#include <iostream>
#include <string>
#include <vector>
#include <iomanip>
using namespace std;
const int n=6; //设置初值的个数
//////////////////////////////////////////////////////////////////
//
//input_data():输入相关的数据
//
//////////////////////////////////////////////////////////////////
void input_data(float x[n],float y[n][n])
{
cout<<"输入插值点x[0,1,…,"<<n-1<<"]的值:"; //输入插值点
for(int i=0;i<n;i++)
cin>>x[i];
cout<<"输入插值点的函数值:"; //输入插值点的函数值
cout<<endl;
for(i=0;i<n;i++)
{
cout<<"f("<<x[i]<<")=";
cin>>y[i][0];
}
for(i=0;i<n;i++) //初始化y矩阵的其它数据
for(int j=1;j<n;j++)
y[i][j]=0;
}
//////////////////////////////////////////////////////////////////
//
//output_data():输出相关的数据
//
//////////////////////////////////////////////////////////////////
void output_data(float x[n],float y[n][n])
{
cout<<"x[k] f(x[k]) ";
for(int i=1;i<n;i++)
{
cout<<i<<"阶 ";
}
cout<<" ";
for(i=0;i<n;i++)
{
cout<<x[i]<<" ";
for(int j=0;j<n;j++)
cout<<y[i][j]<<" ";
cout<<" ";
}
cout<<" ";
}
//////////////////////////////////////////////////////////////////
//
//calculate_data():求各阶均差
//
//////////////////////////////////////////////////////////////////
void calculate_data(float x[n],float y[n][n])
{
for(int j=1;j<n;j++)
for(int i=j;i<n;i++)
{
y[i][j]=(y[i][j-1]-y[i-1][j-1])/(x[i]-x[i-j]);
}
}
//////////////////////////////////////////////////////////////////
//
//calculate_fx():用插值法计算f(x)的函数值
//
//////////////////////////////////////////////////////////////////
void calculate_fx(float x[n],float y[n][n])
{
cout<<"输入计值点的x值:";
float x_num,fx=y[0][0],mid;
cin>>x_num;
for(int i=1;i<n-1;i++)
{
mid=1;
for(int j=0;j<i;j++)
mid=mid*(x_num-x[j]);
fx=fx+y[i][i]*mid;
}
cout<<" 计值点x="<<x_num<<"的函数值f("<<x_num<<")="<<fx;
}
void main()
{
float x[n],y[n][n];
cout << setiosflags(ios::fixed); //和下一句结合起来用来设定小数位的位数
cout << setprecision(5);
input_data(x,y); //输入相关的数据
output_data(x,y); //输出相关的数据
calculate_data(x,y); //求各阶均差
output_data(x,y); //输出相关的数据
calculate_fx(x,y); //用插值法计算f(x)的函数值
}


13万+

被折叠的 条评论
为什么被折叠?



