拉格朗日插值总是不对matlab

拉格朗日插值总是不对matlab,第1张

这个函数大体是正确的,但有小错误两个

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的拉格朗日插值等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9293023.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存