当前位置:文档之家› 计算方法实验

计算方法实验

}
in>>x;
floatresult = largerange(X,Y,num,x);
cout<<"我们想要的结果为:"<<result<<endl;
return0;
}
2.Lagrange插值子程序:
functiony=lagr1(x0,y0,x)%x0为插值点的向量,y0为插值点处的函数值向量,x为未知的点..............
cout<<"我们求"<<x<<"的近似值"<<endl;
cout<<"分段线性结果为:"<<result<<endl;
cout<<"精确值为:"<<jingque<<endl;
cout<<"误差为:"<<abs(jingque - result)<<endl;
return0;
}
结果:
牛顿:
子程序:
ifstreamin("input.txt");
in>>num;
for(inti = 0; i < num; i++)
{
in>>X[i];
in>>Y[i];
}
in>>x;
floatjingque = 1 / (1 + x*x);
floatresult = fenduan(X, Y, num, x);
步骤3:把所有的 线性叠加,得到通过所有插值点 的插值函数 。
Lagrange插值伪代码:
给定 个插值点 的情况下,求插值函数 在点 处的函数值。
/*输入参数
*x=(x0,x1,….,xn),插值节点
*y=(y0,y1,…,yn);被插函数f(x)在插值节点处的函数值
*t求插值函数Ln(x)在t处的函数值
floatlargerange(floatX[],floatY[],intn,floatx) {
floatres = 0;//结果
intj = 0;
floatLbase[N];//基函数
floatup, down;
for(intk = 0; k<n; k++) {
up = 1.0;
down = 1.0;
for(inti = 0; i<num; i++) {
cout<<"第"<<i + 1<<"个节点的x值:";
cin>>X[i];
cout<<"第"<<i + 1<<"个节点的y值:";
cin>>Y[i];
}
floatx;
cout<<"请输入待求解的插值节点的X值"<<endl;
cin>>x;
floatres = niudun(X, Y, x, num);
floatyiplus =1.0/(1.0+ (xl + 1)*(xl + 1));
floatres;
res = yi*(1 - ((x- xl) / h)) + yiplus*((x- xl) / h);
returnres;
}
主程序:
intmain()
{
floatX[N], Y[N], x;
intnum;
//求插上
floatchashang(floatX[],floatY[],intn)
{
floatres = 0;
floattemp = 0;
for(inti = 0; i<n+ 1; i++) {
temp =Y[i];
for(intj = 0; j<n+ 1; j++)
{
if(i != j) {
temp = temp / (X[i] -X[j]);//就是把他们的积球出来
*返回值插值函数Ln(x)在t处的函数值
*/
四、程序代码及实验结果
1.主程序
intmain()
{
floatX[N], Y[N], x;
intnum;
ifstreamin("input.txt");
in>>num;
for(inti = 0; i < num; i++)
{
in>>X[i];
in>>Y[i];
cout<<"插值结果为:"<<res<<endl;
}
结果:
。如图一所示。
图1
2
五、实验总结
1.拉格朗日插值在高次插值时同原函数偏差大、存在龙格现象,高次插值多项式不收敛。
for(j = 0; j<n; j++) {
if(j == k)
{
continue;//是乘非K的数so contiue
}
up = up*(x-X[j]);
down = down*(X[k] -X[j]);
}
Lbase[k] = up / down;//所有插值的base
}
//上米娜这个循环实现了基函数的运算
《计算方法》实验报告
学号
姓名
班级
计算机科学与计术三班
实验项目名称
一、实验名称
实验一插值与拟合
1.实验目的:
1.明确插值多项式和分段插值多项式各自的优缺点;
2.编程实现拉格朗日插值算法,分析实验结果体会高次插值产生的龙格现象;
3.理解最小二乘拟合,并编程实现线性拟合,掌握非线性拟合转化为线性拟合的方法
for(intj = 0; j<i; j++)
{
temp = temp*(x-X[j]);
}
res = res + f*temp;
}
returnres;
}
主程序:
intmain()
{
floatX[N], Y[N];
intnum;
cout<<"请输入插值的节点数:"<<endl;
cin>>num;
cout<<"请输入对应的插值结点(X,Y):"<<endl;
4.运用常用的插值和拟合方法解决实际问题。
二、实验内容及要求
1.给定函数………………….
2.
三、实验原理及算法描述
grange插值法的基本原理:
grange插值算法描述:(也可以是算法流程图)
步骤1:构造 处的插值基函数 ,其中,插值节点 处的插值基函数 为 ;
步骤2:以 作为 的系数,使得 通过插值点 ;
}
}
res = res + temp;//求和
}
returnres;
}
floatniudun(floatX[],floatY[],floatx,intn)
{
doubleres = 0;
for(inti = 0; i<n; i++)
{
floattemp = 1;
floatf = chashang(X,Y, i);
for(inti = 0; i<n; i++) {
res = res + Lbase[i] *Y[i];
}
returnLeabharlann es;}实验结果:
分段线性差值:
子程序:
floatfenduan(floatX[],floatY[],intn,floatx)
{
inth = 1;
intxl =x;
floatyi = 1.0 / (1.0+ xl*xl);
相关主题