function yy=lagrange(x1,y1,xx)
%本程序為Lagrange1插值,其中x1,y1
%為插值節點和節點上的函數值,輸出為插值點xx的函數值,
%xx可以是向量。
syms x
n=length(x1);
for i=1:n
t=x1;t(i)=[];L(i)=prod((x-t)./(x1(i)-t));% L向量用來存放插值基函數
end
u=sum(L.*y1);
p=simplify(u) % p是簡化後的Lagrange插值函數(字符串)
yy=subs(p,x,xx);
clf
plot(x1,y1,'ro',xx,yy,'*')
========
命令窗口命令及結果
format long g
>> lagrange([11 12],[0.190809 0.207912],11.5)
p =
(616200515415341*x)/36028797018963968 + 96413060822745/36028797018963968
ans =
0.1993605
>> lagrange([11 12 13],[0.190809 0.207912 0.224951],11.5)
p =
- (1152921504607*x^2)/36028797018963968 + (321358855010651*x)/18014398509481984 - 55772577785379/36028797018963968
ans =
0.1993685
>> sin(11.5*pi/180)
ans = 0.199367934417197
(2)
function f = Newton(x,y,x0)
%本程序為Newton插值,其中x,y
%為插值節點和節點上的函數值,輸出為插值點x0的函數值,
%x0可以是向量。
syms t;
if(length(x) == length(y))
n = length(x);
c(1:n) = 0.0;
else
disp('x和y的維數不相等!');
return;
end
f = y(1);
y1 = 0;
l = 1;
for(i=1:n-1)
for(j=i+1:n)
y1(j) = (y(j)-y(i))/(x(j)-x(i));
end
c(i) = y1(i+1);
l = l*(t-x(i));
f = f + c(i)*l;
simplify(f)
y = y1;
if(i==n-1)
if(nargin == 3)
f = subs(f,'t',x0);
else
f = collect(f); %將插值多項式展開
f = vpa(f, 6);
end
end
end
==========
fn=Newton([11 12],[0.190809 0.207912],11.5)
ans =
(616200515415341*t)/36028797018963968 + 96413060822745/36028797018963968
fn =
0.1993605
>> fn=Newton([11 12 13],[0.190809 0.207912 0.224951],11.5)
ans =
(616200515415341*t)/36028797018963968 + 96413060822745/36028797018963968
ans =
- (1152921504607*t^2)/36028797018963968 + (321358855010651*t)/18014398509481984 - 55772577785379/36028797018963968
fn =
0.1993685