数值方法编程题,用c语言或者matlab都行,高手帮帮忙。。。程序越详细越好。谢谢了~

1、编写n次lagrange插值多项式程序
并计算sin11°30′的近似值(n=2,n=3)。
其中 sin11°=0.190809
sin12°=0.207912
sin13°=0.224951.

2、给定(xi,yi) ,i=0,1,2,…,n, 构造Newton插值多项式Nn(x), xi互不相同; 并计算sin11°30′的近似值,其中 sin11°=0.190809,sin12°=0.207912,
sin13°=0.224951

(1)n个节点lagrange插值多项式程序
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
温馨提示:答案为网友推荐,仅供参考
相似回答