这个函数大体是正确的,但有小错误两个
1 L=Labs((z-x0(j)))/(x0(k)-x0(j));这行不需要abs
2 x是个数值的话 就不需要m=length(x);和下面的循环输出了;
我开始认同你的看法,但作图后发现,不能这样想当然。不同函数不一样,这个被插值函数在0附近的值下降很快。完整图像我给你看看。
今天看了下这个问题,可能用拟合更好(因为你的数值线性度较大,拉格朗日插值条件不好,Matlab里面称为Bad Condition)用拟合方法如下(线性拟合)
clear
>> x0=[4 8 12 16 20 24];
y0=[1590 1320 1000 900 650 560];
p=polyfit(x0,y0,1);
>> x=-1:30;
y=polyval(p,x);
>> plot(x,y)
%显示0处拟合值
>> polyval(p,0)
%----------------------------
结果为1729
因为只能放一个图 我就把第一个图删除了
你需要把上面的部分保存为Lagrangenew。m文件。
文件头应加 function s=Lagrangenew(x,y,x0)
后面是
nx=length(x);
ny=length(y);
。。。。。。
然后,可以命令窗口执行下面部分的命令
结果如下
function y=lagrange(x0,y0,x);
n=length(x0);m=length(x);
for i=1:m
z=x(i);
s=00;
for k=1:n
p=10;
for j=1:n
if j~=k
p=p(z-x0(j))/(x0(k)-x0(j));
end
end
s=py0(k)+s;
end
y(i)=s;
end
------------------------------------------------------
x=[01 02 015 0 -02 03];
y=[095 084 086 106 15 072];
x0=[-02:001:3];
y0=lagrange(x,y,x0);
function [x0,y0] = Lagrange_2(x,y,x0)
%输入: x, y 插值节点(点点互异,否则修改为参数形式)
% x0待求点
%输出:x0,y0,插值结果
n = length(x); % 插值节点个数,x,y应该要一致
m = length(x0); % 待求点个数
y0 = zeros(1,m);% 为输出分配空间
for j = 1:m
for i=1:n
% Lagrange插值公式:li(x) = yiprod(x-xj)/prod(xi-xj),i~=j;
xj = x;
xj(i) = [];
y0(j) = y0(j) + y(i)prod( x0(j) -xj ) / prod( x(i) - xj );
end
end
%%%%%%%%%%%%%%
调用方法:
x = [-5:5];
y = 1/(1+x^2);
x0 = [-5:001:5]; %根据自己电脑性能选取合适步长
[x0,y0] = Lagrange_2(x,y,x0);
hold on;
plot(x0,1/(1+x0^2),'r');%原函数y=1/(1+x^2)图像
plot(x0,y0);%插值函数图像
用matlab画出y=1/(1+25x^2)拉格朗日插值的图像,可以这样来实现。
x0=linspace(-1,1,5); %x在-1到1之间取5等分
y0=1/(1+25x0^2); %计算相应函数的值
xx=-1:005:1;
yy1=Lagrange1(x0,y0,xx);
x0=linspace(-1,1,20); %x在-1到1之间取20等分
y0=1/(1+25x0^2); %计算相应函数的值
yy2=Lagrange1(x0,y0,xx);
plot(xx,yy1,'k-',xx,yy2,'b-',xx,1/(1+25xx^2),'r:')
axis([-1,1,-07,12]);
grid on
legend('5次拉格朗日插值','20次拉格朗日插值','y=1/(1+25x^2)')
xlabel('x');ylabel('y');
title('y=1/(1+25x^2)拉格朗日插值的图像');
运行结果
附件中是拉格朗日插值法程序。
以下面数据为例:(运行时,也就是调用Languagem程序)
x = [-215 -100 001 102 203 325];
y = [1703 724 105 203 1706 2305 ];
x0 = 06;
y0=Language(x,y,x0)
(上面语句,在command window中输入即可)
结果:
y0=
00201
我看看我有没有,好像我有一个拉格朗日插值法的程序
function h = hlagr2(L,x)
% HLAGR2
% MATLAB m-file for fractional delay approximation
%拉格朗日插值法的实现函数
% by LAGRANGE INTERPOLATION method
% h = hlagr2(L,x) returns a length L (real) FIR
% filter which approximates the fractional delay
% of x samples
% Input: L = filter length (filter order N = L-1)
% x = fractional delay (0 < x <= 1)
% Output: Filter coefficient vector h(1)h(L)
% Subroutines: standard MATLAB functions
N = L-1; % filter order
M = N/2; % middle value
if (M-round(M))==0 D=x+M; % integer part closest to middle
else D=x+M-05; end;
%
h=ones(1,(N+1));
%
for n=0:N
n1=n+1;
for k=0:N
if (k~=n)
h(n1) = h(n1)(D-k)/(n-k);
end % if
end; % for k
end; % for n
这个是用于分数延迟滤波器中拉格朗日插值法的,你可以试试看。或者仿照一下。
以上就是关于拉格朗日插值总是不对matlab全部的内容,包括:拉格朗日插值总是不对matlab、matlab求拉格朗日插值多项式并画图、matlab的拉格朗日插值等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)