您的位置:首页 > 理论基础

计算机数值方法与算法-拉格朗日插值多项式总结

2017-04-12 21:45 239 查看

lagrange问题

作业是编写拉格朗插值,但是遇到了过去编程没有遇到过的问题。

作业:《计算机数值方法》第1次编程作业——拉格朗日插值

自行插值问题或按如下关于函数y=f(x)的数据表格,用拉格朗日插值求待求插值点t(例如t=0.13、t=0.63、t=1.03等等)的函数近似值ft。(要求根据t的大小,自动选取8个点用7次拉格朗日插值计算)

i —–xi — —yi —— i—-xi ——–yi

1 0.10 0.1103329 11 0.60 1.0288456

2 0.15 0.1736223 12 0.65 1.1592592

3 0.20 0.2426552 13 0.70 1.2972951

4 0.25 0.3176729 14 0.75 1.4430292

5 0.30 0.3989105 15 0.80 1.5965053

6 0.35 0.4865951 16 0.85 1.7577308

7 0.40 0.5809439 17 0.90 1.9266733

8 0.45 0.6821617 18 0.95 2.1032563

9 0.50 0.7904390 19 1.00 2.2873552

10 0.55 0.9059492 20 1.05 2.4787929

程序结构要求:

(1) 编写拉格朗日插值函数

double Lagrange(double x[],double y[],double t,int n)

{ …… }

//函数参数说明:x[]和y[]为一维数组形参,表示表格中的数据;t为待求点;n为表格中的结点数。

(2) 主函数main()调用上面的函数完成计算并输出结果。

#include<iostream>
#include<cmath>
using namespace std;
double Lagrange(double *x, double *y, double t, int n)
{// 传值
double ft=0.0;
int i;
for (i = 1; i<20 && x[i]<t; i++);
cout << "i" <<i<< endl;
for(int q=0;q<20;q++)
{
cout << q<<"\t "<<x[q] << "\t " << y[q] << endl;//测验
}
double *ax = new double
;
double *bx = new double
;//new空间 让自己输出,然后让可以明白.
if (n / 2 <= i&&i<(20 - n / 2 + 1) ){
for (int k = 0; k<n; k++)
{
ax[k] = x[i + k-4];
cout << "ax" << k << "=\t" << ax[k] << endl;;
bx[k] = y[i + k-4];
//cout << "bx" << k << "=" << bx[k];
}
cout << "first" << endl;
}
else if (n / 2<i)//前面N个点
{

for (int k = 0; k<n; k++)
{
ax[k] = x[1 + k];
bx[k] = y[1 + k];
}
cout << "two" << endl;
}
else//后面N个点
{

be5d
for (int k = 0; k<n; k++)
{
ax[k] = x[20 - n + 1 + k];
bx[k] = y[20 - n + 1 + k];
}
cout << "houmian" << endl;
}
double tmp = 1.0;
//这里错了,后面一直去测试,发现,tmp,每次循环都保留一个值,造成错误,应该把tmp放置再第一个循环
for (int j = 0; j<=n; j++)//n=8
{
for (int k = 0; k <=j - 1; k++)
{
tmp = tmp*((t - ax[k]) / (ax[j] - ax[k]));
//cout << "tmp的值" << tmp<<"  ";
//cout << "k和j的值" << k << " " << j << endl;
//cout << "((fabs)(t - ax[k]) / (fabs)(ax[j] - ax[k])):"<<((fabs)(t - ax[k]) / (fabs)(ax[j] - ax[k])) << endl;
//cout << "t-ax"<<k<<" "<< (fabs)(t - ax[k]) <<"ax"<<j<<"ax"<<k<<" "<< (fabs)(ax[j] - ax[k]) <<" tmp:"<<tmp;
}
for (int k = j + 1; k <= n; k++)
{
tmp = tmp*((t - ax[k]) / (ax[j] - ax[k]));
//cout << "tmp的值" << tmp <<"  ";
//cout << "k和j的值" << k << " " << j << endl;
//cout << "((fabs)(t - ax[k]) / (fabs)(ax[j] - ax[k])):" << ((fabs)(t - ax[k]) / (fabs)(ax[j] - ax[k])) << endl;
}
ft= ft + tmp*bx[j];
}
return ft;
}
int main()
{
double x[21] = { 0.10,0.15,0.20,0.25,0.30,0.35,0.40,0.45,
0.50,0.55,0.60,0.65,0.70,0.75,0.80,0.85,0.90,0.95,
1.00,1.05 };
double y[21] = { 0.1103329,0.1736223,0.2426552,0.3176729,0.3989105,
0.4865951,0.5809439,0.6821617,0.7904390,0.9059492,1.0288456,
1.1592592,1.2972951,1.4430292,1.5965053,1.7577308,1.9266733,
2.1032563,2.2873552,2.4787929 };
double t;
int n;
cout << "输入插值点t的值" << endl;
cin >> t;
cout << "选取8个点作插值运算" << endl;
n = 8;
double *px = x;
double *py = y;
cout << *px << "   " << *py<<endl;
double k=Lagrange(px, py, t, n);
cout << k;
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: