主题:请教lagrange和newton插值的M文件
l75395123
[专家分:0] 发布于 2007-05-18 10:54:00
之前听说有这两个算法的函数,可是找了很多地方都没有找到。
后来翻查了MATLAB 6 的实例教程,上面说没有给出这两个多项式的函数,但是有M文件的代码。可是书上只有文字,没有程序。
不知道MATLAB 7 里有没有加入这两个插值多项式的函数?
回复列表 (共6个回复)
沙发
Guassfans [专家分:4090] 发布于 2007-05-18 12:12:00
MATLAB插值函数:interp1 (一元插值,思想就是lagrange插值公式)
如果你知道这两种算法的话可自己设计程序!
板凳
Guassfans [专家分:4090] 发布于 2007-05-18 12:15:00
function fi=lagran(x,f,xi) %lagrange插值算法
%x自变量
%f函数值
%xi插值点
%fi返回插值
fi=zeros(size(xi));
npl=length(f);
for i=1:npl
z=ones(size(xi));
for j=1:npl
if i~=j,z=z.*(xi-x(j))/(x(i)-x(j));end
end
fi=fi+z*f(i);
end
return
3 楼
l75395123 [专家分:0] 发布于 2007-05-18 14:56:00
非常感谢~~~~~~!!!![em8]
4 楼
lihongbo1006 [专家分:0] 发布于 2009-01-01 13:31:00
我的lagrange插值函数就是这样编的,在运行M文件时,老是提示Input argument 'xi' is undefined.这是怎么回事呢?请您给点意见呗。
5 楼
lihongbo1006 [专家分:0] 发布于 2009-01-01 13:40:00
问了个很好吃的问题,我已经解决这个问题了,自己真是太菜了
6 楼
kekeai [专家分:0] 发布于 2009-01-08 15:46:00
拉格朗日插值公式程序
function f=language(x,y,x0)
n=length(x);
syms t; f=0;
for k=1:
lx=y(k);
for j=1:k-1
lx=lx*(t-x(j))/(x(k)-x(j));
end
for j=k+1:n
lx=lx*(t-x(j))/(x(k)-x(j));
end
f=f+lx;
end
if nargin==3
f=subs(f,'t',x0);
else
f=collect(f);
f=vpa(f,6);
end
例: 根据下列数据点求出其拉格朗日插值多项式, 并计算它在x=1.6处的函数值。
x=[1 1.2 1.8 2.5 4];
y=[0.8415 0.932 0.9738 0.5985 -0.7568];
f1=language(x,y)
f2=language(x,y,1.6)
f1=.328112e-1*t^4-.204917*t^3- .145485e-1*t^2+1.05427*t-
.261189e-1
f2=0.9992
表中的数据是按y=sin(x)给出的
sin(1.6)=0.9996,
可见插值函数的精度是很高的。
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
牛顿插值公式程序
function f=newton(x,y,x0)
n=length(x);
syms t; f=y(1);
y1=0; lx=1;
for i=1:n-1
for j=i+1:n
y1(j)=(y(j-1)-y(j))/(x(j-i)-x(j));
end
c(i)=y1(i+1); lx=lx*(t-x(i));
f=f+c(i)*lx;
y=y1;
end
if nargin==3
f=subs(f,'t',x0);
else
f=collect(f);
f=vpa(f,6);
end
例: 根据下列数据点求出其牛顿插值多项式, 并计算它在x=2处的函数值。
x=[1 1.2 1.8 2.5 4];
y=[1 1.44 3.24 6.25 16];
f1=newton(x,y)
f2=newton(x,y,2)
f1=.264339e-16*t^4-.171820e-
15*t^3+1.00000*t^2-
.398094e-15*t+.142743e-15
f2=4
表中的数据是按 y =x2 给出的, 可见牛顿插值函数的精度也是很高的。
我来回复