数值分析源代码.docx
- 文档编号:6281172
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:13
- 大小:17.16KB
数值分析源代码.docx
《数值分析源代码.docx》由会员分享,可在线阅读,更多相关《数值分析源代码.docx(13页珍藏版)》请在冰豆网上搜索。
数值分析源代码
一,三次样条插值
#include
#include
voidready(double*&A,double*&B,double*h,double*y,intm,intn,doublem0=0,doublemn=0)
{A=newdouble[n];B=newdouble[n];
if(m==2){
A[0]=0;B[0]=2*m0;
A[n]=1;B[n]=2*mn;
}
else{A[0]=1;B[0]=3*(y[1]-y[0])/h[0];
A[n]=0;B[n]=3*(y[n]-y[n-1])/h[n-1];
}
for(inti=1;i {A[i]=h[i-1]/(h[i-1]+h[i]); B[i]=3*((1-A[i])*(y[i]-y[i-1])/h[i-1]+A[i]*(y[i+1]-y[i])/h[i]); } } voidcalculate1(double*&a,double*&b,double*A,double*B,intn) {a=newdouble[n];b=newdouble[n]; a[0]=-A[0]/2;b[0]=B[0]/2; for(inti=1;i<=n;i++) {a[i]=-A[i]/(2+(1-A[i])*a[i-1]); b[i]=(B[i]-(1-A[i])*b[i-1])/(2+(1-A[i])*a[i-1]); } } voidcalculate2(double*&m,double*a,double*b,intn) {m=newdouble[n+1]; m[n+1]=0; for(inti=n;i>=0;i--)m[i]=m[i+1]*a[i]+b[i]; } voidmain() {inte,t,w,v; out: cout<<"求三次样条插值函数: "< "< cin>>e; double*x,*y,*h,*A,*B,*a,*b,*m,s0,sn,u,s; cout<<"请输入x的一系列值: "< x=newdouble[e]; for(inti=0;i cout<<"请输入y的一系列值: "< y=newdouble[e]; for(intf=0;f h=newdouble[e]; for(intd=0;d loop: cout<<"边界条件选择: 1.提供了s\"(x1)=0,s\"(x2)=0;2.提供了s'(x0)=m0,s'(xn)=mn(m0,mn! =0)" < cin>>t; if(t! =1&&t! =2){cout<<"输入信息错误! 请重新输入! "< if(t==1)ready(A,B,h,y,t,e); else{cout<<"请输入s'(x0),s'(xn)的值: "< cin>>s0>>sn; ready(A,B,h,y,t,e,s0,sn);} calculate1(a,b,A,B,e); calculate2(m,a,b,e); in: cout<<"请输入所需要计算的x的值: ("< cin>>u; if(u "< for(intc=0;c {if(u>x[c]&&u s=(1+2*(u-x[w])/(x[w+1]-x[w]))*((u-x[w+1])*(u-x[w+1])/((x[w]-x[w+1])*(x[w]-x[w+1])))*y[w]+ (1+2*(u-x[w+1])/(x[w]-x[w+1]))*((u-x[w])*(u-x[w])/((x[w+1]-x[w])*(x[w+1]-x[w])))*y[w+1]+ (u-x[w])*((u-x[w+1])*(u-x[w+1])/((x[w]-x[w+1])*(x[w]-x[w+1])))*m[w]+ (u-x[w+1])*((u-x[w])*(u-x[w])/((x[w+1]-x[w])*(x[w+1]-x[w])))*m[w+1]; cout<<"f("< "< In: cout<<"请选择: 1,继续进行新的操作计算2,退出不计算"< cin>>v; if(v! =1&&v! =2){cout<<"输入错误! 请重新输入! "< if(v==1){system("cls");gotoout;} } 运行结果: 根据课本52页的数据输入,得: 第9题: f(78.3)=3.00304 第10题: f(0.35)=0.591591 二,自动选取步长梯形法 #include #include #include doublef(doublex) {return2/(1+x*x);} voidmain() {doublea,b,e,h,T0,T1,S; out: cout<<"请输入区间上下界: a和b"< cin>>a>>b; cout<<"请输入给定的精度e: "< cin>>e; h=(b-a)/2; T1=(f(a)+f(b))*h; intn=1,t,v; do {T0=T1; S=0; for(intk=1;k S=S+f(a+(2*k-1)*h/n); T1=T0/2+S*h/n; t=n; if(fabs(T1-T0)>=3*e)n=2*n; }while(t==n); cout<<"该积分的近似值为: "< In: cout<<"请选择: 1,继续进行新的操作计算2,退出不计算"< cin>>v; if(v! =1&&v! =2){cout<<"输入错误! 请重新输入! "< if(v==1){system("cls");gotoout;} } 运行结果: 根据课本97页第7题的数据输入,得结果为: 0.75 三,Romberg求积分法 #include #include #include usingnamespacestd; doublef(doublex) {returnsqrt(x);} voidmain() {doublea,b,e,T[20][20],S=0,s;intk=1,v; out: cout<<"请输入区间上下界: a和b"< cin>>a>>b; cout<<"请输入给定的精度e: "< cin>>e; T[0][0]=(b-a)*(f(a)+f(b))/2; do {for(inti=1;double(i)<=pow(2,double(k))-1;i++) {S=S+f(a+(2*i-1)*(b-a)/pow(2,double(k)));} T[0][k]=0.5*(T[0][k-1]+(b-a)*S/pow(2,double(k)-1)); for(intm=1;m<=k;m++) {T[m][k-m]=(T[m-1][k-m+1]*pow(4,double(m))-T[m-1][k-m])/(pow(4,double(m))-1);} s=k; if(fabs(T[k][0]-T[k-1][0])>=e)k=k+1; }while(s! =k); cout<<"该积分的近似值为: "< In: cout<<"请选择: 1,继续进行新的操作计算2,退出不计算"< cin>>v; if(v! =1&&v! =2){cout<<"输入错误! 请重新输入! "< if(v==1){system("cls");gotoout;} } 运行结果: 根据课本97页第8题的数据输入(输入a=1,b=9,e=0.000001),得结果为: 92.121 四,列主元高斯消去法 #include #include #include usingnamespacestd; voidmain() {intn,v; out: cout<<"请输入系数矩阵A的行列数n: "< cin>>n; doubleA[10][10],*b=newdouble[n],*x=newdouble[n],e,T;inti1; cout<<"请输入系数矩阵A的值: "< for(inti=1;i<=n;i++) { for(intj=1;j<=n;j++) cin>>A[i][j]; } cout<<"系数矩阵A为: "< for(inti=1;i<=n;i++) { for(intj=1;j<=n;j++) cout< cout< } cout<<"请输入方程组的右端项b: "< for(inti=1;i<=n;i++)cin>>b[i]; cout<<"右端项b为: "< for(inti=1;i<=n;i++)cout< cout< cout<<"请输入精度值e: "< cin>>e; for(intk=1;k {doublemax=fabs(A[k][k]); for(inti=k;i<=n;i++) { if(fabs(A[i][k])>max){max=fabs(A[i][k]);i1=i;} } T=max; if(T "< if(i1! =k) {doubletemp1; for(intk1=1;k1<=n;k1++) {doubletemp; temp=A[i1][k1]; A[i1][k1]=A[k][k1]; A[k][k1]=temp; } temp1=b[i1]; b[i1]=b[k]; b[k]=temp1; } for(inti=k+1;i<=n;i++) { T=A[i][k]/A[k][k]; b[i]=b[i]-T*b[k]; for(intj=k+1;j<=n;j++) A[i][j]=A[i][j]-T*A[k][j]; } } if(fabs(A[n][n])<=e){cout<<"求解失败! "< x[n]=b[n]/A[n][n]; for(inti=n-1;i>=1;i--) {doublesum=0; for(intj=i+1;j<=n;j++)sum+=A[i][j]*x[j]; x[i]=(b[i]-sum)/A[i][i]; } for(inti=1;i<=n;i++)cout< cout< stop: ; In: cout<<"请选择: 1,继续进行新的操作计算2,退出不计算"< cin>>v; if(v! =1&&v! =2){cout<<"输入错误! 请重新输入! "< if(v==1){system("cls");gotoout;}} 运行结果: 根据课本126页第1题的数据输入, 系数矩阵为235右端项为5精度为0.00001; 3476 1335 结果为-4 1 2 五,迭代法--Jacobi迭代与Seidel迭代 #include #include #include usingnamespacestd; voidJacobi(); voidSeidel(); voidmain() {intw,v; out: loop: cout<<"请选择所要的迭代方式: 1,Jacobi迭代2,Seidel迭代"< cin>>w; switch(w) { case1: Jacobi();break; case2: Jacobi();break; default: {cout<<"输入数据错误! 请重新输入! "< } In: cout<<"请选择: 1,继续进行新的操作计算2,退出不计算"< cin>>v; if(v! =1&&v! =2){cout<<"输入错误! 请重新输入! "< if(v==1){system("cls");gotoout;} } voidJacobi() {intn,k; cout<<"请输入系数矩阵A的行数n: "< cin>>n; doubleA[10][10],*b=newdouble[n],*x=newdouble[n],*y=newdouble[n],*g=newdouble[n],e,T;intM; cout<<"请输入系数矩阵A的值: "< for(inti=1;i<=n;i++) { for(intj=1;j<=n;j++) cin>>A[i][j]; } cout<<"系数矩阵A为:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数值 分析 源代码
![提示](https://static.bdocx.com/images/bang_tan.gif)