做了一个测试,希望有所帮助。代码:% 用matlab编写拉格朗日插值算法的程序,并以下面给出的函数表为数据基础,
井陉矿网站制作公司哪家好,找创新互联建站!从网页设计、网站建设、微信开发、APP开发、成都响应式网站建设公司等网站项目制作,到程序开发,运营维护。创新互联建站于2013年创立到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联建站。
% 在整个插值区间上采用拉格朗日插值法计算f(0.6),写出程序源代码,输出计算结果
% x -2.15 -1.00 0.01 1.02 2.03 3.25
% y 17.03 7.24 1.05 2.03 17.06 23.05
function main()
clc;
x = [-2.15 -1.00 0.01 1.02 2.03 3.25];
y = [17.03 7.24 1.05 2.03 17.06 23.05 ];
x0 = 0.6;
f = Language(x,y,x0)function f = Language(x,y,x0)
%求已知数据点的拉格朗日插值多项式
%已知数据点的x坐标向量: x
%已知数据点的y坐标向量: y
%插值点的x坐标: x0
%求得的拉格朗日插值多项式或在x0处的插值: fsyms t l;
if(length(x) == length(y))
n = length(x);
else
disp('x和y的维数不相等!');
return; %检错
endh=sym(0);
for (i=1:n)
l=sym(y(i));
for(j=1:i-1)
l=l*(t-x(j))/(x(i)-x(j));
end;
for(j=i+1:n)
l=l*(t-x(j))/(x(i)-x(j));
end;
h=h+l;
end
simplify(h);if(nargin == 3)
f = subs (h,'t',x0); %计算插值点的函数值
else
f=collect(h);
f = vpa(f,6); %将插值多项式的系数化成6位精度的小数
end结果:
f = 0.0201
全区间拉格朗日插值
功用
本程序用拉格朗日插值公式对一元不等距观测数据进行程组插值 。
方法概要
对给定的n个插值节点x1,x2,…,xn及对应的函数值y1,y2,…,yn,计算给定点x的函数值y(x)。
本程序可以在插值区间内对给定的NJ个插值点进行插值。
程序说明
(1)、程序名
LGRCZ1.FOR (此文件为免费软件,你可以从本站点 下载。)
(2)、子程序语句
SUBROUTINE LGRCZ1(Z,N,CZ,NJ)
(3)、形参说明
Z 输入参数,两维实数组,容量为N×2,存放给定的插值节点数列及对应的观测值。
N输入参数,整变量,插值节点数。
NJ 输入参数,整变量,插值节点数。
CZ 输入输出参数,二维实数组,容量NJ×2,第一列输入插值点数列,第二列输出插值
结果。
计算实例
(1)、例题
设已知下表观测数据
x
1
2
3
4
5
6
7
Y1
1
4
9
16
25
36
49
要在给出2,2.5,3,3.5,4,4.5,5,5.5,6,6.5上进行插值。这里N=7,NJ=10。
(2)、主程序设计
N、NJ用参数说明语句定义,观测数据及插值点数用DATA语句输入,屏幕显示插值结果。
(3)、计算结果
程序清单
代码问题,改一句就好了:
#includeiostream
#define N 3 //插值节点数目
using namespace std;
void main()
{
float x[N]; //差值节点横坐标
float y[N]; //差值节点纵坐标
float a; //所求点横坐标
float fx=0,tmp=1;
int i,j;
cout"输入插值点的坐标:"endl;
for(i=0;iN;i++)
{
cinx[i];
ciny[i];
}
cout"输入所求点的横坐标:"endl;
cina;
for(i=0;iN;i++)
{
tmp = 1;//加上这句,开始前还原tmp
{
for(j=0;jN;j++)
if(i!=j)
tmp=tmp*(a-x[j])/(x[i]-x[j]);
}
fx=fx+tmp*y[i];
}
cout"所求值为:"endl;
coutfxendl;
}