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

用拉格朗日插值法(二次插值)来计算某个f(x)的值,我用了C语言编,但是编译的时候很多错误,求修改啊!_百度知道
用拉格朗日插值法(二次插值)来计算某个f(x)的值,我用了C语言编,但是编译的时候很多错误,求修改啊!
float x[i];i&,int n);;n&;
float a[i];=2;;
for(i=0,n&quot,xx#include &j&=2;x[%d];i++)
a[i]=y[i];y[%d],y;,yy),xx,i),float y[i]:&quot.h&%f&
printf(&x=%f;;i&%f&quot,j;
scanf(&quot!=i) a[i]*=(xx-x[j])/
void main()
float lagrange(float x[i];
printf(&quot,&xx););(x[i]-x[j]),y=%f&#92:&
float lagrange(float x[i];
return yy,i);i&);
for(i=0;Input xx,xx);n&quot,float y[i]:&quot,&y[i]),%f&
printf(&i++)
printf(&=2;
yy=lagrange(x,int n)
printf(&quot,&x[i]);=2;
for(j=0;scanf(&quot,yy=0;
scanf(&quot.0,y[i];&#92,
for(i=0;);\i++)
printf(&quot
提问者采纳
y[%d];&#47,不要 int n { i& 不写=2,y[3]; 定态数组 a[3]for(i=0;;/;n&,yy=0,y[3]for(i=0;%f&);
/n&quot,yy#include &
for(j=0;i&i++)
printf(&=2;i++)
printf(&quot,y:&quot,yy),xx,i);
}void main()
int i:&quot.h&%f&
printf(&x=%f;;
float a[3];
scanf(&j++)
去掉函数原型声明
float x[3];
printf(&quot,&xx);n&quot!=i) a[i]*=(xx-x[j])&#47,y=%f\x[%d]; float lagrange(float x[];
yy+=a[i];; 定态数组 x[3];);/Input xx,xx);&#92,float y[]:&quot,&y[i]),float xx)
/%f&quot,&x[i]);=2;j&
yy=lagrange(x,j;
printf(&;i&i++)
a[i]=y[i];scanf(&quot.0;(x[i]-x[j]),i);
/\/=2;)
提问者评价
谢谢啦,我真是太傻了。。。
其他类似问题
拉格朗日插值法的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁1637人阅读
拉格朗日插值法
拉格朗日插值法可以帮助我们解决以下的问题
已知x取&#,-1,2时,&f{x}取&#,0,6&
求x=3时f{x}的值。
&&&&&&&&int&xs[]={0,1,-1,2};
&&&&&&&&int&ys[]={2,2,0,6};
&&&&&&&&//f(3)?
&&&&&&&&int&val=lagrangePolynomial(3,xs,ys);
&&&&static&int&&lagrangePolynomial(int&x,&int&xs[],int&ys[])&
&&&&&&&&int&c1,c2;&
&&&&&&&&int&i,j,n;&
&&&&&&&&n=xs.
&&&&&&&&c1=0;&
&&&&&&&&for(i=0;i&n;i++){&
&&&&&&&&&&&&c2=ys[i];&
&&&&&&&&&&&&for(j=0;j&n;j++)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&if(j!=i)
&&&&&&&&&&&&&&&&&&&&c2=c2*(x-xs[j])/(xs-xs[j]);&
&&&&&&&&&&&&}
&&&&&&&&&&&&c1+=c2;&
&&&&&&&&}&
&&&&&&&&return&c1;
Lagrange插值方法的核心就是构造一组基函数。
如果插值点是{(x_i,y_i)}i=1..n,那么希望构造出一组多项式F_i(x)使得
F_i(x_i)=1,&F_i(x_j)=0&(j!=i)
其实就是构造一个函数,&这个函数在其中一点的值为1,&其它点的值为0&。&
这样的话把n个这样的函数加权加起来得到的函数就是在每个点上的值都是需要的了。
注意1:这里的多项式是一组。函数即是指多项式。其实针对每个插入点构造一个多项式(函数)。
注意2:关于如何得到多项式的请参阅
也就是说要构造“只受其中一个点影响”(这种讲法比较粗糙,因为和其他点的位置还是有关系)的函数。
如果这一点能办到,那么只要取f(x)=sum(y_i*F_i(x))就是所要的插值多项式。
Lagrange的插值方法其实就是直接构造出上述基函数:
F_i(x)&=&prod(x-x_j)&/&prod(x_i-x_j),其中prod是关于所有不等于i的j求乘积,
直接就可以验证F_i(x)满足前面提到的条件,
因为分子相当于确定了F_i(x)的所有根,分母则是归一化系数。
对于一些很复杂的函数运算。也可以用拉格朗日插值法来计算以提高效率。
我们可以先用函数运算均匀的生成一些x点和其对应得数值对。
然后就可以用拉格朗日插值法来计算以提高效率。
具体使用见实例1:
&&&&static&void&lagrangeDemo()
&&&&&&&&int&k=10000;
&&&&&&&&int&a=2;
&&&&&&&&int&x=0;
&&&&&&&&int&y=0;
&&&&&&&&int&m=0;
&&&&&&&&float&data[]=new&float[k];
&&&&&&&&Random&random=new&Random(System.currentTimeMillis());
&&&&&&&&for(int&i=0;i&k;i++)
&&&&&&&&&&&&do{
&&&&&&&&&&&&m=random.nextInt((int)(kMaxX-kMinX));
&&&&&&&&&&&&data=m+1/random.nextInt();
&&&&&&&&&&&&}while(data&kMinX||data&kMaxX);
&&&&&&&&float&res0,res1;
&&&&&&&&float&diff=0;
&&&&&&&&float&diffMax=0;
&&&&&&&&float&diffRate=0;
&&&&&&&&float&diffRateMax=0;
&&&&&&&&float&diffAll=0;
&&&&&&&&for(int&i=0;i&k;i++)
&&&&&&&&&&&&res0=count(a,data);
&&&&&&&&&&&&res1=function(a,data);
&&&&&&&&&&&&diff=(res1-res0);
&&&&&&&&&&&&if(Math.abs(diff)&diffMax)
&&&&&&&&&&&&&&&&diffMax=
&&&&&&&&&&&&diffAll+=
&&&&&&&&&&&&if(res1!=0)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&diffRate=diff*100/res1;
&&&&&&&&&&&&&&&&if(Math.abs(diffRate)&diffRateMax)
&&&&&&&&&&&&&&&&&&&&diffRateMax=diffR
&&&&&&&&&&&&}
&&&&&&&&System.out.println(&diffAll:&+diffAll+&diffMax:&+(diffMax)+&diffRateMax:&+diffRateMax+&%&);
&&&&&&&&long&time=System.currentTimeMillis();
&&&&&&&&for(int&i=0;i&k;i++)
&&&&&&&&&&&&res0=count(a,data);
&&&&&&&&System.out.println(&&lagrange&time:&+(System.currentTimeMillis()-time));
&&&&&&&&time=System.currentTimeMillis();
&&&&&&&&for(int&i=0;i&k;i++)
&&&&&&&&&&&&res1=function(a,data);
&&&&&&&&System.out.println(&Normal&time:&+(System.currentTimeMillis()-time));
&&&&static&HashMap&&String,float[][]&hashMap=new&HashMap&String,float[][]&();
&&&&final&static&int&kSection=100;
&&&&static&float&count(int&a,float&x)
&&&&&&&&String&key=&&+a;
&&&&&&&&float&f[][]=hashMap.get(key);
& & & &if(f==null)
&&&&&&&&&&&&&&&&f=getPairs(a);
& & & & & & & & hashMap.put(key,&f);
&&&&&&&&return&lagrangePolynomial(x,f[0],f[1]);
&&&&final&static&float&kMinX=0;
&&&&final&static&float&kMaxX=100;
&&&&static&float[][]&getPairs(int&a)
&&&&&&&&float&pairs[][]=new&float[2][kSection+1];
&&&&&&&&float&xs[]=pairs[0];
&&&&&&&&float&ys[]=pairs[1];
&&&&&&&&int&n=kS
&&&&&&&&for(int&i=0;i&=n;i++)
&&&&&&&&&&&&xs=kMinX+(kMaxX-kMinX)*i/n;
&&&&&&&&&&&&ys=function(a,xs);
&&&&&&&&return&
&&&&static&float&function(int&a,float&x)
&&&&&&&&float&y=x*x*x*x/(a*a+x*x*x*x+x*x);
&&&&&&&&int&n=1000;
&&&&&&&&int&i,j;
&&&&&&&&for(i=0;i&n;i++)
&&&&&&&&&&&&for(j=0;j&n;j++)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&y=y*n*(n+2)/((n+1)*(n+3))-1;
&&&&&&&&&&&&}
&&&&&&&&return&y;
&&&&static&int&&lagrangePolynomial(int&x,&int&xs[],int&ys[])&
&&&&&&&&int&c1,c2;&
&&&&&&&&int&i,j,n;&
&&&&&&&&n=xs.
&&&&&&&&c1=0;&
&&&&&&&&for(i=0;i&n;i++){&
&&&&&&&&&&&&c2=ys;&
&&&&&&&&&&&&for(j=0;j&n;j++)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&if(j!=i)
&&&&&&&&&&&&&&&&&&&&c2=c2*(x-xs[j])/(xs-xs[j]);&
&&&&&&&&&&&&}
&&&&&&&&&&&&c1+=c2;&
&&&&&&&&}&
&&&&&&&&return&c1;
&&&&static&float&&lagrangePolynomial(float&x,&float&xs[],float&ys[])&
&&&&&&&&float&c1,c2;&
&&&&&&&&int&i,j,n;&
&&&&&&&&n=xs.
&&&&&&&&c1=0;&
&&&&&&&&for(i=0;i&n;i++){&
&&&&&&&&&&&&c2=ys;&
&&&&&&&&&&&&for(j=0;j&n;j++)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&if(j!=i)
&&&&&&&&&&&&&&&&&&&&c2=c2*(x-xs[j])/(xs-xs[j]);&
&&&&&&&&&&&&}
&&&&&&&&&&&&c1+=c2;&
&&&&&&&&}&
&&&&&&&&return&c1;
运行结果:
diffAll:NaNdiffMax:4.diffRateMax:-6.%
lagrange&time:687
Normal&time:99359
注意:只有函数f(x)非常复杂,且f(x)的值随X变化不是很大时,用拉格朗日插值法来计算才有意义。
否则拉格朗日插值法的效率比直接用函数计算还要低。
关于拉格朗日插值法的更多数学知识请参考
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1725276次
积分:18384
积分:18384
排名:第177名
原创:221篇
转载:233篇
译文:175篇
评论:202条
(2)(6)(1)(2)(1)(7)(3)(7)(7)(7)(8)(7)(21)(45)(7)(8)(33)(17)(256)(97)(88)(1) 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
拉格朗日插值法与牛顿插值法的比较
下载积分:1000
内容提示:
文档格式:DOC|
浏览次数:52|
上传日期: 03:49:05|
文档星级:
该用户还上传了这些文档
拉格朗日插值法与牛顿插值法的比较.DOC
官方公共微信C语言实现拉格朗日插值法代码_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
喜欢此文档的还喜欢
C语言实现拉格朗日插值法代码
C​语​言​实​现​拉​格​朗​日​插​值​法​代​码
阅读已结束,如果下载本文需要使用
想免费下载本文?
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢使用python稀疏网格的插值(最好SciPy的)
我有一个大()像素的网格,它具有唯一确定(X,Y)定义的坐标值。举例来说,这是一个简化的版本是这样的:
我该怎么办线性插值或最近邻插值,这样我可以在网格中的每一个位置都有一个确定的值。
本文地址 :CodeGo.net/515085/
-------------------------------------------------------------------------------------------------------------------------
1. 这里是我的刺吧。
import numpy as np
from matplotlib.mlab import griddata
##Generate a random sparse grid
grid = np.random.random((6,6))*10
grid[grid&5] = np.nan
## Create Boolean array of missing values
mask = np.isfinite(grid)
## Get all of the finite values from the grid
values = grid[mask].flatten()
## Find indecies of finite values
index = np.where(mask==True)
x,y = index[0],index[1]
##Create regular grid of points
xi = np.arange(0,len(grid[0,:]),1)
yi = np.arange(0,len(grid[:,0]),1)
## Grid irregular points to regular grid using delaunay triangulation
ivals = griddata(x,y,values,xi,yi,interp='nn')
这就是我如何去插值分布不均点到正规的网格。我还没有尝试过任何其他类型的线性)。
使用SciPy的函数:
import numpy as np
from scipy.interpolate import griddata # not quite the same as `matplotlib.mlab.griddata`
grid = np.random.random((10, 10))
mask = np.random.random((10, 10)) & 0.2
points = mask.nonzero()
values = grid[points]
gridcoords = np.meshgrid[:grid.shape(0), :grid.shape(1)]
outgrid = griddata(points, values, gridcoords, method='nearest') # or method='linear', method='cubic'
你可以得到最近邻插值非常以下几行:
from scipy import ndimage as nd
indices = nd.distance_transform_edt(invalid_cell_mask, return_distances=False, return_indices=True)
data = data[tuple(ind)]
哪里invalid_cell_mask是的数组cell是不确定的布尔面具,data是要填充的数组。
我贴有完整的示例答案在填补空白的numpy的数组。
本文标题 :使用python稀疏网格的插值(最好SciPy的)
本文地址 :CodeGo.net/515085/
Copyright (C) 2014 CodeGo.net 沪ICP备号 联系电邮: (#=@)}

我要回帖

更多关于 拉格朗日插值法 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信