关于数值方法的一些算法解析(2)

时间:2023-02-13 09:28:31

 继续上次的~关于数值方法的一些算法解析(2)

3、编程分别用Lagrange插值多项式和Newton插值多项式计算x0=0.6,0.8,1.0处的sinx函数值

 

 

#include <stdio.h> 

#include <stdlib.h> 

#include <iostream> 

#include <cmath>

using namespace std;

typedef struct data 

    float x; 

    float y; 

}Data;//变量x和函数值y的结构 

Data d[20];//最多二十组数据 

float f(int s,int t)//牛顿插值法,用以返回插商 

    if(t==s+1) 

    return (d[t].y-d[s].y)/(d[t].x-d[s].x); 

    else 

    return (f(s+1,t)-f(s,t-1))/(d[t].x-d[s].x); 

float Newton(float x,int count) 

    int n; 

    while(1) 

        cout<<"请输入n(n次插值):";//获得插值次数 

        cin>>n; 

        if(n<=count-1)// 插值次数不得大于count1次 

        break; 

        else 

        system("cls"); 

    //初始化tyyt。 

    float t=1.0; 

    float y=d[0].y; 

    float yt=0.0; 

    //计算y值 

    for(int j=1;j<=n;j++) 

        t=(x-d[j-1].x)*t; 

        yt=f(0,j)*t; 

        //cout<<f(0,j)<<endl; 

        y=y+yt; 

    return y; 

float lagrange(float x,int count) 

    float y=0.0; 

    for(int k=0;k<count;k++)//这儿默认为count1次插值 

        float p=1.0;//初始化

        for(int j=0;j<count;j++) 

{//计算p的值 

             if(k==j)continue;//判断是否为同一个数 

             p=p*(x-d[j].x)/(d[k].x-d[j].x); 

        y=y+p*d[k].y;//求和 

    return y;//返回y的值 

void main() 

    float x,y; 

    int count; 

    while(1) 

         cout<<"请输入x[i]的组数,不得超过20:";//要求用户输入数据组数 

         cin>>count; 

         if(count<=20) 

         break;//检查输入的是否合法 

         system("cls"); 

    //获得各组数据 

    for(int i=0;i<count;i++) 

        cout<<"请输入第"<<i+1<<"x的值:"; 

        cin>>d[i].x; 

        cout<<"请输入第"<<i+1<<"y的值:"; 

cin>>d[i].y;

        system("cls"); 

    cout<<"请输入x的值:";//获得变量x的值 

    cin>>x; 

    while(1) 

         int choice=3; 

         cout<<"请您选择使用哪种插值法计算:"<<endl; 

         cout<<" (0):退出"<<endl; 

         cout<<" (1):Lagrange"<<endl; 

         cout<<" (2):Newton"<<endl; 

         cout<<"输入你的选择:"; 

         cin>>choice;//取得用户的选择项 

        if(choice==2) 

            cout<<"你选择了牛顿插值计算方法,其结果为:"; 

            y=Newton(x,count);break;//调用相应的处理函数 

        if(choice==1) 

            cout<<"你选择了拉格朗日插值计算方法,其结果为:"; 

            y=lagrange(x,count);break;//调用相应的处理函数 

        if(choice==0) 

        break; 

        system("cls"); 

        cout<<"输入错误!!!!"<<endl; 

    cout<<x<<" , "<<y<<endl;//输出最终结果 

cout<<"结果与sin(x)做比较:"<<sin(x)<<endl;