python拉格朗日函数,拉布朗日函数

谁有拉格朗日插值法的python代码啊!急用啊!谢谢啦!

您好,#includestdio.h

创新互联建站主营阜新网站建设的网络公司,主营网站建设方案,重庆APP软件开发,阜新h5成都小程序开发搭建,阜新网站营销推广欢迎阜新等地区企业咨询

#includestdlib.h

#includeiostream.h

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次插值):";//获得插值次数

cinn;

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

break;

else

system("cls");

}

//初始化t,y,yt。

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;

//coutf(0,j)endl;

y=y+yt;

}

return y;

}

float lagrange(float x,int count)

{

float y=0.0;

for(int k=0;kcount;k++)//这儿默认为count-1次插值

{

float p=1.0;//初始化p

for(int j=0;jcount;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],y[i]的组数,不得超过20组:";//要求用户输入数据组数

cincount;

if(count=20)

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

system("cls");

}

//获得各组数据

for(int i=0;icount;i++)

{

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

cind[i].x;

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

cind[i].y;

system("cls");

}

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

cinx;

while(1)

{

int choice=3;

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

cout" (0):退出"endl;

cout" (1):Lagrange"endl;

cout" (2):Newton"endl;

cout"输入你的选择:";

cinchoice;//取得用户的选择项

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;

}

coutx" , "yendl;//输出最终结果

}

python 拉格朗日插值 不能超过多少个值

拉格朗日插值Python代码实现

1. 数学原理

对某个多项式函数有已知的k+1个点,假设任意两个不同的都互不相同,那么应用拉格朗日插值公式所得到的拉格朗日插值多项式为:

其中每个lj(x)为拉格朗日基本多项式(或称插值基函数),其表达式为:

2. 轻量级实现

利用

直接编写程序,可以直接插值,并且得到对应的函数值。但是不能得到系数,也不能对其进行各项运算。

123456789101112

def h(x,y,a):    ans=0.0    for i in range(len(y)):        t=y[i]        for j in range(len(y)):            if i !=j:                t*=(a-x[j])/(x[i]-x[j])        ans +=t    return ansx=[1,0]y=[0,2]print(h(x,y,2))

上述代码中,h(x,y,a)就是插值函数,直接调用就行。参数说明如下:

x,y分别是对应点的x值和y值。具体详解下解释。

a为想要取得的函数的值。

事实上,最简单的拉格朗日插值就是两点式得到的一条直线。

例如:

p点(1,0)q点(0,2)

这两个点决定了一条直线,所以当x=2的时候,y应该是-2

该代码就是利用这两个点插值,然后a作为x=2调用函数验证的。

3. 引用库

3.1 库的安装

主要依赖与 scipy。官方网站见:

安装的方法很简单,就是使用pip install scipy 如果失败,则将whl文件下载到本地再利用命令进行安装。

可能如果没有安装numpy

3.2 库的使用

from scipy.interplotate import lagrange

直接调用lagrange(x,y)这个函数即可,返回 一个对象。

参数x,y分别是对应各个点的x值和y值。

例如:(1,2) (3,5) (5,9)这三个点,作为函数输入应该这么写:

x=[1,3,5]

y =[2, 5, 9]

a=lagrange(x,y)

直接输出该对象,就能看到插值的函数。

利用该对象,能得到很多特性。具体参见:

a.order得到阶

a[]得到系数

a()得到对应函数值

此外可以对其进行加减乘除运算

3.3 代码实现

1234567   from scipy.interpolate import lagrangex=[1,2,3,4,7]y=[5,7,10,3,9]a=lagrange(x,y)print(a)print(a(1),a(2),a(3))print(a[0],a[2],a[3])   

结果是:

class 'numpy.lib.polynomial.poly1d' 4

4            3              2

0.5472 x - 7.306 x + 30.65 x - 47.03 x + 28.13

5.0 7.0 10.0

28.1333333333 30.6527777778 -7.30555555556

解释:

class 'numpy.lib.polynomial.poly1d' 4

这一行是输出a的类型,以及最高次幂。

4            3              2

0.5472 x - 7.306 x + 30.65 x - 47.03 x + 28.13

第二行和第三行就是插值的结果,显示出的函数。

第二行的数字是对应下午的x的幂,如果对应不齐,则是排版问题。

5.0 7.0 10.0

第四行是代入的x值,得到的结果。

也就是说,用小括号f(x)的这种形式,可以直接得到计算结果。

28.1333333333 30.6527777778 -7.30555555556

自己写的拉格朗日插值法python,但是有错误,帮忙修改!

您好,一般地,若已知y=f(x)在互不相同 n+1 个点x0,x1,x2...,xn处的函数值y0,y1,y2...,yn( 即该函数过(x0,y0)(x1,y1)(x2,y2)...(xn,yn)这n个点),则可以考虑构造一个过这n+1 个点的、次数不超过n的多项式y=Pn(x),使其满足:

Pn(xk)=yk, k=0,1,2,...,n (*)

要估计任一点ξ,ξ≠xi,i=0,1,2,...,n,则可以用Pn(ξ)的值作为准确值f(ξ)的近似值,此方法叫做“插值法”。

称式(*)为插值条件(准则),含xi(i=0,1,...,n)的最小区间[a,b](a=min{x0,x1,...,xn},b=max{x0,x1,...,xn})

定理

满足插值条件的、次数不超过n的多项式是存在而且是唯一的。


分享文章:python拉格朗日函数,拉布朗日函数
地址分享:http://hbruida.cn/article/hopido.html