数值分析.docx
《数值分析.docx》由会员分享,可在线阅读,更多相关《数值分析.docx(14页珍藏版)》请在冰点文库上搜索。
数值分析
计算方法课程论文
一、课程介绍
随着计算机的飞速发展,数值计算方法已深入到计算物理、计算力学、计算化学、计算生物学、计算经济学等各个领域,并在航天航空、地质勘探、桥梁设计、天气预报和字形字样设计等实际问题领域得到广泛的应用。
同时随着计算机在科学和工程设计中应用日益广泛,它已经成为工程师、大学生和各类管理人员极为有用的工具。
因此将数值计算与计算机相结合解决实际应用中的数学问题的数值近似是一种显而易见的趋势。
计算方法是一种研究并解决数学问题的数值近似解方法,是在计算机上使用的解数学问题的方法。
本课程主要介绍了近代计算机常用的计算方法及其基础理论。
内容包括插值法、曲线拟合的最小二乘法、数值积分、非线性方程的数值解法、方程组的数值解法、常微分方程的数值解法等,除此之外,很重要的就是如何通过编程实现这些方法,培养我们的动手能力及工程计算能力。
二、主要内容以及重点难点
首先我们学习的是数值计算中的误差,在这部分内容中我们要了解误差的四种类型:
模型误差、观测误差、截断误差和舍入误差。
重点学习绝对误差和绝对误差限、相对误差和相对误差限。
另外还需重点掌握的是有效数字及其与误差的关系。
掌握了以上内容后,就可以利用以上知识进行误差的估计了,针对一些问题进行误差分析,但在此,我们需要注意误差在算数运算中的传播,需要掌握的有对加、减、乘、除、开方等算术运算中数据误差的传播规律的分析。
三、算法举例
1、Jacobi迭代法是解线性方程组的方法
1)、输入矩阵A,常数量b,维数n,初始向量X(0),容许误差ε,容许最大迭代次数N。
令k=1。
2)、对i=1,2,……,计算xi=(bi-
(0))/aii
3)、若||X-X(0)||<ε,输出,停止计算,否则转4
4)、若k<N,k+1
k,X
X(0),转2;否则输出失败信息
用C++语言实现Jacobi迭代法代码
#include
#include
#defineRANK100
usingnamespacestd;
doubleArray[RANK+1][RANK+1];
doubleConst_Array[RANK+1];
doubleSolution_Array[RANK+1]={0};
intirank,inumber;
doubledtol;
voidmatrix_input();
voidJacobi_main();
boolCheck_tol(double*s);
voidmain()
{
cout<<"Pleaseinputtherankofthearray(n<=100):
n=";
cin>>irank;
cout<<"Pleaseinputthetolerance:
ε:
=";
cin>>dtol;
cout<<"Pleaseinputthemaxtimeofcaculation:
max=";
cin>>inumber;
matrix_input();
Jacobi_main();
}
voidmatrix_input()
{
cout<<"Nowpleaseinputthecoefficientmatrixbelow:
"<for(inti=1;i<=irank;i++)
{
for(intj=1;j<=irank;j++)
{
cout<<"a"<
cin>>Array[i][j];
}
}
cout<<"Nowpleaseinputtheconstantmatrixbelow:
"<for(inti=1;i<=irank;i++)
{
cout<<"b"<
cin>>Const_Array[i];
}
}
voidJacobi_main()
{
double*value_memory=newdouble[irank+1];
inttimes=0;
boolvalue=true;
while(value)
{
for(inti=1;i<=irank;i++)
{
doublesum=0.0;
for(intj=1;j<=irank;j++)
{
if(i!
=j)
sum+=(Array[i][j]*Solution_Array[j]);
}
value_memory[i]=(Const_Array[i]-sum)/Array[i][i];
}
value=Check_tol(value_memory);
if(times>=inumber)
{
cout<<"Caculationisfail!
Pleasecheckyourmatrix!
"<break;
}
elseif(value)
{
for(inti=1;i<=irank;i++)
{
Solution_Array[i]=value_memory[i];
}
cout<<"<<<<<<<<<>>>>>>>>>"<for(inti=1;i<=irank;i++)
{
cout<}
cout<}
else
{
cout<<"*************Thefinallyresult*************"<for(inti=1;i<=irank;i++)
{
cout<<"x"<
}
cout<}
times++;
}
deletevalue_memory;
}
boolCheck_tol(double*s)
{
boolchk_tol=false;
doublesub=0;
for(inti=1;i<=irank;i++)
{
sub=s[i]-Solution_Array[i];
if(fabs(sub)>dtol)
{
chk_tol=true;
break;
}
}
returnchk_tol;
}
运行结果截图:
2、列主元LU分解法解线性方程组
1)、输入矩阵A和阶n
2)、对k=1,2,…,n做
1>计算
2>选主元
,并记录p。
3>交换A的p,k两行
4>计算U的第k行元素和L的第k列元素
用C++语言实现Jacobi迭代法代码
#include
#include
#defineN4//矩阵维数,可自定义
staticdoubleA[N][N];//系数矩阵
staticdoubleB[N];//右端项
staticdoubleY[N];//中间项
staticdoubleX[N];//输出
staticdoubleS[N];//选取列主元的比较器
inti,j,k;//计数器
voidmain()
{
cout<<"请输入线性方程组(ai1,ai2,ai3......ain,yi):
"<for(i=0;i{
for(intj=0;jcin>>A[i][j];
cin>>B[i];
}
for(k=0;k{
//选列主元
intindex=k;
for(i=k;i{
doubletemp=0;
for(intm=0;m{
temp=temp+A[i][m]*A[m][k];
}
S[i]=A[i][k]-temp;
if(S[index]
{
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;
//构造L、U矩阵
for(j=k;j{
doubletemp=0;
for(intm=0;m{
temp=temp+A[k][m]*A[m][j];
}
A[k][j]=A[k][j]-temp;//先构造U一行的向量
}
for(i=k+1;i{
doubletemp=0;
for(intm=0;m{
temp=temp+A[i][m]*A[m][k];
}
A[i][k]=(A[i][k]-temp)/A[k][k];//再构造L一列的向量
}
}
//求解LY=B
Y[0]=B[0];
for(i=1;i{
doubletemp=0;
for(intj=0;j
{
temp=temp+A[i][j]*Y[j];
}
Y[i]=B[i]-temp;
}
//求解UX=Y
X[N-1]=Y[N-1]/A[N-1][N-1];
for(i=N-2;i>=0;i--)
{
doubletemp=0;
for(intj=i+1;j{
temp=temp+A[i][j]*X[j];
}
X[i]=(Y[i]-temp)/A[i][i];
}
//打印X
cout<<"线性方程组的解(X1,X2,X3......Xn)为:
"<for(i=0;i{
cout<}
}
运行结果截图:
3、Newton插值多项式
插值法利用函数f(x)在某区间中若干点的函数值,作出适当的特定函数,在这些点上取已知值,在区间的其他点上用这特定函数的值作为函数f(x)的近似值。
如果这特定函数是多项式,就称它为插值多项式。
利用插值基函数很容易得到拉格朗日插值多项式,公式结构紧凑,在理论分析中甚为方便,但当插值节点增减时全部插值基函数均要随之变化,整个公式也将发生变化,这在实际计算中是很不方便的,为了克服这一缺点,提出了牛顿插值。
用C语言实现Newton插值法代码
#include
voidmain()
{
floatx[11],y[11][11],xx,temp,newton;
inti,j,n;
printf("Newton插值:
\n请输入要运算的值:
x=");
scanf("%f",&xx);
printf("请输入插值的次数(n<11):
n=");
scanf("%d",&n);
printf("请输入%d组值:
\n",n+1);
for(i=0;i {
printf("x%d=",i);
scanf("%f",&x[i]);
printf("y%d=",i);
scanf("%f",&y[0][i]);
}
for(i=1;i for(j=i;j {
if(i>1)
y[i][j]=(y[i-1][j]-y[i-1][j-1])/(x[j]-x[j-i]);
else
y[i][j]=(y[i-1][j]-y[i-1][j-1])/(x[j]-x[j-1]);
printf("%f\n",y[i][j]);
}
temp=1;newton=y[0][0];
for(i=1;i {
temp=temp*(xx-x[i-1]);
newton=newton+y[i][i]*temp;
}
printf("求得的结果为:
N(%.4f)=%f\n",xx,newton);
运行结果截图:
研究生课程考试卷
学号、姓名:
20122067王志磊
年级、专业:
12级农业电气化与自动化
培养层次:
硕士研究生
课程名称:
数值分析
授课学时学分:
48学时3学分
考试成绩:
授课或主讲教师签字: