插值公式(代码实现)——lagrange插值法

   引言——关于插值公式

   插值公式,顾名思义,给定若干样本点,进行拟合得到普适公式。

   可能你会好奇,这样的插值公式有什么用呢?我作为一个数学系学渣,远离应用层面,自然说不出个所以然。但是我想,高中的时候,你肯定深受数列题的折磨吧~

   给定数列的前几项,试写出它的递推公式/第m项。

    欸,你是不是陷入了等差等比不动点的噩梦中了?你仔细看看,这不就是个插值问题吗——给定有限个样本点(m,am),求第n项(n,an)么。如果我有一个可以计算插值公式的程序,这活不就可以留给计算机做了嘛~

   那我来出个题吧——1 4 9 16 试写出它的第6项

   这不是当大家是傻子么 根据序号的平方关系,当然是36!

   且慢,我们来看下某个叫做lagrange的计算机的回答:

   插值公式(代码实现)——lagrange插值法_第1张图片

  很满意!计算机和我们的答案一致!

  那么 我们换一个题 一样很简单:2 4 8 16 试写出第六项

   这不是显然64么?!2的幂次!

   让我们再看下计算机lagrange的回答:

   插值公式(代码实现)——lagrange插值法_第2张图片

   咦,怎么会是52呢?

   我想聪明的你一定明白了些什么,事实上,我们虽然有两点确定一条直线的公理,但是R^n空间有限个点并不能确定一个n元函数(不信,你自己画画看,有限个点甚至不能改变函数在紧集上的黎曼积分值!)。所以,高中的找规律数列题的答案并不是唯一的!而我们的插值公式,自然也是在一定限制条件下的唯一解。

    我们自然地给出如下定义:(摘自《数值计算方法》——科学出版社)

    一个逼近问题应该包含三个要素

    (1)被逼近函数或样本点集合;

    (2)逼近函数空间:一般取为简单函数空间。简单函数包括但不限于可以用四则运算进行计算的函数,尤其是代数多项式(拉格朗日逼近),三角多项式(傅里叶变换),分段多项式(样条插值问题)和有理函数。

    (3)逼近方式:本文章主要限于逼近函数曲线通过样本点。当然,可以对n阶导数值进行要求。

         本篇将简要介绍lagrange插值公式,nevile插值公式和newton插值公式的推导与具体代码实现。

       lagrange插值法

          已知n+1个样本点,试确定其对应的lagrange插值公式。

         首先,我们构造基函数(特殊函数)(算了直接上教科书截图,谁让我菜用不好latex)

         插值公式(代码实现)——lagrange插值法_第3张图片

        非常好,既然我们有了这样一个基函数,当然可以轻而易举地写出lagrange插值公式咯~

        插值公式(代码实现)——lagrange插值法_第4张图片

okay  下面就是写程序的事情咯~仔细分析一下,基函数的连乘形式让我们想到for循环,至于j!=i这一步,用continue跳过循环就好啦~鱼块地将基函数写成函数进行调用~

#include
#include
int num = 0;
/*Multi函数
用于计算拉格朗日因子的分子(分母值)
返回值 (double)拉格朗日因子的分子值(分母值)
传入参数:(double)代求点x (double array)给定样本点的x分量 (int)基函数的编号k
*/

	double Multi(double x, double a[], int k)
	{
	double S = 1.0;
		for (int i = 0; i  

我的运行环境是VS2015,如果是其他IDE,把scanf_s改成scanf就可以啦~

忽然想到实变作业还没写……nevile插值和newton插值就日后再更啦!!!

毕竟是数学——计算机结合部的小学渣,希望可以得到大家的改进建议~无论是数学推导的严谨性,算法改进,乃至代码风格,都非常欢迎!!! 之所以写博客,是听说网上有些插值公式的代码不能在计算机上运行,因此打击了苦于无法计算机实现的同学的积极性。在此贴出自己亲测过的代码,希望大家可以由此体会到数学与计算机结合的美妙吧~

谢谢你愿意阅读到这里,晚安~

Veal黎 2018/04/05 夜


你可能感兴趣的:(插值公式(代码实现)——lagrange插值法)