标准模版数值计算课程设计Word格式.docx
《标准模版数值计算课程设计Word格式.docx》由会员分享,可在线阅读,更多相关《标准模版数值计算课程设计Word格式.docx(38页珍藏版)》请在冰豆网上搜索。
换行后以小四号宋体打印正文。
章、节、小节编号分别以1、1.1、1.1.1格式依次标出,空一字符后接各部分的标题。
每一章的标题都应出现在本章首页的第一行上。
当课程设计报告结构复杂,小节以下的标题,左起顶格书写,编号依次用
(1)、
(2)……或1)、2)……顺序表示。
字体为小四号宋体。
对条文内容采用分行并叙时,其编号用(a)、(b)……或a)、b)……顺序表示,如果编号及其后内容新起一个段落,则编号前空两个中文字符。
曲线图表要求:
所有曲线、图表、线路图、流程图、程序框图、示意图等不准徒手画,必须按国家规定标准或工程要求绘制(应尽可能采用计算机辅助绘图)。
课程设计说明书(报告)中图表、公式要求如下:
(a)图:
图的名称采用中文,中文字体为五号宋体,图名在图片下面。
引用图应在图题右上角标出文献来源。
图号以章为单位顺序编号。
格式为:
图1-1,空一字符后接图名。
(b)表格:
表的名称及表内文字采用中文,中文字体为五号宋体,表名在表格上面。
表号以章为单位顺序编号,表内必须按规定的符号标注单位。
表1-1,空一字符后接表格名称。
(c)公式:
公式书写应在文中另起一行,居中排列。
公式序号按章顺序编号。
字体为五号宋体,序号靠页面右侧。
(1-1)……。
设计体会及今后的改进意见:
体会要简洁、真实、深刻;
忌空话、套话等不实之词。
改进意见要合理、中肯。
参考文献的要求:
另起一页,居中打印参考文献四字(四号黑体,段前段后1行),字间空一字符;
另起一行,按论文中参考文献出现的先后顺序用阿拉伯数字连续编号(参考文献应在正文中注出);
参考文献中每条项目应齐全(字体均为小四号宋体)。
(格式:
[编号]作者.论文或著作名称.期刊名或出版社.出版时间)。
(期刊应注明第几期、起止页数(包括论著))。
3)设计报告装订顺序与规范
封面
数值计算设计课程设计报告正文
设计体会及今后的改进意见
参考文献(资料)
左边缘装订
3、课程设计工作进度计划:
时间
设计任务及要求
第14周
编写和调试程序并按要求撰写设计报告
指导教师:
刘海峰日期:
6.21
教研室主任:
日期:
1经典四阶龙格库塔法解一阶微分方程组
1.1算法说明
龙格-库塔(Runge-Kutta)方法是一种在工程上应用广泛的高精度单步算法。
由于此算法精度高,采取措施对误差进行抑制,所以其实现原理也较复杂。
该算法是构建在数学支持的基础之上的。
图3-1四阶龙格库塔法流程图
1.2程序运行结果
图3-2四阶龙格库塔算法程序结果
1.3程序代码
#include<
iostream>
usingnamespacestd;
intmain()
{
intM;
floatX[120],Y[120],F[120];
inta,b;
a=0,b=1.4;
floath=0.1;
doublek1,k2,k3,k4;
floatf(float,float);
X[0]=0.0;
Y[0]=0.0;
F[0]=f(X[0],Y[0]);
for(M=0;
M<
(int)((b-a)/h);
M++)
{
X[M]=X[0]+M*h;
F[M]=f(X[M],Y[M]);
k1=h*F[M];
k2=h*f(X[M]+h/2,Y[M]+k1/2);
k3=h*f(X[M]+h/2,Y[M]+k2/2);
k4=h*f(X[M]+h,Y[M]+k3);
Y[M+1]=Y[M]+(k1+2*k2+2*k3+k4)/6.0;
F[M+1]=f(X[M+1],Y[M+1]);
cout<
<
X[M]<
"
"
Y[M]<
endl;
}
return0;
}
floatf(floata,floatb)
{floatc;
c=1+b*b;
return(c);
}
2高斯列主元法解线性方程组
2.1算法说明
一个二元一次方程组,设法对每个等式进行变形,使两个等式中的同一个未知数的系数相等,这两个等式相减,得到一个新的等式,在这个新的等式中,系数相等的未知数就被除去了(系数为0)。
同样的也适合多元多次方程组。
它是线性代数中的一个算法,用于决定线性方程组的解,决定矩阵的秩,以及决定可逆方矩阵的逆。
当用于一个矩阵时,高斯消去产生“行消去梯形形式”。
Gauss列主元消去法是在Gauss消去法中增加选主元的过程,即在第k步(k=1,2,3,…)消元时,首先在第k列主对角元以下(含对角元)元素中挑选绝对值最大的数(即为列主元),并通过初等行变换,使得该数位于主对角线上,然后再继续消元。
2.2运行结果
图2-1高斯列主元法解线性方程组程序运行结果
2.3程序代码
#include<
cmath>
voidssss(double**a,double*x,intn);
inti,j,n;
double**a;
cout<
输入增广矩阵的列数n:
n="
;
cin>
>
n;
a=newdouble*[n];
for(i=0;
i<
i++)
a[i]=newdouble[n-1];
输入方程的系数"
n-1;
i++)
for(j=0;
j<
j++)
{cin>
a[i][j];
doublex[100];
ssss(a,x,n-1);
delete[]a;
return0;
voidssss(double**a,double*x,intn)
intk,i,j,f,g;
doublet,r;
for(k=0;
k<
k++)
f=k;
for(i=k+1;
{
if(fabs(a[i][k])>
fabs(a[f][k]))
f=i;
}
for(i=0;
n+1;
{
t=a[k][i];
a[k][i]=a[f][i];
a[f][i]=t;
}//换行
for(i=k+1;
t=a[i][k];
for(j=k;
j++)
a[i][j]=a[i][j]-(t/a[k][k])*a[k][j];
//变成上三角矩阵
}
cout<
输出上三角矩阵"
{for(j=0;
a[i][j]<
//下面是回带过程
x[n-1]=a[n-1][n]/a[n-1][n-1];
for(i=n-2;
i>
=0;
i--)
r=0;
for(j=n-1;
j>
i;
j--)
r=r+a[i][j]*x[j];
x[i]=(a[i][n]-r)/a[i][i];
高斯消元法的一个解"
cout<
x"
i+1<
="
x[i]<
3牛顿法解非线性方程组
3.1算法说明
图3-1牛顿法解非线性方程组流程图
3.2运行结果
图3-2牛顿法解非线性方程组程序运行结果
3.3程序代码
#defineN2//定义非线性方程组中方程个数、未知量个数(这里做的是书P137例题)
#defineepsilon0.0001//定义差向量1范数的上限
#defineMax100//这是最大迭代次数
constintN2=2*N;
voidss(floatxx[N],floatyy[N]);
//计算向量函数的因变量向量yy[N]
voidssjacobian(floatxx[N],floatyy[N][N]);
//计算雅克比矩阵yy[N][N]
voidinv_jacobian(floatyy[N][N],floatinv[N][N]);
//计算雅克比矩阵的逆矩阵inv
voidnewton(floatx0[N],floatinv[N][N],floaty0[N],floatx1[N]);
//由近似解向量x0计算近似解向量x1
floatx0[N]={2.0,0.25},y0[N],jacobian[N][N],invjacobian[N][N],x1[N],errornorm;
inti,j,iter=0;
cout<
初始近似解向量:
for(i=0;
N;
x0[i]<
do
iter=iter+1;
第"
iter<
次迭代开始"
//计算向量函数的因变量向量y0
ss(x0,y0);
//计算雅克比矩阵
ssjacobian(x0,jacobian);
//计算雅克比矩阵的逆矩阵
inv_jacobian(jacobian,invjacobian);
newton(x0,invjacobian,y0,x1);
//计算差向量的1范数errornorm
errornorm=0;
errornorm=errornorm+fabs(x1[i]-x0[i]);
if(errornorm<
epsilon)break;
x0[i]=x1[i];
}while(iter<
Max);
return0;
voidss(floatxx[N],floatyy[N])
{floatx,y;
inti;
x=xx[0];
y=xx[1];
yy[0]=x*x-2*x-y+0.5;
yy[1]=x*x+4*y*y-4;
向量函数的因变量向量是:
for(i=0;
yy[i]<
voidssjacobian(floatxx[N],floatyy[N][N])
floatx,y;
inti,j;
//jacobianhaven*nelement
yy[0][0]=2*x-2;
yy[0][1]=-1;
yy[1][0]=2*x;
yy[1][1]=8*y;
雅克比矩阵是:
{for(j=0;
yy[i][j]<
voidinv_jacobian(floatyy[N][N],floatinv[N][N])
{floataug[N][N2],L;
inti,j,k;
开始计算雅克比矩阵的逆矩阵:
{for(j=0;
aug[i][j]=yy[i][j];
for(j=N;
N2;
if(j==i+N)aug[i][j]=1;
elseaug[i][j]=0;
aug[i][j]<
for(i=0;
for(k=i+1;
{L=-aug[k][i]/aug[i][i];
for(j=i;
aug[k][j]=aug[k][j]+L*aug[i][j];
for(i=N-1;
0;
{
for(k=i-1;
k>
k--)
for(j=N2-1;
for(i=N-1;
for(j=N2-1;
aug[i][j]=aug[i][j]/aug[i][i];
inv[i][j-N]=aug[i][j];
雅克比矩阵的逆矩阵:
inv[i][j]<
voidnewton(floatx0[N],floatinv[N][N],floaty0[N],floatx1[N])
floatsum=0;
{sum=0;
for(j=0;
sum=sum+inv[i][j]*y0[j];
x1[i]=x0[i]-sum;
近似解向量:
x1[i]<
4龙贝格求积分算法
4.1算法说明
生成
的逼近表
,并以
为最终解来逼近积分
(4-1)
逼近
存在于一个特别的下三角矩阵中,第0列元素
用基于
个[a,b]子区间的连续梯形方法计算,然后利用龙贝格公式计算
。
当
时,第
行的元素为
(4-2)
时,程序在第
行结束。
图4-1龙贝格求积分算法流程图
4.2运行结果
图4-2龙贝格求积分算法程序运行结果
4.3程序代码
iostream.h>
cstdio>
floatf(floatx)
returnx*x;
main()
intM=1,n=0,p=0,K=0,i=0,j=0,J=0;
floath=0.0,a=0.0,b=0.0,err=1.0,quad=0.0,s=0.0,x=0.0,tol=0.0;
floatR[30][30]={0};
a=0;
b=1;
h=b-a;
n=4;
tol=0.000001;
求函数y=x^2在(0,1)上的龙贝格积分"
'
\n'
龙贝格矩阵最大行数为:
n<
误差限为:
tol;
R[0][0]=h*(f(a)+f(b))/2;
while(((err>
tol)&
&
(J<
n))||(J<
4))
J=J+1;
h=h/2;
s=0;
for(p=1;
p<
=M;
p++)
x=a+h*(2*p-1);
s=s+f(x);
R[J][0]=R[J-1][0]/2+h*s;
M=2*M;
for(K=1;
K<
=J;
K++)
R[J][K]=R[J][K-1]+(R[J][K-1]-R[J-1][K-1])/(pow(4,K)-1);
err=fabs(R[J-1][J-1]-R[J][K]);
quad=R[J][J];
\n龙贝格矩阵为:
(J+1);
'
R[i][j]<
\n"
积分值为:
quad<
误差估计为:
err<
使用过的最小步长:
h<
5三次样条插值算法(压紧样条)
5.1算法说明
图5-1样条插值算法(压紧样条)流程图
5.2运行结果
图5-2样条插值算法(压紧样条)算法运行结果
5.3程序代码
voidmain()
输入节点个数:
intnum;
num;
intn=num-1;
double*x=newdouble[num];
double*y=newdouble[num];
按序依次输入各处节点及函数值"
for(inti=0;
=n;
cin>
x[i]>
y[i];
double*h=newdouble[num];
=n-1;
h[i]=x[i+1]-x[i];
double*a1=newdouble[num];
double*b1=newdouble[num];
请输入边界。
按1输入第一种边界条件,按2输入第二种边界条件:
intpd;
pd;
if(pd==1)
按顺序输入两端点的微商:
intk1,k2;
k1>
k2;
a1[0]=0;
a1[n]=1;
b1[0]=2*k1;
b1[n]=2*k2;
else
按顺序输入两端点的二阶微商:
intt1,t2;
t1>
t2;
a1[0]=1;
a1[n]=0;
b1[0]=3*(y[1]-y[0])/h[0];
b1[n]=3*(y[n]-y[n-1])/h[n-1];
for(i=1;
a1[i]=h[i-1]/(h[i-1]+h[i]);
b1[i]=((1-a1[i])*(y[i]-y[i-1])/h[i-1]+a1[i]*(y[i+1]-y[i])/h[i])*3;
double*a2=newdouble[num];
double*b2=newdouble[num];
a2[0]=-a1[0]/2;
b2[0]=b1[0]/2;
a2[i]=-a1[i]/(2+(1-a1[i])*a2[i-1]);
b2[i]=(b1[i]-(1-a1[i])*b2[i-1])/(2+(1-a1[i])*a2[i-1]);
double*m=newdouble[n+2];
m[n+1]=0;
for(i=n;
m[i]=a2[i]*m[i+1]+b2[i];
输入所要求的点:
intxx;
xx;
for(