根据插值多项式的唯一性,两种方法的结果应该是一样的。条条道路通罗马,只是方法不同而已,牛顿法要比拉格朗日法优越简单。
Matlab函数M文件Lagrange程序function yy=lagrange(x,y,xi) m=length(x)上面是拉格朗日插值法,其中xi为要计算的数值比如 x=[0 3 5 9 31];Q
clear all;clc
x0=1:5;
y0=sin(x0);
x=1:02:2;
y0=lagrange(x0,y0,x)
命令窗口输这个就没有问题。
扩展资料:
如果这特定函数是多项式,就称它为插值多项式。利用插值基函数很容易得到拉格朗日插值多项式,公式结构紧凑,在理论分析中甚为方便,但当插值节点增减时全部插值基函数均要随之变化,整个公式也将发生变化,这在实际计算中是很不方便的,为了克服这一缺点,提出了牛顿插值。
参考资料来源:百度百科-牛顿插值法
牛顿插值余项如下:
当只知道函数在一些节点的位置却不知道函数具体的表达式时,我们可以利用代数插值方法给出函数的近似形式。常用的插值公式有拉格朗日插值、牛顿插值、埃米尔特插值及样条插值等等。牛顿(Newton)插值公式是代数插值方法的一种形式。
牛顿插值引入了差商的概念,使其在插值节点增加时便于计算。牛顿插值公式(Newton interpolation formula)是代数插值方法的一种形式。牛顿插值引入了差商的概念,使其在插值节点增加时便于计算。
公式意义:牛顿插值作为一种常用的数值拟合方法,因其计算简单,方便进行大量插值点的计算,且逻辑清楚,便于编程计算,在实验分析中具有广泛的应用。
特别是实验中经常出现只能测量得到离散数据点的情况,或者只能用数值解表示某对应关系之时,可以使用牛顿插值公式,对离散点进行拟合,得到较为准确的函数解析值。
引入思想;对于拉格朗日插值法,插值节点增减时,计算要全部重新进行,很不方便,因此我们考虑设计一种逐次生成插值多项式的方法(逐项生成也符合程序设计思想)
一定是学习数值计算方法了,而且你还偷懒。给你个现成的源码,自己好好研究吧,输入数据要用到文件。
#include<iostream>
using namespace std;
int main()
{
int n,i,j,k;FILE f;
float x[20],y[20],N,cs[20][20],x0,a=1;
f=fopen("Newtontxt","r");
fscanf(f,"%d",&n);
for(i=0;i<n;i++)
fscanf(f,"%f",&x[i]);
for(i=0;i<n;i++)
fscanf(f,"%f",&y[i]);
fclose(f);
for(i=1;i<n;i++)
for(j=i;j<n;j++)
{
if(i==1) {cs[i-1][j]=y[j];cs[i-1][j-1]=y[j-1];}
cs[i][j]=(cs[i-1][j]-cs[i-1][j-1])/(x[j]-x[j-i]);
}
cout<<"请输入插值次数:"<<endl;
cin>>k;
cout<<"请输入插值点x的值:"<<endl;
cin>>x0;
N=cs[0][0];
for(i=1;i<=k;i++)
{
a=(x0-x[i-1]);
N+=cs[i][i]a;
}
cout<<"N"<<k<<"("<<x0<<")="<<N<<endl;
system("pause");
}
f95的。
彭的书上现成的程序。包括用sgl画图部分,函数可以自己改成多项式形式的,可以参考一下:
module INTERPOLATE_UTILITY
use sgl
implicit none
type point
real x,y
end type
real, parameter :: PI=314159
real, parameter :: xmin = 00, xmax = PI30
integer, parameter :: N = 10, NP = 100
type(point), save :: datas(N)
type(point), save :: interpolate(NP)
real, save :: table(N,N), width
contains
! 产生数列
subroutine GenerateData(func)
real, external :: func
real r
integer i
width = (xmax-xmin)/(N-1)
r = 0
do i=1,N
datas(i)%x = r
datas(i)%y = func(r)
r = r+width
end do
end subroutine
! 建立difference table
subroutine BuildTable()
integer row,col,i
!real table(N,N)
table = 0
do i=1,N
table(i,1) = datas(i)%y
end do
do col=2,N
do row=1,N-col+1
table(row,col) = table(row+1, col-1) - table(row, col-1)
end do
end do
end subroutine
real function newton(x, th, num)
real x
integer th, num
real s, sum, coeff
integer f,i,j
if ( th+num-1 > N ) then
write(,) "数据点不足"
return
end if
newton = table(th,1)
s = (x-datas(th)%x)/width
f = 1
coeff = 10
do i=1,num-1
f = fi
coeff = coeff(s-i+1)
newton = newton + coefftable(th,i+1)/real(f)
end do
end function
! 绘图函数
subroutine display()
real, parameter :: size = 01
integer i
call sglClearBuffer()
call sglColor3i(255,255,255)
! 把所有插值出来的点用线段连接起来
do i=1,NP-1
call sglLineV( interpolate(i)%x, interpolate(i)%y,&
interpolate(i+1)%x, interpolate(i+1)%y)
end do
call sglColor3i(255,0,0)
! 画出n个数据点的位置
do i=1,N
call sglLineV( datas(i)%x-size, datas(i)%y-size,&
datas(i)%x+size, datas(i)%y+size)
call sglLineV( datas(i)%x+size, datas(i)%y-size,&
datas(i)%x-size, datas(i)%y+size)
end do
call sglUpdateBuffer()
end subroutine
end module
program main
use INTERPOLATE_UTILITY
implicit none
real, intrinsic :: sin
real xinc,x
integer i
call GenerateData(sin) ! 产生数据点
call BuildTable()
x=0
xinc = (xmax-xmin)/(NP-1)
do i=1,NP
interpolate(i)%x = x
interpolate(i)%y = newton(x,1,N) ! 插值出f(x)的值
x = x+xinc
end do
call sglDisplaySub(display)
call sglSetVirtual(xmin, 20, xmax, -20)
call sglCreateWindow(100,100,400,400,1)
call sglMainLoop()
stop
end program
以上就是关于在MATLAB编程实验中,用拉格朗日插值法跟牛顿插值法运行之后计算的结果为什么是一样的全部的内容,包括:在MATLAB编程实验中,用拉格朗日插值法跟牛顿插值法运行之后计算的结果为什么是一样的、牛顿插值余项、编写c++程序,用牛顿法求非线性方程组根(函数调用)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)