计算方法实验实验一-创新互联

1实验目的和要求

实验目的:理解拉格朗日插值算法及牛顿插值算法的程序实现方法。
程序任务:
1)依据课本18页图1-3编程实现拉格朗日插值算法,并完成54页课后习题6.
注:分别以三个小题目中给出的条件画出插值函数,比较它们的不同。
2)编程实现牛顿插值算法,并完成如下题目:
用牛顿插值法来求sinx在区间多点的值,已知sin0°= 0, sin30°= 0.5, sin45°= 0.7071, sin60° = 0.8660, sin90°= 1. 以此为依据画出sinx在 区间的图像。

10余年建站经验, 成都做网站、网站建设客户的见证与正确选择。创新互联提供完善的营销型网页建站明细报价表。后期开发更加便捷高效,我们致力于追求更美、更快、更规范。2实验环境和工具

用matlab或C语言实现

3实验结果

3.1算法流程图
拉格朗日算法
在这里插入图片描述
在这里插入图片描述
3.2程序核心代码
c语言:

#includevoid achievel(void);
void achieveNew(void);
int main()
{int m;
    printf("1.实现拉格朗日算法\n2.实现牛顿插值算法\n\n");
    scanf("%d",&m);

    switch(m)
    {case 1:
        achievel();
        break;
    case 2:
        achieveNew();
        break;
    }
    return 0;
}

void achievel(void)//实现拉格朗日插值算法
{double xi[20],yi[20];
    double x,y,t;
    int i=0,j,k;

    printf("输入x的值:\n");
    scanf("%lf",&x);
    getchar();

    printf("输入多个点的横纵坐标:\n");
    while(i<20)
    {scanf("%lf %lf",&xi[i],&yi[i]);//输入9999终止
        if(xi[i]==9999)
        {break;
        }
        i++;
    }

    y = 0;
    for(k=0;kt = 1;
        for(j=0;jif(j!=k)
            {t = t*(x-xi[j])/(xi[k]-xi[j]);
            }
        }
        y = y + t*yi[k];
    }
    printf("纵坐标为:%lf",y);
}

void achieveNew(void)//实现牛顿插值算法
{double x,y;
    double xi[20],yi[20],fx[20][20];
    int i,j,k,m;

    printf("输入x的值:\n");
    scanf("%lf",&x);

    printf("输入多个点的横纵坐标:\n");
    for(i=0;i<20;i++)
    {scanf("%lf %lf",&xi[i],&yi[i]);//输入9999
        fx[0][i] = yi[i];
        if(xi[i]==9999)
        {break;
        }
    }

    m = i;
    for(i=1;ifor(j=i;jfx[i][j] = (fx[i-1][j]-fx[i-1][j-i])/(xi[j]-xi[j-i]);
        }
    }

    y = fx[0][0];
    for(i=1;ik = 1;
        for(j=i;j>0;j--)
        {k = fx[i][i]*(x-xi[j-1])*k;
        }
        y = y+k;
    }
    printf("纵坐标为:%lf",y);
}

Python(画图):

import matplotlib.pyplot as plt
import numpy as np
import math

def achievel(s):
    x = np.linspace(-5, 5, 50)
    x0 = -1
    x1 = 1
    y0 = -1
    y1 = 1
    if(s==1):
        y = (x-x1)/(x0-x1)*y0
        y = y + (x-x0)/(x1-x0)*y1
    else:
        x2 = 0
        y2 = 0
        if(s==2):
            y = (x-x1)*(x-x2)/(x0-x1)/(x0-x2)*y0
            y = y + (x-x0)*(x-x2)/(x1-x0)/(x1-x2)*y1
            y = y + (x-x0)*(x-x1)/(x2-x0)/(x2-x1)*y2
        elif(s==3):
            x3 = 2
            y3 = 8
            y = (x-x1)*(x-x2)*(x-x3)/(x0-x1)/(x0-x2)/(x0-x3)*y0
            y = y + (x-x0)*(x-x2)*(x-x3)/(x1-x0)/(x1-x2)/(x1-x3)*y1
            y = y + (x-x0)*(x-x1)*(x-x3)/(x2-x0)/(x2-x1)/(x2-x3)*y2
            y = y + (x-x0)*(x-x1)*(x-x2)/(x3-x0)/(x3-x1)/(x3-x2)*y3
    plt.figure()
    plt.plot(x, y)
    plt.show()

def achieven():
    x1 = 0
    x2 = math.pi/6
    x3 = math.pi/4
    x4 = math.pi/3
    x5 = math.pi/2
    y1 = 0
    y2 = 0.5
    y3 = 0.7071
    y4 = 0.8660
    y5 = 1
    
    y12 = (y2-y1)/(x2-x1)
    y23 = (y3-y2)/(x3-x2)
    y34 = (y4-y3)/(x4-x3)
    y45 = (y5-y4)/(x5-x4)

    y13 = (y23-y12)/(x3-x1)
    y24 = (y34-y23)/(x4-x2)
    y35 = (y45-y34)/(x5-x3)

    y14 = (y24-y13)/(x4-x1)
    y25 = (y35-y24)/(x5-x2)

    y15 = (y25-y14)/(x5-x1)

    x = np.linspace(0, math.pi/2, 50)
    y = y1+y12*(x-x1)+y13*(x-x1)*(x-x2)+y14*(x-x1)*(x-x2)*(x-x3)
    y = y+y15*(x-x1)*(x-x2)*(x-x3)*(x-x4)

    plt.figure()
    plt.plot(x, y)
    plt.show()

3.3运行结果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3.4运行结果分析
根据运行结果可得:拉格朗日算法的拟合效果较好,牛顿插值算法的拟合效果也很好。牛顿插值算法更适合较为复杂的函数进行拟合,而拉格朗日算法适合相较简单一点的函数。两者都是适合预估的函数值的算法。

4实验心得

在本次实验中,拉格朗日算法已经给出算法流程图,实现起来并不困难。牛顿插值算法虽然没有给出算法流程图,但这也帮助我们回顾了这个算法。
在这次实验中,我大的收获,就是了解了c语言的局限性。画图可以使用c++、matlab、java、python,但无法使用c语言画图,或者说,用c语言画出函数图像的难度大大提高,用其他语言画函数的图像,难度较低。也证明了c语言有它的优越性,也有其局限性,c语言在图形处理方面不如别的语言。
这更让我明白,一个合格的程序员不能只掌握一种语言,一种语言对于一个合格的程序员是远远不够的,我们在掌握多门语言的基础上,也需要尽全力学通每一门语言,只有做到这两点,我们才能在未来大显身手。
这一次的实验,也是对我们的促进,告诉我们需要不断努力。

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


文章名称:计算方法实验实验一-创新互联
当前网址:http://myzitong.com/article/icpps.html