C++数值分析三次样条插值自动选取步长梯形法Romberg求积法列主元高斯消去法列主元LU分解法Jacobi迭.docx
《C++数值分析三次样条插值自动选取步长梯形法Romberg求积法列主元高斯消去法列主元LU分解法Jacobi迭.docx》由会员分享,可在线阅读,更多相关《C++数值分析三次样条插值自动选取步长梯形法Romberg求积法列主元高斯消去法列主元LU分解法Jacobi迭.docx(25页珍藏版)》请在冰豆网上搜索。
C++数值分析三次样条插值自动选取步长梯形法Romberg求积法列主元高斯消去法列主元LU分解法Jacobi迭
数值分析上机实验报告之样条插值
1.三次样条插值(初值条件1):
P52.9、给定函数
的函数表和边界条件
,求三次样条插值函数
,并求
的近似值。
函数表
75
76
77
78
79
80
2.768
2.833
2.903
2.979
3.062
3.153
源代码:
yangtiao.cpp
#include
#include
voidmain()
{
intchoice=0;
intn=2;
doublexx,*x,*y,*a,*b,*a1,*b1,*h,*m;
cout<<"请输入插值节点个数n:
"<cin>>n;
x=newdouble[n];y=newdouble[n];
a=newdouble[n];b=newdouble[n];
a1=newdouble[n];b1=newdouble[n];
h=newdouble[n-1];m=newdouble[n+1];
cout<<"请输入"<"<for(inti=0;i{
cin>>x[i]>>y[i];
}
for(intj=0;j{
h[j]=x[j+1]-x[j];
}
cout<<"请输入待估点xx:
"<cin>>xx;
cout<<"请选择边界条件:
"<cin>>choice;
switch(choice)
{
case1:
{
doubletemp1,temp2;
a[0]=0;
a[n-1]=1;
cout<<"请输入边界条件的两个一阶微商值s'(x1)与s'(xn):
"<cin>>temp1>>temp2;
b[0]=2*temp1;
b[n-1]=2*temp2;
break;
}
case2:
{
a[0]=1;
a[n-1]=0;
b[0]=3/h[0]*(y[1]-y[0]);
b[n-1]=3/h[n-2]*(y[n-1]-y[n-2]);
break;
}
}
for(intk=1;k{
a[k]=h[k-1]/(h[k-1]+h[k]);
b[k]=3*((1-a[k])/h[k-1]*(y[k]-y[k-1])+a[k]/h[k]*(y[k+1]-y[k]));
}
a1[0]=-a[0]/2;
b1[0]=b[0]/2;
for(intl=1;l{
a1[l]=-a[l]/(2+(1-a[l])*a1[l-1]);
b1[l]=(b[l]-(1-a[l])*b1[l-1])/(2+(1-a[l])*a1[l-1]);
}
m[n]=0;
for(j=n-1;j>=0;j--)
{
m[j]=a1[j]*m[j+1]+b1[j];
}
//判别xx所在区间并输出结果
cout<<"\n插值结果为:
";
for(k=0;k{
if(x[k]<=xx&&x[k+1]>xx)
{
doubleoutput=0;
output=(1+2*(xx-x[k])/(x[k+1]-x[k]))*pow(((xx-x[k+1])/(x[k]-x[k+1])),2)*y[k]
+(1+2*(xx-x[k+1])/(x[k]-x[k+1]))*pow(((xx-x[k])/(x[k+1]-x[k])),2)*y[k+1]
+(xx-x[k])*pow(((xx-x[k+1])/(x[k]-x[k+1])),2)*m[k]
+(xx-x[k+1])*pow(((xx-x[k])/(x[k+1]-x[k])),2)*m[k+1];
cout<