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

来源:互联网 发布:select linux 编辑:程序博客网 时间:2024/06/05 03:51

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[n];    double *bx = new double[n];//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个点    {        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;}
0 0
原创粉丝点击