数值课程设计
更新时间:2024-01-01 04:00:01 阅读量: 教育文库 文档下载
数值计算课程设计
1 经典四阶龙格库塔法解一阶微分方程组
1.1 四阶龙格—库塔算法简述
龙格—库塔方法适用于一般的应用,因为它非常精确、稳定,且易于编程。 龙格—库塔算法的数学描述如下: 用公式
xk?1?xk?h(f1?2f2?2f3?f4)/6 yk?1?yk?h(g1?2g2?2g3?g4)/6
计算[a,b]上初值问题y'?f(t,y),y(a)?y0的近似解。
f1?f(tk,xk,yk), g1?g(tk,xk,yk)
hhhhhh,xk?f1,yk?g1) g2?g(tk?,xk?f1,yk?g1) 222222hhhhhhf3?f(tk?,xk?f2,yk?g2) g3?g(tk?,xk?f2,yk?g2)
222222f2?f(tk?f4?f(tk?h,xk?hf3,yk?hg3) g4?g(tk?h,xk?hf3,yk?hg3) 1.2 经典四阶龙格库塔法解一阶微分方程算法流程图
图1-1 四阶龙格库塔算法流程图
1
四阶龙格—库塔算法
1.3 四阶龙格—库塔算法程序 #include
double fun(double,double,double); double myfun(double,double,double); double f[4],g[4];
double h,a,b;
double x[N+1],y[N+1],t[N+1]; cout<<\输入区间左右端点a,b:\ cin>>a>>b;
cout< h=(b-a)/N; //h为步长 x[0]=6; y[0]=4; t[0]=a; for (int k=0;k f[1]=fun(t[k]+h/2,x[k]+h/2*f[0],y[k]+h/2*g[0]); g[1]=myfun(t[k]+h/2,x[k]+h/2*f[0],y[k]+h/2*g[0]); f[2]=fun(t[k]+h/2,x[k]+h/2*f[1],y[k]+h/2*g[1]); g[2]=myfun(t[k]+h/2,x[k]+h/2*f[1],y[k]+h/2*g[1]); f[3]=fun(t[k]+h,x[k]+h*f[2],y[k]+h*g[2]); g[3]=myfun(t[k]+h,x[k]+h*f[2],y[k]+h*g[2]); x[k+1]=x[k]+h*(f[0]+2*f[1]+2*f[2]+f[3])/6; y[k+1]=y[k]+h*(g[0]+2*g[1]+2*g[2]+g[3])/6; t[k+1]=t[k]+h; } cout< 2 \ 数值计算课程设计 return 0; } double fun(double t,double x,double y) {double f; f=x+2*y; return f; } double myfun(double t,double x,double y) {double f; f=3*x+2*y; return f; } 1.4 四阶龙格—库塔算法求解例题 在区间[0.0,0.2]上初值x的条件下,求解微分方程组。 6,y40?0?dx?x?2ydtdy?3x?2y dt1.5 四阶龙格—库塔运行结果 输入区间左右端点a,b: 0.0 0.2 t x y 0 12.8604 0.22 0.02 6.29355 4.53932 0.04 6.61562 5.11949 0.06 6.96853 5.74397 0.08 7.35474 6.41653 0.1 7.77697 7.14127 0.12 8.23814 7.9226 0.14 8.74141 8.76532 0.16 9.29021 9.6746 0.18 9.88827 10.6561 0.2 10.5396 11.7158 y?11.7158。 求得数值解为:x?10.5396 3 高斯列主元法解线性方程组 2 高斯列主元法解线性方程组 2.1 高斯列主元法解线性方程组算法说明 首先将线性方程组做成增广矩阵,对增广矩阵进行行变换。对于元素ai,j,在第i列中,第i行以及以下的元素中选取绝对值最大的元素,将最大元素所在的行与i行交换,然后采取高斯消元法用新得到的ai,j所在的第i行消去第i行以下的元素。依次类推,直到an,n,从而得到上三角矩阵。再进行回代过程。 2.2 高斯列主元法解线性方程组流程图 图2-1 高斯列主元法解线性方程组流程图 4 数值计算课程设计 2.3 高斯列主元法解线性方程组程序代码 #include int i,j,k,p,m; double A[n][n+1],x[n]; double q,L,temp,max1; cout<<\请输入增广矩阵:\for(i=0;i for (k=0;k max1=A[k][k]; for (p=k;p for(i=0;i temp=A[k][i]; A[k][i]=A[m][i]; A[m][i]=temp; 5 for(j=0;j cin>>A[i][j]; if (fabs(A[p][k])>fabs(max1)) { } max1=A[p][k]; m=p; 高斯列主元法解线性方程组 } for(i=k+1;i L=A[i][k]/A[k][k]; for(j=k;j { A[i][j]=A[i][j]-L*A[k][j]; } } cout<<\输出进行上三角迭代过程中的增广矩阵: for(i=0;i cout< } } cout<<\输出上三角矩阵:\for(i=0;i } x[n-1]=A[n-1][n]/A[n-1][n-1];//回代过程 for(k=n-2;k>=0;k--) { q=0; for(j=n-1;j>k;j--) { q=q+A[k][j]*x[j]; } 6 \ 数值计算课程设计 } x[k]=(A[k][n]-q)/A[k][k]; cout<<\方程组的解为:\for(i=0;i { cout< } } return 0; 2.4 高斯列主元法解线性方程组求解例题 求解下列线性方程组 x1?2x2?72x1?3x2?x3?94x2?2x3?4x4?102x3?4x4?122.5 高斯列主元法解线性方程组算法运行结果 请输入增广矩阵: 1 2 0 0 7 2 3 -1 0 9 0 4 2 3 10 0 0 2 -4 12 输出进行上三角迭代过程中的增广矩阵: 2 3 -1 0 9 0 0.5 0.5 0 2.5 0 4 2 3 10 0 0 2 -4 12 输出进行上三角迭代过程中的增广矩阵: 2 3 -1 0 9 0 4 2 3 10 0 0 0.25 -0.375 1.25 0 0 2 -4 12 输出进行上三角迭代过程中的增广矩阵: 7 高斯列主元法解线性方程组 2 3 -1 0 9 0 4 2 3 10 0 0 2 -4 12 0 0 0 0.125 -0.25 输出上三角矩阵: 2 3 -1 0 9 0 4 2 3 10 0 0 2 -4 12 0 0 0 0.125 -0.25 方程组的解为: 1 3 2 -2 Press any key to continue 求得的解为:x?[1 2 3 ?2] 8 数值计算课程设计 3 牛顿法解非线性方程组 3.1 牛顿法解非线性方程组算法说明 设Pk已知。 第一步:计算函数 第二步:计算雅克比矩阵 ?f1(pk,qk)?F(Pk)??? f(p,q)?2kk?????f(p,q) f(p,q)1kk1kk??x??y? J(Pk)??????f(p,q) f(p,q)??x2kk?y2kk???第三步:求线性方程组 J(KK)?P??F(PK) 的解?P。 第四步:计算下一点 Pk?1?Pk??P 重复上述过程。 3.2 牛顿法解非线性方程组算法流程图 图3-1 牛顿法解非线性方程组算法流程图 9 牛顿法解非线性方程组 3.3 牛顿法解非线性方程组程序代码 #include #define N 2 //用来设置方程组的行数 #define eps 2.2204e-16 double* MatrixMultiply(double* J,double Y[ ]); double* Inv(double *J); double norm(double Q[ ]); double* F(double X[ ]); double* JF(double X[ ]); int method(double* Y,double epsilon); int newdim(double P[],double delta,double epsilon,int max1,double *err) { double *Y=NULL,*J=NULL,Q[2]={0},*Z=NULL,*temp=NULL; double relerr=0.0; int k=0,i=0,iter=0; Y=F(P); for(k=1;k J=JF(P); temp=MatrixMultiply(Inv(J),Y); for(i=0;i Q[i]=P[i]-temp[i]; Z=F(Q); for(i=0;i temp[i]=Q[i]-P[i]; *err=norm(temp); relerr=*err/(norm(Q)+eps); for(i=0;i P[i]=Q[i]; Y[i]=Z[i]; for(i=0;i 10 数值计算课程设计 } } if((*err break; return iter; int method(double* Y,double epsilon) { } //矩阵乘法,要求,J为方阵,Y为与J维数相同的列向量 double *MatrixMultiply(double* J,double Y[]) { } //二阶矩阵的求逆(在M次多项式曲线拟合算法文件中给出了对任意可逆矩阵的求逆算法) double *Inv(double *J) { double X[4]={0},temp=0.0; int i=0; X[0]=J[3]; X[1]=-J[1]; double *X=NULL; int i=0,j=0; X=(double*)malloc(N*sizeof(double)); for(i=0;i X[i]=0; for(j=0;j X[i]+=J[i*N+j]*Y[j]; for(i=0;i if(fabs(Y[0]) return 1; return 0; else return X; temp=1/(J[0]*J[3]-J[1]*J[2]); 11 牛顿法解非线性方程组 } X[2]=-J[2]; X[3]=J[0]; for(i=0;i<4;i++) J[i]=temp*X[i]; return J; double norm(double Q[]) { } double* F(double X[]) { } double* JF(double X[]) { double x=X[0]; double y=X[1]; double *W=NULL; W=(double*)malloc(4*sizeof(double)); W[0]=2*x-2; double x=X[0]; double y=X[1]; double *Z=NULL; Z=(double*)malloc(2*sizeof(double)); Z[0]=x*x-2*x-y+0.5; Z[1]=x*x+4*y*y-4; return Z; double max=0.0; int i=0; { } return max; if(Q[i]>max) max=Q[i]; for(i=0;i 12 数值计算课程设计 } W[1]=-1; W[2]=2*x; W[3]=8*y; return W; main() { } 3.4 牛顿法解非线性方程组求解例题 求解非线性方程组 2??x?2x?y?0.5?0 ?22??x?4y?4?0double P[2]={0}; double delta=0.0,epsilon=0.0,err=0.0; int max1=0,iter=0,i=0; printf(\牛顿法解非线性方程组:\\nx^2-2*x-y+0.5=0\\nx^2+4*y^2-4=0\\n\printf(\输入的初始近似值x0,y0\\n\for(i=0;i<2;i++) scanf(\ printf(\请依次输入P的误差限,F(P)的误差限,最大迭代次数\\n\scanf(\iter=newdim(P,delta,epsilon,max1,&err); printf(\收敛到P的解为:\\n\for(i=0;i<2;i++) printf(\printf(\迭代次数为:%d\printf(\误差为:%lf\\n\getchar(); 3.5 牛顿法解非线性方程组算法运行结果 牛顿法解非线性方程组: x^2-2*x-y+0.5=0 x^2+4*y^2-4=0 13 牛顿法解非线性方程组 输入的初始近似值x0,y0 2.00 0.25 请依次输入P的误差限,F(P)的误差限,最大迭代次数 0.0001 0.0001 1000 收敛到P的解为: X(1)=1.900691 X(2)=0.311213 迭代次数为:2 误差为:0.000000 20?x?2x?y?0.5非线性方程组在初始值(的条件下求解结p,q)?(2.00,0.25)00220?x?4y?4果为x=1.900691,y=0.311213 14 数值计算课程设计 4 龙贝格求积分算法 4.1 龙贝格积分算法说明 生成J?K的逼近表R(J,K),并以R(J?1,J?1)为最终解来逼近积分 逼近R(J,K)存在一个特别的三角矩阵中,第0列元素R(J,0)用基于2J个?a,b?子区间的连续梯形方法计算,然后利用龙贝格公式计算R(J,K)。当1?K?J时,第J行的元素为 R(J,K?1)?R(J?1,K?1) 4K?1当R(J,J)?R(J?1,J?1)?tol时,程序在第?J?1?行结束。 R(J,K)?R(J,K?1)??baf(x)dx?R(J,J) 4.2 龙贝格求积分算法的算法流程图 图4-1 龙贝格求积分的算法流程图 4.3 龙贝格积分算法程序代码 15 龙贝格积分算法 #include double feval(double);//函数声明 double a=0,b=3,h,x,s,err=1; double R[n][n]={0}; int M=1,J=0; h=b-a; R[0][0]=h*(feval(a)+feval(b))/2; while ((err>0.01)&&(J cout<<\该矩阵为:\for (int i=0;i J=J+1; h=h/2; s=0; for (int p=1;p for (int K=1;K<=J;K++) { } err=fabs(R[J-1][J-1]-R[J][K]); R[J][K]=(pow(4.0,K)*R[J][K-1]-R[J-1][K-1])/(pow(4.0,K)-1); x=a+h*(2*p-1); s=s+feval(x); R[J][0]=R[J-1][0]/2+h*s; 16 数值计算课程设计 } for (int j=0;j<=i;j++) cout< cout<<\则积分为=\ cout< double feval(double x) //定义函数 { double f; f=sin(2*x)/(1+x*x); return f; } 4.4 龙贝格积分求解例题 求?3sin(2x)91?x2的值。 4.5 龙贝格积分算法运行结果 该矩阵为: -0.041912325 0.044176149 0.072872307 0.37995411 0.49188009 0.51981395 0.45457605 0.47945003 0.47862136 0.47796751 0.47086479 0.47629437 0.47608399 0.47604371 0.47603617 0.4748323 0.47615481 0.4761455 0.47614648 0.47614688 0.47581819 0.47614682 0.47614629 0.4761463 0.4761463 0.4760643 0.47614633 0.4761463 0.4761463 0.4761463 则积分为= 0.4761463 Press any key to continue 17 0.47614699 0.4761463 0.4761463 0.4761463 0.4761463 0.4761463 三次样条插值算法 5 三次样条插值算法(压紧样条) 5.1 三次样条插值算法(压紧样条)说明 表5-1 三次样条插值算法(压紧样条)说明 策略描述 (i)三次紧压样条,确定S?(x0),S?(xn)(如果导数已知,这是“最佳选择”) 包含m0和mN的方程 m0?m3(d0?S?(x0))?1 h023hN?1(S?(xN)?dN?1)?mN?1 2mN?(ii)natural三次样条(一条“松弛曲线”) (iii)外挂S??(x)到端点 m0?0,mN?0 m0?m1?h0(m2?m1) h1mN?mN?1?S??(x)是靠近端点的常量 hN?1(mN?1?mN?2) hN?2 (iv) m0?m1,mN?mN?1(v)在每个端点处指定S??(x) m0?S??(x0),mN?S??(xN) 5.2 三次样条插值算法(压紧样条)的算法流程图 开始 计算S[k][0]S[i][1],S[i][2],S[i][3] 输出S[i][0],S[i][1],S[i][2],S[i][3] 结束 图5-1 三次样条插值算法(压紧样条)的算法流程 18 数值计算课程设计 5.3 三次样条插值算法(压紧样条)程序代码 #include double *diff(double X[],int n) { } double *divide(double Y[],int N,double H[]) { } main() { double X[MAX]={0,1,2,3},Y[MAX]={0,0.5,2.0,1.5},S[MAX][MAX]={0},temp=0.0,M[MAX]={0}; int i=0; double *H=NULL; H=(double*)malloc((n-1)*sizeof(double)); for(i=1;i<=n-1;i++) { } return H; H[i-1]=X[i]-X[i-1]; int i=0; double *D=NULL; D=(double*)malloc(N*sizeof(double)); for(i=0;i D[i]=Y[i]/H[i]; int N=MAX-1,i=0,k=0; double A[MAX-1-2]={0},B[MAX-1-1]={0},C[MAX-1-1]={0}; double dx0=0.2,dxn=1.0; 19 三次样条插值算法 double *H=NULL,*D=NULL,*U=NULL; printf(\求解经过点(0,0.0),(1,0.5),(2,2.0)和(3,1.5)\\n而且一阶导数边界条件 S'(0)=0.2和S'(3)=-1的三次压紧样条曲线\\n\\n\H=diff(X,MAX); D=divide(diff(Y,MAX),N,H); for(i=1;i A[i]=H[i+1]; B[i]=2*(H[i]+H[i+1]); C[i]=H[i+1]; for(i=0;i U[i]=U[i]*6; B[0]=B[0]-H[0]/2; U[0]=U[0]-3*(D[0]-dx0); B[N-2]=B[N-2]-H[N-1]/2; U[N-2]=U[N-2]-3*(dxn-D[N-1]); for(k=2;k<=N-1;k++) { temp=A[k-2]/B[k-2]; B[k-1]=B[k-1]-temp*C[k-2]; U[k-1]=U[k-1]-temp*U[k-2]; } M[N-1]=U[N-2]/B[N-2]; for(k=N-2;k>=1;k--) M[k]=(U[k-1]-C[k-1]*M[k+1])/B[k-1]; M[0]=3*(D[0]-dx0)/H[0]-M[0]/2; M[N]=3*(dxn-D[N-1])/H[N-1]-M[N-1]/2; { S[k][0]=(M[k+1]-M[k])/(6*H[k]); S[k][1]=M[k]/2; S[k][2]=D[k]-H[k]*(2*M[k]+M[k+1])/6; for(k=0;k<=N-1;k++) 20 数值计算课程设计 } } S[k][3]=Y[k]; cout<<\输出s[N][4]:\ for(i=0;i cout< for(k=0;k<4;k++) cout< 5.4 三次样条插值算法(压紧样条)求解例题 求三次紧压样条曲线,我们以经过点(0,0),(1,0.5),(2,2.0)和(3,1.5), ‘‘且一阶导数的边界条件为S(0)?0.2和S(3)?-1的拟合函数 5.5 三次样条插值算法(压紧样条)程序运行结果 输出s[N][4]: 0.48 -0.18 0.2 0 -1.04 1.26 1.28 0.5 0.68 -1.86 0.68 2 5.6 运用Matlab绘制三次压紧样条的函数图像 我们借助Matlab绘制出以上三次压紧样条的函数图像 图5-2 三次压紧样条的函数图像 21 M次多项式曲线拟合 6 M次多项式曲线拟合 6.1 M次多项式曲线拟合算法说明 设?有N个点,横坐标是确定的。最小二乘抛物线的系数表示为 (x?k,yk)k?12y?fx()?Ax?BxC? N求解A,B和C的线性方程组为 N?N4??N3??N2?2??xk?A???xk?B???xk?C??ykxkk?1?k?1??k?1??k?1? N?N3??N2??N???xk?A???xk?B???xk?C??ykxkk?1?k?1??k?1??k?1?N?N2??N?C??yk??xk?A???xk?B?Nk?1?k?1??k?1? 6.2 M次多项式曲线拟合算法流程图 图6-1 算法流程图 6.3 M次多项式曲线拟合算法程序 #include 22 数值计算课程设计 #include int i,j,k,p,m; double X[1][n],Y[1][n],F[n][M+1]; double A[M+1][M+1]={0},B[M+1][1]={0},C[M+1][1]; double E[M+1][M+1],D[M+1][2*M+2],AN[M+1][M+1]; //E[M+1][M+1]为单位矩阵,D[M+1][2*M+2]矩阵形式为(A,E),AN[M+1][M+1]为A[M+1][M+1]的逆矩阵。 double XZ[n][1],YZ[n][1],FZ[M+1][n]; // XZ[n][1]为X[1][n]矩阵的转置,YZ[n][1]为Y[n][1]矩阵的转置,FZ[M+1][n]为F[n][M+1]矩阵的转置. double temp,L,max1; cout<<\输入矩阵X[1][n]:\for (i=0;i cin>>X[0][i]; cout<<\输入矩阵Y[1][n]:\for (i=0;i cin>>Y[0][i]; cout<<\输出矩阵XZ[1][n]:\求矩阵XZ[1][n] for (i=0;i cout<<\输出矩阵YZ[1][n]:\求矩阵YZ[1][n] for (i=0;i YZ[i][0]=Y[0][i]; XZ[i][0]=X[0][i]; cout< 23 M次多项式曲线拟合 } cout< cout<<\输出矩阵F[n][M+1]:\计算矩阵F[n][M+1] for(k=0;k for(i=0;i cout<<\输出矩阵FZ[M+1][n]:\计算矩阵FZ[M+1][n] for(i=0;i FZ[k][i]=F[i][k]; } for(k=0;k for (i=0;i for (j=0;j cout< F[i][k]=pow(XZ[i][0],k); for(k=0;k cout< for(k=0;k for(i=0;i cout< cout<<\输出矩阵A[M+1][M+1]=\计算A[M+1][M+1] 24 数值计算课程设计 { } } for (k=0;k A[i][j]=A[i][j]+FZ[i][k]*F[k][j]; for (i=0;i for (j=0;j cout< for (i=0;i for (i=0;i cout< B[i][0]=B[i][0]+FZ[i][j]*YZ[j][0]; cout<<\输出矩阵B[M+1][1]=\计算B[M+1][1] cout< cout<<\输出矩阵E[M+1][M+1]=\构造单位矩阵 for (i=0;i for (i=0;i for (j=0;j if (i==j) E[i][j]=1; E[i][j]=0; else 25 M次多项式曲线拟合 { for (j=0;j cout< } cout<<\输出矩阵D[M+1][2*M+2]=\构造形式为(A,E)的矩阵for (i=0;i { for (j=0;j<2*M+2;j++) cout< for (k=0;k max1=D[k][k]; for (p=k;p for (i=0;i<2*M+2;i++)//交换行 { temp=D[k][i]; D[k][i]=D[m][i]; if (fabs(D[p][k])>fabs(max1)) { } max1=D[p][k]; m=p; for (j=0;j D[M+1][2*M+2] for (i=0;i for (j=M+1;j<2*M+2;j++) D[i][j]=E[i][j-M-1]; for (i=0;i 26 数值计算课程设计 D[m][i]=temp; { } for(i=k-1;i>=0;i--) { L=D[i][k]/D[k][k]; for(j=2*M+1;j>=0;j--) D[i][j]=D[i][j]-L*D[k][j]; } { for (i=k+1;i L=D[i][k]/D[k][k]; } for(k=M;k>0;k--) D[i][j]=D[i][j]-L*D[k][j]; for (j=k;j<2*M+2;j++) } } for (i=M;i>=0;i--) //将矩阵D[M+1][2*M+2]中的A[M+1][M+1]变为单位矩阵 { for (j=2*M+1;j>=0;j--) D[i][j]=D[i][j]/D[i][i]; } cout<<\输出最终的D[M+1][2*M+2]:\ cout<<\输出矩阵AN[M+1][M+1]=\计算矩阵AN[M+1][M+1] for (i=0;i { for (j=0;j AN[i][j]=D[i][j+M+1]; } for (i=0;i for (j=0;j 27 M次多项式曲线拟合 } cout< cout<<\输出矩阵C[M+1][1](矩阵C[M+1][1]=A/B,即C=AN*B)=\ for (i=0;i 6.4 M次多项式曲线拟合算法求解例题 通过点(0.25,23.1),(1.0,1.68),(1.5,1.0),(2.0,0.84),(2.4,0.826),(5.0,1.2576)拟合一个四次多项式。 6.5 M次多项式曲线拟合算法运行结果 输入矩阵X[1][n]: 0.25 1.0 1.5 2.0 2.4 5.0 输入矩阵Y[1][n]: 23.1 1.68 1.0 0.84 0.826 1.2576 输出矩阵XZ[1][n]: 28 { } cout<<\输出矩阵(对矩阵C[M+1][1])进行翻转C[M+1][1]=\{ } for (i=0;i cout< temp=C[M-i][0]; C[i][0]=temp; C[i][0]=0; for (j=0;j C[i][0]=C[i][0]+AN[i][j]*B[j][0]; cout< for (i=0;i<(M+1)/2;i++) C[M-i][0]=C[i][0]; 数值计算课程设计 0.25 1 1.5 2 2.4 5 输出矩阵YZ[1][n]: 23.1 1.68 1 0.84 0.826 1.2576 输出矩阵F[n][M+1]: 1 0.25 0.0625 0.015625 0.00390625 1 1 1 1 1 1 1.5 2.25 3.375 5.0625 1 2 4 8 16 1 2.4 5.76 13.824 33.1776 1 5 25 125 625 输出矩阵FZ[M+1][n]: 1 1 1 1 1 1 0.25 1 1.5 2 2.4 5 0.0625 1 2.25 4 5.76 25 0.015625 1 3.375 8 13.824 125 0.00390625 1 5.0625 16 33.1776 625 输出矩阵A[M+1][M+1]= 6 12.15 38.0725 151.215 680.244 12.15 38.0725 151.215 680.244 3245.22 38.0725 151.215 680.244 3245.22 15892.5 151.215 680.244 3245.22 15892.5 78729.7 680.244 3245.22 15892.5 78729.7 392008 输出矩阵B[M+1][1]= 28.7036 18.9054 44.9315 180.755 833.677 29 M次多项式曲线拟合 输出矩阵E[M+1][M+1]= 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 输出矩阵D[M+1][2*M+2]= 6 12.15 38.0725 151.215 680.244 1 0 0 0 0 12.15 38.0725 151.215 680.244 3245.22 0 1 0 0 0 38.0725 151.215 680.244 3245.22 15892.5 0 0 1 0 0 151.215 680.244 3245.22 15892.5 78729.7 0 0 0 1 0 680.244 3245.22 15892.5 78729.7 392008 0 0 0 0 1 输出矩阵AN[M+1][M+1]= 7.60557 -30.2544 31.0739 -11.273 1.24151 -30.2544 139.476 -150.341 55.7933 -6.21249 31.0739 -150.341 166.101 -62.5425 7.01758 -11.273 55.7933 -62.5425 23.7722 -2.68111 1.24151 -6.21249 7.01758 -2.68111 0.303242 输出矩阵C[M+1][1](矩阵C[M+1][1]=A/B,即C=AN*B)= 39.9168 -80.9324 58.3927 -17.1522 1.68035 输出矩阵(对矩阵C[M+1][1])进行翻转C[M+1][1]= 1.68035 -17.1522 58.3927 -80.9324 39.9168 Press any key to continue 得到的拟合函数为:y?1.68035x4?17.1522x3?58.3927x2?80.9324x?39.9168 6.5 Matlab画图并观察拟合效果 30 数值计算课程设计 x=linspace(-10,400,10); y=1.68035*x.^4-17.1522*x.^3+58.3927*x.^2-80.9324*x+39.9168; plot(x,y,'b') 4.543.532.521.510.50-50x 1010050100150200250300350400 图6-2 多项式拟合的函数图像 31 试值法或试位法求解方程的根 7 试值法或试位法求解方程的根 7.1 试值法或试位法算法说明 求解方程f(x)?0在区间[a,b]内的根,前提条件是与f(b)的符号相反。 7.2 试值法或试位法算法程序 #include 且f(a)f(x是连续的, double feval(double); double min1(double,double); int k,max1=100; double a,b,c,ya,yb,yc,dx,ac,err,delta=0.0001,epsilon=0.0001; cout<<\输入区间端点值a,b:\cin>>a>>b; ya=feval(a); yb=feval(b); cout<<\输出方程的根:\for(k=1;k<=max1;k++) { dx=yb*(b-a)/(yb-ya); c=b-dx; ac=c-a; yc=feval(c); if (yc==0) { } else if (yb*yc>0) { b=c; yb=yc; 32 cout< 数值计算课程设计 } } } else { } dx=min1(fabs(dx),ac); if ((fabs(dx) break; a=c; ya=ya; err=fabs(b-a)/2; yc=feval(c); cout< cout<<\cout<<\return 0; double feval(double x) { } double min1(double dx,double ac) { } if (fabs(dx)>ac) dx=ac; else dx=fabs(dx); return 0; return(x*sin(x)-1); 7.3 试值法或试位法算法求解例题 求解xsin(x)?1?0在区间[0,2]内的根。 7.4 试值法或试位法算法运行结果 输入区间端点值a,b:0 2 输出方程的根:1.09975 33 试值法或试位法求解方程的根 err=:0.450125 yc=:-0.0200192 Press any key to continue 34 数值计算课程设计 8 牛顿—拉夫森迭代算法 8.1 牛顿—拉夫森迭代算法说明 使用初始近似值p0利用迭代 pk?pk?1?f(pk?1) 其中k=1,2,3,...... 'f(pk?1)计算函数f(x)?0的根的近似值。 8.2 牛顿—拉夫森迭代算法程序代码 #include double p0,p1,y,err,relerr,delta=0.1,epsilon=0.1; cout<<\ cin>>p0; cout<<\输出迭代次数:\输出方程的根:\ for (k=1;k<=max1;k++) { p1=p0-f1(p0)/df1(p0); err=fabs(p1-p0); relerr=2*err/(fabs(p1)+delta); p0=p1; y=f1(p0); if ((err cout< cout<<\输出方程的根:\ 35 \ 牛顿—拉夫森迭代算法 cout<<\输出迭代次数:\ cout<<\ cout<<\ return 0; } double f1(double x) { double f; f=pow(x,2.0)-2.0; return f; } double df1(double x) { double df; df=2*x; return df; } 8.3 牛顿—拉夫森迭代算法求解例题求解x2?2?0的根。 8.4 牛顿—拉夫森迭代算法运行结果p0=:2 输出迭代次数,输出方程的根: 1 1.5 0.25 输出方程的根:1.41667 输出迭代次数:2 err:0.0833333 relerr:0.10989 Press any key to continue 36 数值计算课程设计 9 利用外推法的微分求解 9.1 外推算法说明 为了求解f'(x)的数值解,构造包含近似值D(j,k),k?j的表,并将 f'(x)?D(n,n作为最终答案。近似值D(j,k)存放在下三角矩阵中。 第一列是 f(x?2?jh)?f(x?2?jh) D(j,0)??j?12h第j行元素为 D(j,k)?D(j,k?1)?D(j,k?1)?D(j?1,k?1),其中1?k?j k4?19.2 外推算法程序代码 #include using namespace std; int main() { double feval(double); int i,j=1,k,p; double x,delta=0.0001,toler=0.0001,eps=0.01; double h,err=1,relerr=1,D[n][n]; cout<<\输入x值:\cin>>x; cout<<\输入h值:\cin>>h; D[0][0]=(feval(x+h)-feval(x-h))/(2*h); while ((relerr>toler)&&(err>delta)&&(j<12)) { h=h/2; D[j][0]=(feval(x+h)-feval(x-h))/(2*h); for (k=1;k<=j;k++) { 37 利用外推法的微分求解 } D[j][k]=D[j][k-1]+(D[j][k-1]-D[j-1][k-1])/(pow(4.0,k)-1); } err=fabs(D[j][j]-D[j-1][j-1]); relerr=2*err/(fabs(D[j][j])+fabs(D[j-1][j-1])+eps); } for ( i=0;i cout<<\则微分为=\cout< cout<<\cout<<\return 0; for (int p=0;p<=i;p++) cout< j=j+1; cout<<\该矩阵为:\ double feval(double x) { } 9.3 外推算法求解例题 求解f(0.8)?sin(0.8)的值。 9.4 外推算法运行结果 输入x值:0.8 输入h值:0.01 该矩阵为: -0.71734414 -0.7173531 -0.71735609 38 double f; f=cos(x); return f; 数值计算课程设计 则微分为= -0.71735609 err=:1.195586e-005 relerr=:1.6551337e-005 Press any key to continue 39 组合辛普森公式 10 组合辛普森公式 10.1 组合辛普森公式算法说明 通过f(x)的2M+1个等步长采样点xk?a?kh,k?0,1,2?,2M逼近积分 h2hM?14hM?f(x)dx?(f(a)?f(b))?f(x2k?1) ?f(x2k)?3k??133k?1ba注意, x0?a,x2M?b。 10.2 组合辛普森公式程序代码#include double a,b,h,s1,s2,s,x; s1=0; s2=0; cout<<\输入M值:\ cin>>M; cout<<\输入左右端点值:\ cin>>a>>b; h=(b-a)/(2*M); for (k=1;k<=M;k++) { x=a+h*(2*k-1); s1=s1+feval(x); } for (k=1;k<=M-1;k++) { x=a+h*2*k; s2=s2+feval(x); } 40 数值计算课程设计 } s=h*(feval(a)+feval(b)+4*s1+2*s2)/3; cout<<\输出s:\return 0; double feval(double x) { } 10.3 组合辛普森公式求解例题 对函数f(x)?x3在区间[0,1]上积分近似值。 10.4 组合辛普森公式运行结果 double f; f=pow(x,3); return f; 图 10.1 运行结果 41 设计体会及意见 11. 设计体会及意见 11.1 设计体会 这次课程设计主要是将Maltab语言翻译成C++语言,但是还没有熟练地掌握数值算法以及C++的编程能力还不好,所以不能使编程达到很完美,另外,这次课程设计让我们认识到自己所学的知识有限,技术尚未达到很高的水准,不得不虚心向老师及同学求教,以及多多地查询有关的资料,就这方面来说,它让我明白了自身的不足之处,让我懂得在学习的过程更加虚心!。但是通过这次课程设计的实践既提高了我对Maltab程序的应用,又提高了对C++程序的编程,还提高了对Word的编辑,培养了我的独立思考、分析以及解决问题能力,同样也磨练了我的毅力。 12.1 改进意见 在此次课程设计中,由于大部分是参考Maltab程序,没有按照自己的想法去完成,所以应该多独立思考,首先应熟练的掌握算法,然后在Maltab实现,最后完成设计。此次设计中,在求矩阵的逆时,比较繁琐,需要进一步改进。 42 参 考 文 献 [1] John H.Matews.数值方法(第四版)[M].北京:电子工业出版社.2010.4 [2] 谭浩强.C++程序设计[M].北京:清华大学出版社.2004.6 43 目 录 1 经典四阶龙格库塔法解一阶微分方程组................................ 1 1.1 四阶龙格—库塔算法简述 ...................................... 1 1.2 经典四阶龙格库塔法解一阶微分方程算法流程图 .................. 1 1.3 四阶龙格—库塔算法程序 ...................................... 2 1.4 四阶龙格—库塔算法求解例题 .................................. 3 1.5 四阶龙格—库塔运行结果 ...................................... 3 2 高斯列主元法解线性方程组.......................................... 4 2.1 高斯列主元法解线性方程组算法说明 ............................ 4 2.2 高斯列主元法解线性方程组流程图 .............................. 4 2.3 高斯列主元法解线性方程组程序代码 ............................ 5 2.4 高斯列主元法解线性方程组求解例题 ............................ 7 2.5 高斯列主元法解线性方程组算法运行结果 ........................ 7 3 牛顿法解非线性方程组.............................................. 9 3.1 牛顿法解非线性方程组算法说明 ................................ 9 3.2 牛顿法解非线性方程组算法流程图 .............................. 9 3.3 牛顿法解非线性方程组程序代码 ............................... 10 3.4 牛顿法解非线性方程组求解例题 ............................... 13 3.5 牛顿法解非线性方程组算法运行结果 ........................... 13 4 龙贝格求积分算法................................................. 15 4.1 龙贝格积分算法说明 ......................................... 15 4.2 龙贝格求积分算法的算法流程图 ............................... 15 4.3 龙贝格积分算法程序代码 ..................................... 15 4.4 龙贝格积分求解例题 ......................................... 17 4.5 龙贝格积分算法运行结果 ..................................... 17 5 三次样条插值算法(压紧样条)..................................... 18 5.1 三次样条插值算法(压紧样条)说明 ........................... 18 5.2 三次样条插值算法(压紧样条)的算法流程图 ................... 18 5.3 三次样条插值算法(压紧样条)程序代码 ....................... 19 5.4 三次样条插值算法(压紧样条)求解例题 ....................... 21 5.5 三次样条插值算法(压紧样条)程序运行结果 ................... 21 5.6 运用Matlab绘制三次压紧样条的函数图像 ...................... 21 6 M次多项式曲线拟合 ............................................... 22 6.1 M次多项式曲线拟合算法说明.................................. 22 6.2 M次多项式曲线拟合算法流程图................................ 22 6.3 M次多项式曲线拟合算法程序.................................. 22 6.4 M次多项式曲线拟合算法求解例题.............................. 28 6.5 M次多项式曲线拟合算法运行结果.............................. 28 6.5 Matlab画图并观察拟合效果................................... 30 7 试值法或试位法求解方程的根....................................... 32 7.1 试值法或试位法算法说明 ..................................... 32 7.2 试值法或试位法算法程序 ..................................... 32 7.3 试值法或试位法算法求解例题 ................................. 33 7.4 试值法或试位法算法运行结果 ................................. 33 8 牛顿—拉夫森迭代算法............................................. 35 8.1 牛顿—拉夫森迭代算法说明 ................................... 35 8.2 牛顿—拉夫森迭代算法程序代码 ............................... 35 8.3 牛顿—拉夫森迭代算法求解例题 ............................... 36 8.4 牛顿—拉夫森迭代算法运行结果 ............................... 36 9 利用外推法的微分求解............................................. 37 9.1 外推算法说明 ............................................... 37 9.2 外推算法程序代码 ........................................... 37 9.3 外推算法求解例题 ........................................... 38 9.4 外推算法运行结果 ........................................... 38 10 组合辛普森公式.................................................. 40 10.1 组合辛普森公式算法说明 .................................... 40 10.2 组合辛普森公式程序代码 .................................... 40 10.3 组合辛普森公式求解例题 .................................... 41 10.4 组合辛普森公式运行结果 .................................... 41 11. 设计体会及意见................................................. 42 11.1 设计体会 .................................................. 42 12.1 改进意见 .................................................. 42 TOC \\o \参考文献....................................... 43
正在阅读:
数值课程设计01-01
杂多县职称论文发表网-建筑工程消防自动控制系统设计论文选题题04-10
做一个感恩的员工02-18
第四讲 Microsoft PowerPoint 演示文稿08-26
大学英语1复习资料04-05
家庭社会工作考试试题及答案解析12-27
民用建筑工程的绿色施工技术探讨_004-22
ISO 90012015新版标准正式发布05-23
中高级爆破工程技术人员安全作业证04-08
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 数值
- 课程
- 设计
- 纺纱学习题及答案(定稿)(2)
- 浅析银行存款日记账的登帐及结账 - 图文
- 风景园林图例图示标准
- 朗诵考级一级篇目
- E.coli genetype 大肠杆菌基因型
- 2016注册会计师审计答案
- 消费者权益保护法作业及答案1-4
- 2015重庆高考英语
- 宁夏现代种业发展规划
- 计算机网络复习大纲整理 - 图文
- 《概率论与数理统计》(复旦大学出版社)第三章习题答案
- 小百灵广播站九月份广播稿件 - 图文
- 论我国刑事鉴定制度改革与完善
- 休闲体育概论论述和案例分析
- 最新班主任能力大赛情景答辩题目及答案
- 西南大学《大学计算机基础》复习题
- 2010年高考英语完形填空专项训练50篇
- 手机市场营销策划书-word范文文档
- 2015中考满分作文
- 2017江西高考本科一批院校投档分数线汇总(文、理)