
#include <iostream>
#include <iomanip>
#include <stdlib.h>
using namespace std
#define N 100
void lagrange()
{
int n,k,m,q=1
float x[N],y[N],xx,yyy1,yyy2,yy1,yy2,yy3
cout<<"请输入X的个数:"
cin>>n
for(k=0k<=n-1k++)
{
cout<<"请输入X"<<k<<"的值:"
cin>>x[k]
cout<<"请输入Y"<<k<<"的值:"
cin>>y[k]
}
system("cls")
cout<<"则Xi与Yi表格如下:"<<endl
cout<<"Xi"<<" "for(k=0k<=n-1k++)cout<<setiosflags(ios::left)<<setw(10)<<x[k]
cout<<endl
cout<<"Yi"<<" "for(k=0k<=n-1k++)cout<<setiosflags(ios::left)<<setw(10)<<y[k]
cout<<endl
while(q)
{
cout<<"请输入所求x的值:"
cin>>xx
while(xx>x[k-1]||xx<x[0])
{
cout<<"输亩唯陪迅蠢入错误,请重新输入:"
cin>>xx
}
for(k=0k<=n-1k++)
{
if(xx<x[k])
{
m=k-1
k=n-1
}
}
yyy1=y[m]*((xx-x[m+1])/(x[m]-x[m+1]))+y[m+1]*((xx-x[m])/(x[m+1]-x[m]))
cout<<"则拉格朗日分段线性插值为:"<<yyy1<<endl
for(k=0k<=n-1k++)
{
if(xx<x[k])
{
m=k-1
k=n-1
}
}
if((xx-x[m])>(x[m+1]-xx))m=m+1
else m=m
yy1=y[m-1]*((xx-x[m])*(xx-x[m+1]))/((x[m-1]-x[m])*(x[m-1]-x[m+1]))
yy2=y[m]*((xx-x[m-1])*(xx-x[m+1]))/((x[m]-x[m-1])*(x[m]-x[m+1]))
yy3=y[m+1]*((xx-x[m-1])*(xx-x[m]))/((x[m+1]-x[m-1])*(x[m+1]-x[m]))
yyy2=yy1+yy2+yy3
cout<<"则拉格朗日分段二次插值为:"<<yyy2<<endl
cout<<"是否输入其余要求x的值[是(1),否(0)]:"
cin>>q
}
system("cls")
}
void main()
{
lagrange()
}
三次样条插值函数边界条件由实际问题对三次样条插值在端点的派槐世状态要求给出。以第1边界条件为例,用节点处二阶导数表示三次样条插值函数,用追赶法求解相关方程组。通过Matlab编制三次样条函数的通尘肢用程序,可直接显示各区间段三次样条函数体表达式,计算出已给点插值并显示各区间分段曲线图0引言分段低次样条插值虽然计算简单、稳定性好、收敛性有保证且易在电子计算机上实现,但只能保证各小段曲线在连接处的连续性,不能保证整件曲线的光滑性。利用样条插值,既可保持分段低次插值多项式,又可提高插值函数光滑性。故给出分段三次样条插值的构造过明银程、算法步骤,利用
function yh=lagrange (x,y,xh)n = length(x)
m = length(xh)
yh = zeros(1,m)
c1 = ones(n-1,1)
c2 = ones(1,m)
for i=1:n
xp = x([1:i-1 i+1:n])
yh = yh + y(i)*prod((c1*xh-xp'*c2)./(x(i)-xp'*c2))
end
注:该程序只可一次计算实现一个插值计算。可实现多个插值计算的镇知程序滚碰如下:御备消
function yh=lagrange(x,y,xh)
n = length(x)
m = length(xh)
x = x(:)
y = y(:)
xh = xh(:)
yh = zeros(m,1)
c1 = ones(1,n-1)
c2 = ones(m,1)
for i=1:n,
xp = x([1:i-1 i+1:n])
yh = yh + y(i) * prod((xh*c1-c2*xp')./(c2*(x(i)*c1-xp')),2)
end
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)