曲线拟合等Word文件下载.docx
《曲线拟合等Word文件下载.docx》由会员分享,可在线阅读,更多相关《曲线拟合等Word文件下载.docx(12页珍藏版)》请在冰点文库上搜索。
存放n个节点的值
doubley[n](double*y)
存放n个节点相对应的函数值
doublep
指定插值点的值
doublefun()
函数返回一个双精度实型函数值,即插值点p处的近似函数值
#include<
iostream>
math.h>
usingnamespacestd;
#defineN100
doublefun(double*x,double*y,intn,doublep);
voidmain()
{inti,n;
cout<
<
"
输入节点的个数n:
;
cin>
>
n;
doublex[N],y[N],p;
pleaseinputxiangliangx="
endl;
for(i=0;
i<
i++)cin>
x[i];
pleaseinputxiangliangy="
y[i];
pleaseinputLagelangrichazhiJieDianp="
p;
TheAnswer="
fun(x,y,n,p)<
system("
pause"
);
}
doublefun(doublex[],doubley[],intn,doublep)
{doublez=0,s=1.0;
intk=0,i=0;
doubleL[N];
while(k<
n)
{if(k==0)
{for(i=1;
i++)s=s*(p-x[i])/(x[0]-x[i]);
L[0]=s*y[0];
k=k+1;
else
{s=1.0;
for(i=0;
=k-1;
i++)s=s*((p-x[i])/(x[k]-x[i]));
for(i=k+1;
i++)s=s*((p-x[i])/(x[k]-x[i]));
L[k]=s*y[k];
k++;
i++)z=z+L[i];
returnz;
四.运行结果测试:
五.实验分析
n=2时,为一次插值,即线性插值
n=3时,为二次插值,即抛物线插值
n=1,此时只有一个节点,插值点的值就是该节点的函数值
n<
1时,结果都是返回0的;
这里做了n=0和n=-7两种情况
3<
100时,也都有相应的答案
常用的是线性插值和抛物线插值,显然,抛物线精度相对高些
n次插值多项式Ln(x)通常是次数为n的多项式,特殊情况可能次数小于n.例如:
通过三点的二次插值多项式L2(x),如果三点共线,则y=L2(x)就是一条直线,而不是抛物线,这时L2(x)是一次式。
拟合曲线光顺性差
实验2牛顿插值法
一、方法原理及基本思路
在拉格朗日插值方法中,若增加一个节点数据,其插值的多项式需重新计算。
现构造一个插值多项式Nn(x),只需对Nn-1(x)作简单修正(如增加某项)即可得到,这样计算方便。
利用牛顿插值公式,当增加一个节点时,只需在后面多计算一项,而前面的计算仍有用;
另一方面Nn(x)的各项系数恰好又是各阶差商,而各阶差商可用差商公式来计算。
由线性代数知,对任何一个不高n次的多项式P(x)=b0+b1x+b2x2+…+bnxn(幂基)①
也可将其写成P(x)=a0+a1(x-x0)+a2(x-x0)(x-x1)+…+an(x-x0)…(x-xn-1)
其中ai为系数,xi为给定节点,可由①求出ai一般情况下,牛顿插值多项式Nn(x)可写成:
Nn(x)=a0+a1(x-x0)+a2(x-x0)(x-x1)+…+an(x-x0)…(x-xn-1))
只需求出系数ai,即可得到插值多项式。
二、计算方法及过程
1.先后输入节点个数n和节点的横纵坐标,插值点的横坐标,最后输入精度e
2.用do-while循环语句得到跳出循环时k的值
3.将k值与n-1进行比较,若在达到精度时k<
n-1,则输出计算结果;
若此时k=n-1,则计算失败!
floatx[MAX]
存放n个节点的值(从小到大)
Floaty[MAX];
floatx0,y0
指定插值点的横纵坐标
floate
精度
#defineMAX100
{floatx[MAX],y[MAX];
floatx0,y0,e,N1;
floatN0=0;
inti,k,n;
cout<
输入节点的个数,n="
请输入插值节点!
i++)cin>
请输入对应的函数值!
请输入插值点,x0="
x0;
请输入精度,e="
e;
y0=1;
N1=y[0];
k=0;
do{k++;
N0=N1;
y0=y0*(x0-x[k-1]);
k;
i++)y[k]=(y[k]-y[i])/(x[k]-x[i]);
N1=N0+y0*y[k];
}while(fabs(N1-N0)>
e&
&
k<
(n-1));
if(k==(n-1))cout<
计算失败!
if(k<
(n-1))cout<
输出结果y[x0]="
N1<
);
三.运行结果测试:
题一:
已知f(x)=sh(x)的函数表如下:
计算f(0.23)的近似值
xi
0.20
0.30
0.50
Sh(xi)
0.20134
0.30452
0.52110
题二:
已知根号100等于10,根号121等于11,根号144等于12;
用二次插值和三次插值计算根号115的近似值。
四.实验分析
显然,题二中当n=2,n=3时,k的值没有在n-1前满足各自的精度要求,所以计算失败
从题一中可以看出,插值点的个数、精度、插值点的选择都会影响实验的结果;
我们通常会选择与插值点最接近的节点,可以提高精度;
在可以计算出结果的情况下,插值点越多,结果越精确。
实验3最小二乘法求拟合曲线
一、方法原理及思路
已知数据对(xj,yj)(j=1,2,…,n),求多项式
为最小,这就是一个最小二乘问题。
二、计算方法及过程:
1.先后输入数据的对数m,近似多项式的最高次数n及各个数据的横纵坐标
2.用for循环语句得到线性方程组Ga=d
3.用高斯列主元消去法得到的解即为近似多项式的系数ai(i=0,1,…,n)
intm
数据的对数,即坐标的个数
近似多项式的最高次数
存放m个横坐标的值(从小到大)
存放m个纵坐标的值(与相应的横坐标对应)
Floata[MAX+1],
近似多项式的系数
floatG[MAX+1][MAX+1]
法方程的系数矩阵,且为对称的,正定的
floats[2*MAX+1]
系数矩阵G中的元素
Floatb[MAX+1];
法方程中等号右边的列向量
程序原代码如下
#include<
#defineMAX100
intmain()
{floatt;
inti,j,k,r,m,n;
请输入数据的对数,m="
m;
请输入近似多项式的最高次数,n="
floaty[MAX],x[MAX],x1[MAX],a[MAX+1],G[MAX+1][MAX+1],s[2*MAX+1],b[MAX+1];
请输入各个数据的横坐标!
for(i=0;
请输入各个数据的纵坐标!
s[0]=m;
b[0]=0.0;
for(j=0;
j<
j++)
{b[0]=b[0]+y[j];
x1[j]=1.0;
}
for(i=1;
=n;
i++)
{b[i]=0.0;
s[2*i-1]=0.0;
s[2*i]=0.0;
{x1[j]=x1[j]*x[j];
b[i]=b[i]+x1[j]*y[j];
s[2*i-1]=s[2*i-1]+x1[j]*x1[j]/x[j];
s[2*i]=s[2*i]+x1[j]*x1[j];
{for(j=0;
j++)G[i][j]=s[i+j];
for(k=0;
k<
k++)//高斯列主元消去法
{t=abs(G[k][k]);
r=k;
i++)
{if(t<
abs(G[i][k]))//选主元
{t=G[i][k];
r=i;
}
if(r>
k)//行交换
{for(j=k;
j++)
{t=G[k][j];
G[k][j]=G[r][j];
G[r][j]=t;
t=b[k];
b[k]=b[r];
b[r]=t;
i++)//消元
{t=G[i][k]/G[k][k];
for(j=k+1;
j++)G[i][j]=G[i][j]-t*G[k][j];
b[i]=b[i]-t*b[k];
a[n]=b[n]/G[n][n];
//回代
for(k=1;
k++)
{i=n-k;
a[i]=b[i];
for(j=i+1;
j++)a[i]=a[i]-G[i][j]*a[j];
a[i]=a[i]/G[i][i];
输出结果a"
//输出答案
i++)cout<
a[i]<
\t"
system("
三:
运行结果测试:
由于曲线拟合的最小二乘法一般是经过描点,确定其近似多项式的形式,但由于给定的点有误差,所以拟合曲线的数学模型并不是一开始就能选的好的,往往要通过分析确定若干模型后,再经过实际计算,才能选到较好的模型。