案例高数用Matlab Code实现计算留学生代做:课后习题 Math-matlab
当前位置:以往案例 > >案例高数用Matlab Code实现计算留学生代做:课后习题 Math-matlab
2017-10-26


1.1 已知n+1节点xiyi=f(xi)(i=0,…,n)编写nLagrange差值nNewton差值的通用程序。然后根据给定的数据表:

x

0.46

0.47

0.48

0.49

f(x)

0.4846555

0.4937452

0.5027498

0.5116683

利用所编的通用程序计算f(0.485)

编程思想

Lagrange差值公式:

1.jpg

计算程序

Lagrange差值通用程序:

function y=fun_test_1_1_Lagrange(x,x1,y1)

% Lagrange插值法

for nx=1:length(x)

for nx1=1:length(x1)

tempx=x1;

tempx(nx1)=[];

temp1=x(nx)-tempx;

temp2=x1(nx1)-tempx;

lx(nx1)=prod(temp1)/prod(temp2);

end

y(nx)=sum(y1.*lx);

end

Newton插值通用程序:

function y=fun_test_1_1_Newton(x,x1,y1)

% Newton插值法

for nx=1:length(x)

temp1=y1(1);

temp2=y1(2);

lk(1)=y1(1);

yk(1)=1;

for nx1=2:length(x1)-1

temp11=(temp2-temp1)/(x1(nx1)-x1(nx1-1));

temp2=(y1(nx1+1)-temp1)/(x1(nx1+1)-x1(nx1-1));

temp1=temp11;

lk(nx1)=temp1;

yk(nx1)=prod(x(nx)-x1(1:nx1-1));

end

y(nx)=sum(yk.*lk);

end

计算结果

Lagrange差值:f(0.485)= 0.507219875

Newton差值:f(0.485)= 0.5072201875

1.2 已知n+1等距节点xi=x0+ihyi=f(xi)(i=0…,n)编写Newton向前值和向后插值通用程序,然后根据给定的数据:

x

1.3

1.31

1.32

1.33

f(x)

3.6021

3.7471

3.9033

4.0723

利用所编的通用程序分别计算f(1.305)f(1.325).

编程思想:

向前查分符

向后查分符

等距节点xi=x0+ihyi=f(xi)

1Newton向前插值公式:

2Newton插值公式:

计算程序

1向前差值通用程序

function y=test_1_2_forword(x,x0,h,y1)

% 牛顿向前差分

for nx=1:length(x)

temp1=y1(1);

temp2=y1(2);

lk(1)=1;

yk(1)=y1(1);

t=(x(nx)-x0)/h;

for nx1=2:length(y1)-1

lk(nx1)=prod(t-(0:nx1-2))/factorial(nx1-1);

temp1=temp2-temp1;

temp2=y1(nx1+1)-temp2;

yk(nx1)=temp1;

end

y(nx)=sum(yk.*lk);

end

2向后差分通用程序

function y=test_1_2_backword(x,x0,h,y1)

% 牛顿向前差分

for nx=1:length(x)

temp1=y1(end);

temp2=y1(end-1);

lk(1)=1;

yk(1)=y1(end);

t=(x(nx)-x0)/h;

for nx1=2:length(y1)-1

lk(nx1)=prod(t-(0:nx1-2))/factorial(nx1-1);

temp1=temp1-temp2;

temp2=temp2-y1(length(y1)-nx1);

yk(nx1)=temp1;

end

y(nx)=sum(yk.*lk);

end

主程序

clear,clc

format long

x1=[1.3,1.31,1.32,1.33];

y1=[3.6021,3.7471,3.9033,4.0723];

x=[1.305,1.325];

%前插Newton插值

disp('前插Newton插值')

y=test_1_2_forword(x,1.3,0.01,y1)

%后插Newton插值

disp('后插Newton插值')

y=test_1_2_backword(x,1.33,0.01,y1)

计算结果:

1向前差分

f(1.305)f(1.325)分别为:3.67323.9856

2向后差分:

f(1.305)f(1.325)分别为:3.70583.9926

1.3 给定函数分别取n=5,10,20,在区间[-5,5]取等距节点做nLagrange差值,画图给出nLagrange差值多项式的图像并与f(x)图像进行比较。

编程思想:

1.1相同

计算程序:

clear,clc

format long

n=5;

[email protected](x)1./(1+x.^2);

x1=linspace(-5,5,n);

x=linspace(-5,5,1000);

%lagrange插值

y=fun_test_1_1_Lagrange(x,x1,fx(x1));

plot(x1,fx(x1),x,y)

计算结果:

1.jpg

2.jpg

1.4 n=20,利用给出所需数据在区间[-5,5]n+1等距节点,分别作分段线性插值和分段三次Hermite插值,画图给出分段线性插值和分段三次Hermite插值多项式的图像,并与f(x)图像进行比较,另外,以你的教学好的后三位构造[3.7,3.8]的点xc给出两种插值多项式在xc的值。

编程思想:

分段三次Hermite插值公式:

分段线性插值:

计算程序

分段三次Hermite插值公通用程序

function y=fun_test_1_4_Hermite(xm,xn,f,df)

% 三次Hermite插值法

% x为插值点,x1y1分别为已知数据的自变量和因变量

% dy为因变量的导数

for nx=1:length(xm)

x=xm(nx);

nn1=max(find(xn<=xm(nx)));

nn2=min(find(xn>=xm(nx)));

x0=xn(nn1);

x1=xn(nn2);

temp1=(1-2*(x-x0)/(x0-x1))*((x-x1)/(x0-x1))^2*f(nn1);

temp2=(x-x0)*((x-x1)/(x1-x0))^2*df(nn1);

temp3=(1-2*(x-x1)/(x1-x0))*((x-x0)/(x1-x0))^2*f(nn2);

temp4=(x-x1)*((x-x0)/(x0-x1))^2*df(nn2);

y(nx)=temp1+temp2+temp3+temp4;

end

分段线性插值通用程序:

function y=fun_test_1_4_line(xm,xn,f)

% 线性插值

for nx=1:length(xm)

x=xm(nx);

nn1=max(find(xn<=xm(nx)));

nn2=min(find(xn>=xm(nx)));

x0=xn(nn1);

x1=xn(nn2);

y(nx)=(x-x1)/(x0-x1)*f(nn1)+(x-x0)/(x1-x0)*f(nn2);

end

计算主程序:

clear,clc

format long

n=10;

[email protected](x)1./(1+x.^2);

[email protected](x)-2*x./(1+x.^2).^2;

x1=linspace(-5,5,n+1);

y1=fx(x1);

x=linspace(-5,5,100);

yH=fun_test_1_4_Hermite(x,x1,fx(x1),dfx(x1))

plot(x1,fx(x1),x,yH,'p')

hold on

yL=fun_test_1_4_line(x,x1,fx(x1))

plot(x,yL,'-o')

计算结果

分段三次Hermite插值和分段线性插值的f(3.7403)分别为:0.066660.06952.


在线提交订单