C++数值分析三次样条插值自动选取步长梯形法Romberg求积法列主元高斯消去法列主元LU分解法Jacobi迭.docx

上传人:b****5 文档编号:3194148 上传时间:2022-11-20 格式:DOCX 页数:25 大小:79.61KB
下载 相关 举报
C++数值分析三次样条插值自动选取步长梯形法Romberg求积法列主元高斯消去法列主元LU分解法Jacobi迭.docx_第1页
第1页 / 共25页
C++数值分析三次样条插值自动选取步长梯形法Romberg求积法列主元高斯消去法列主元LU分解法Jacobi迭.docx_第2页
第2页 / 共25页
C++数值分析三次样条插值自动选取步长梯形法Romberg求积法列主元高斯消去法列主元LU分解法Jacobi迭.docx_第3页
第3页 / 共25页
C++数值分析三次样条插值自动选取步长梯形法Romberg求积法列主元高斯消去法列主元LU分解法Jacobi迭.docx_第4页
第4页 / 共25页
C++数值分析三次样条插值自动选取步长梯形法Romberg求积法列主元高斯消去法列主元LU分解法Jacobi迭.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

C++数值分析三次样条插值自动选取步长梯形法Romberg求积法列主元高斯消去法列主元LU分解法Jacobi迭.docx

《C++数值分析三次样条插值自动选取步长梯形法Romberg求积法列主元高斯消去法列主元LU分解法Jacobi迭.docx》由会员分享,可在线阅读,更多相关《C++数值分析三次样条插值自动选取步长梯形法Romberg求积法列主元高斯消去法列主元LU分解法Jacobi迭.docx(25页珍藏版)》请在冰豆网上搜索。

C++数值分析三次样条插值自动选取步长梯形法Romberg求积法列主元高斯消去法列主元LU分解法Jacobi迭.docx

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<

break;

}

}

deletex;

deletey;deletea;deleteb;deletea1;

deleteb1;deleteh;deletem;

}

运行结果截图:

2.三次样条插值(初值条件2):

P52.10、给定函数

的函数表和边界条件

,求三次样条插值函数

,并求

的近似值。

函数表

0.25

0.3

0.39

0.45

0.53

0.5

0.5477

0.6245

0.6708

0.728

源代码:

yangtiao.cpp(同上)

运行结果截图:

3.自动选取步长梯形法:

P97

7、使用自动选取步长梯形法计算积分

的近似值。

(给定ε=0.01)

源代码:

SelfSelLength.cpp

#include

#include

doublefun(doublea)

{

return2/(1+a*a);

}

doubleSelfSelLength(doubleR_a,doubleR_b,doublee)

{

doubleh=(R_b-R_a)/2;

doubleR1=(fun(R_a)+fun(R_b))*h;

intn=1;

doubleR0;

doubleS;

doubleE;

do//每当误差值不符合要求时,计算下一个result值

{

R0=R1;

S=0;

for(intk=1;k<=n;k++)

{

S=S+fun(R_a+(2*k-1)*h/n);

}

R1=R0/2+S*h/n;

E=fabs(R1-R0);

n=2*n;

}while(E>3*e);

returnR1;

}

voidmain()

{

doublea,b,e;

cout<<"请依次输入待求积分函数的下界a、上界b及精度要求e:

"<

cin>>a>>b>>e;

cout<<"自动选取步长梯形法可求得积分:

"<

}

运行结果截图:

4.Romberg求积法:

P97

8、使用Romberg求积法计算积分

的近似值。

(给定ε=0.01,且取

源代码:

Romberg.cpp

#include

#include

staticdoubleTri[128][128];

doublefun(doublea)

{

returnsqrt(a);

}

doubleRomberg(doubleR_a,doubleR_b,doublee)

{

Tri[0][0]=(R_b-R_a)/2*(fun(R_a)+fun(R_b));

intk=0;

doubleE;

do//每当误差值不符合要求时,计算下一行的Tri[][]值

{

k++;

doubletemp=0;

//计算T[0][k]的数值

for(inti=1;i<=pow(2,k-1);i++)

{

temp=temp+fun(R_a+(2*i-1)*(R_b-R_a)/pow(2,k));

}

Tri[0][k]=0.5*(Tri[0][k-1]+(R_b-R_a)/pow(2,k-1)*temp);

for(intm=1;m<=k;m++)

{

Tri[m][k-m]=(pow(4,m)*Tri[m-1][k-m+1]-Tri[m-1][k-m])/(pow(4,m)-1);

}

E=fabs(Tri[k][0]-Tri[k-1][0]);

}while(E>e);

returnTri[k][0];

}

voidmain()

{

doublea,b,e;

cout<<"请依次输入待求积分函数的下界a、上界b及精度要求e:

"<

cin>>a>>b>>e;

cout<<"按Romberg求积法可求得积分:

"<

}

运行结果截图:

5.列主元高斯消去法:

测试矩阵为:

=

源代码:

Guess_Elimination.cpp

//列主元高斯消去法

#include

#include

#defineN4//矩阵的维数,可按需更改

staticdoubleA[N][N]={2,-1,0,0,-1,2,-1,0,0,-1,2,-1,0,0,-1,2};//系数矩阵

staticdoubleB[N]={1,0,1,0};//右端项

staticdoubleX[N];

inti,j,k;//计数器

voidmain()

{

for(k=0;k

{

//选取最大主元

intindex=k;

for(i=k;i

{

if(fabs(A[index][k])

{

index=i;

}

}

//交换行

doubletemp;

for(i=k;i

{

temp=A[index][i];

A[index][i]=A[k][i];

A[k][i]=temp;

}

temp=B[index];

B[index]=B[k];

B[k]=temp;

for(i=k+1;i

{

doubleT=A[i][k]/A[k][k];

B[i]=B[i]-T*B[k];

for(j=k+1;j

{

A[i][j]=A[i][j]-T*A[k][j];

}

}

}

X[N-1]=B[N-1]/A[N-1][N-1];

for(i=N-2;i>=0;i--)

{

doubleTemp=0;

for(intj=i+1;j

Temp=T

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 唐诗宋词

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1