09级数值
分析
定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析
实验
报告
软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载
数值分析实验报告
计算机科学与技术
课题一 解线性方程组的直接方法
一、问题提出
给定下列几个不同类型的线性方程组,请用适当的直接法求解.
(1) 线性方程组
=
精确解x
EMBED Equation.3 = ( 1, -1, 0, 1, 2, 0, 3, 1, -1, 2 )
(2)设对称正定阵系数阵线方程组
=
精确解x
= ( 1, -1, 0, 2, 1, -1, 0, 2 )
3、三对角形线性方程组
=
精确解x
= ( 2, 1, -3, 0, 1, -2, 3, 0, 1, -1 )
二、要求
(1)对上述三个方程组分别利用Gauss顺序消去法与Gauss列主元消去法;平方根法与改进平方根法;追赶法求解(选择其一).
(2)编出算法通用程序.
(3)在应用Gauss消去法时,尽可能利用相应程序输出系数矩阵的三角分解式.
三、 目的和意义
(1)通过该课题的程序编制,掌握模块化结构程序
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
方法.
(2)掌握求解各类线性方程组的直接方法,了解各种方法的特点.
(3)体会高斯消去法选主元的必要性.
四、实验流程图
Gauss顺序消去法
平方根法 追赶法
五、实验源程序代码
Gauss顺序消去法
#include
#include
void main()
{
double a[10][11]={4,2,-3,-1,2,1,0,0,0,0,5,
8,6,-5,-3,6,5,0,1,0,0,12,
4,2,-2,-1,3,2,-1,0,3,1,3,
0,-2,1,5,-1,3,-1,1,9,4,2,
-4,2,6,-1,6,7,-3,3,2,3,3,
8,6,-8,5,7,17,2,6,-3,5,46,
0,2,-1,3,-4,2,5,3,0,1,13,
16,10,-11,-9,17,34,2,-1,2,2,38,
4,6,2,-7,13,9,2,0,12,4,19,
0,0,-1,8,-3,-24,-8,6,3,-1,-21};//增广矩阵
double x[10];
int i,j,k;
int maxi;
double max;
double temp;
double sum;
double l;
for(k=0;k<9;k++)
{
i=k;
max=fabs(a[i][k]);
maxi=i;
for(;i<10;i++)
{
if(fabs(a[i][k])>max)
{
max=(fabs(a[i][k]));
maxi=i;
}
}
if(maxi!=k)
{
for(j=0;j<=10;j++)
{
temp=a[k][j];
a[k][j]=a[maxi][j];
a[maxi][j]=temp;
}
}
for(i=k+1;i<10;i++)
{
l=a[i][k]/a[k][k];
for(j=k+1;j<=10;j++)
{
a[i][j]=a[i][j]-l*a[k][j];
}
a[i][k]=0.0;
}
}
printf("GAUSS列主元后的矩阵为:\n");
for(i=0;i<=9;i++)
{
for(j=0;j<10;j++)
printf("%8.5f",a[i][j]);
printf("\n");
}
x[9]=a[9][10]/a[9][9];
for(i=8;i>=0;i--)
{
sum=0;
for(j=i+1;j<=9;j++)
{
sum=a[i][j]*x[j]+sum;
}
x[i]=(a[i][10]-sum)/a[i][i];
}
printf("x向量为:\n");
for(i=0;i<10;i++)
printf("%f ",x[i]);
}
平方根法
#include
#include
void main()
{
double a[8][8]={4,2,-4,0,2,4,0,0,
2,2,-1,-2,1,3,2,0,
-4,-1,14,1,-8,-3,5,6,
0,-2,1,6,-1,-4,-3,3,
2,1,-8,-1,22,4,-10,-3,
4,3,-3,-4,4,11,1,-4,
0,2,5,-3,-10,1,14,2,
0,0,6,3,-3,-4,2,19};
double b[8]={0,-6,6,23,11,-22,-15,45},g[8][8],x[8],y[8];
int k,m,i;
double sum;
for(k=0;k<8;k++)
{
if(k==0)
{g[0][0]=sqrt(a[0][0]);
a[0][0]=g[0][0];
for(i=1;i<=7;i++)
{g[i][0]=a[i][0]/a[0][0];
a[i][0]=g[i][0];
a[0][i]=a[i][0];
}
y[0]=b[0]/g[0][0];
}
else{
sum=0.0;
for(m=0;m<=k-1;m++)
sum=sum+a[k][m]*a[k][m];
g[k][k]=sqrt(a[k][k]-sum);
a[k][k]=g[k][k];
for(i=k+1;i<8;i++)
{
sum=0.0;
for(m=0;m<=k-1;m++)
sum=sum+a[i][m]*a[k][m];
g[i][k]=(a[i][k]-sum)/a[k][k];
a[i][k]=g[i][k];
a[k][i]=a[i][k];
}
sum=0.0;
for(m=0;m<=k-1;m++)
sum=sum+a[k][m]*y[m];
y[k]=(b[k]-sum)/a[k][k];
}
}
for(i=0;i<8;i++)
{
for(m=0;m<8;m++)
printf("%8.6f ",a[i][m]);
printf("\n");
}
printf("所得y[]为 \n");
for(i=0;i<8;i++)
{
printf("%f ",y[i]);
}
x[7]=y[7]/a[7][7];
for(k=6;k>=0;k--)
{
sum=0.0;
for(m=k+1;m<8;m++)
sum=sum+a[k][m]*x[m];
x[k]=(y[k]-sum)/a[k][k];
}
printf("解向量x为:\n");
for(i=0;i<8;i++)
{
printf("%f ",x[i]);
}
}
追赶法:
#include
#include
void main()
{
double a[10]={4,4,4,4,4,4,4,4,4,4},
b[10]={7,5,-13,2,6,-12,14,-4,5,-5},
c[9]={-1,-1,-1,-1,-1,-1,-1,-1,-1},
d[9]={-1,-1,-1,-1,-1,-1,-1,-1,-1},
x[10],y[10],p[10],q[9];
int i;
p[0]=a[0];
for(i=0;i<9;i++)
{
q[i]=c[i]/p[i];
p[i+1]=a[i+1]-d[i+1]*q[i];
}
y[0]=b[0]/p[0];
for(i=1;i<10;i++)
{
y[i]=(b[1]-d[i]*y[i-1])/p[i];
}
x[9]=y[9];
for(i=8;i>=0;i--)
{
x[i]=y[i]-q[i]*x[i+1];
}
printf("解向量x为:\n ");
for(i=0;i<10;i++)
{
printf("%9.6f ",x[i]);
}
}
课题二 线性方程组的迭代法
一、问题提出
1、设线性方程组
=
x
EMBED Equation.3 = ( 1, -1, 0, 1, 2, 0, 3, 1, -1, 2 )
2、设对称正定阵系数阵线方程组
=
x
= ( 1, -1, 0, 2, 1, -1, 0, 2 )
3、三对角形线性方程组
=
x
= ( 2, 1, -3, 0, 1, -2, 3, 0, 1, -1 )
试分别选用Jacobi 迭代法,Gauss-Seidol迭代法和SOR方法计算其解。
二、要求
1、体会迭代法求解线性方程组,并能与消去法做以比较;
2、分别对不同精度要求,如
由迭代次数体会该迭代法的收敛快慢;
3、对方程组2,3使用SOR方法时,选取松弛因子
=0.8,0.9,1,1.1,1.2等,试看对算法收敛性的影响,并能找出你所选用的松弛因子的最佳者;
4、给出各种算法的设计程序和计算结果。
三、目的和意义
1、通过上机计算体会迭代法求解线性方程组的特点,并能和消去法比较;
2、运用所学的迭代法算法,解决各类线性方程组,编出算法程序;
3、体会上机计算时,终止步骤
<
或k >(予给的迭代次数),对迭代法敛散性的意义;
4、体会初始解 x
,松弛因子的选取,对计算结果的影响。
四、实验流程图
J GS
SOR
五、实验代码
Jacobi
#include
#include
#define N 15
void main()
{
double a[10][10]={4,2,-3,-1,2,1,0,0,0,0,
8,6,-5,-3,6,5,0,1,0,0,
4,2,-2,-1,3,2,-1,0,3,1,
0,-2,1,5,-1,3,-1,1,9,4,
-4,2,6,-1,6,7,-3,3,2,3,
8,6,-8,5,7,17,2,6,-3,5,
0,2,-1,3,-4,2,5,3,0,1,
16,10,-11,-9,17,34,2,-1,2,2,
4,6,2,-7,13,9,2,0,12,4,
0,0,-1,8,-3,-24,-8,6,3,-1};
double x0[10]={0,0,0,0,0,0,0,0,0,0};
double b[10]={5,12,3,2,3,46,13,38,19,-21};
double x[10];
double x_true[10]={1,-1,0,1,2,0,3,1,-1,2};
int i,j,k;
double max;
double sum;
double e1=10e-3,e2=10e-4,e3=10e-5;
for(k=0;kmax)
max=fabs(x_true[i]-x0[i]);
}
printf("%f\n ",max);
if(max
#include
#define N 20
void main()
{
double a[8][8]={4,2,-4,0,2,4,0,0,
2,2,-1,-2,1,3,2,0,
-4,-1,14,1,-8,-3,5,6,
0,-2,1,6,-1,-4,-3,3,
2,1,-8,-1,22,4,-10,-3,
4,3,-3,-4,4,11,1,-4,
0,2,5,-3,-10,1,14,2,
0,0,6,3,-3,-4,2,19};
double x0[8]={0,0,0,0,0,0,0,0};
double b[8]={0,-6,6,23,11,-22,-15,45};
double x[8];
double r;
double r1;
double e1=10e-3,e2=10e-4,e3=10e-5;
double w1=0.8,w2=0.9,w3=1,w4=1.1,w5=1.2;
int k,i,j;
double sum;
for(i=0;i<8;i++)
x[i]=x0[i];
for(k=1;kfabs(r))
r=r1;
x[i]=x[i]+r1;
}
if(fabs(r)<=e1)
{
printf("总次数为%d\n",k);
for(i=0;i<8;i++)
printf("%9.6f",x[i]);
break;
}
}
if(k==N)
{
printf("已达到最大迭代次数\n");
for(i=0;i<8;i++)
printf("%9.6f",x[i]);
}
}
#include
#include
#define N 20
void main()
{
double a[8][8]={4,2,-4,0,2,4,0,0,
2,2,-1,-2,1,3,2,0,
-4,-1,14,1,-8,-3,5,6,
0,-2,1,6,-1,-4,-3,3,
2,1,-8,-1,22,4,-10,-3,
4,3,-3,-4,4,11,1,-4,
0,2,5,-3,-10,1,14,2,
0,0,6,3,-3,-4,2,19};
double x0[8]={0,0,0,0,0,0,0,0};
double b[8]={0,-6,6,23,11,-22,-15,45};
double x_true[8]={1,-1,0,2,1,-1,0,2};
double x[8];
double sum,max;
int i,j,k;
double e1=10e-3,e2=10e-4,e3=10e-5;
for(k=1;kmax)
max=fabs(x[i]-x_true[i]);
}
printf("max%d=%f\n",k,max);
if(max
#include
double lagrange(double x[],double y[],double h,int n) // 拉格朗日插值函数
{
int i,j;
double k,f=0.0;
for(i=0;ix[2])
for(i=0;i<3;i++)
{
d=1.0;
for(j=0;j<3;j++)
{if(j!=i)
d= d*(k-x[j])/(x[i]-x[j]);
}
f=f+d*y[i];
}
return f;
}
int main()
{
double x1[]={0.4,0.55,0.65,0.80,0.95,1.05},y1[]={0.41075,0.57815,0.69675,0.90,1.00,1.25382},
x2[]={1,2,3,4,5,6,7},
y2[]={0.368,0.135,0.050,0.018,0.007,0.002,0.001};
double x=0.596,y=0.99,z=1.8;
printf("%f \n ",lagrange( x1,y1,x,6));
printf("%f \n ",lagrange( x1,y1,y,6));
printf("%f \n",stwofen( x1,y1,x));
printf("%f \n",stwofen( x1,y1,y));
printf("%f \n",lagrange( x2,y2,z,7));
return 0;
}
课题四 数值积分
一、问题提出
选用复合梯形公式,复合Simpson公式,Romberg算法,计算
(1) I =
(2) I =
EMBED Equation.3
(3) I =
(4) I =
二、要求
1、 编制数值积分算法的程序;
2、 分别用两种算法计算同一个积分,并比较其结果;
3、 分别取不同步长
EMBED Equation.3
,试比较计算结果(如n = 10, 20等);
4、 给定精度要求
,试用变步长算法,确定最佳步长。
三、目的和意义
1、 深刻认识数值积分法的意义;
2、 明确数值积分精度与步长的关系;
3、 根据定积分的计算方法,可以考虑二重积分的计算问题。
四、流程图
复化的T形公式 复化的Simpson公式
Romberg 公式
五、代码实现
复化梯形
#include
#include
#define N 2000000
double fx2(double x)
{
if(x==0)
return 1;
else
return sin(x)/x;
}
double fx1(double x)
{
return sqrt(4-sin(x)*sin(x));
}
double fx3(double x)
{
return(exp(x)/(4+x*x));
}
double fx4(double x)
{
return (log(1+x)/(1+x*x));
}
void main()
{
double a=0;
double b=0.25;
double h=(b-a)/N;
double F0,F1;
int j;
double y,x;
F0=fx1(a)+fx1(b);
F1=0;
for(j=1;j
#include
#define N 100
double fx2(double x)
{
if(x==0)
return 1;
else
return sin(x)/x;
}
double fx1(double x)
{
return sqrt(4-sin(x)*sin(x));
}
double fx3(double x)
{
return(exp(x)/(4+x*x));
}
double fx4(double x)
{
return (log(1+x)/(1+x*x));
}
void main()
{
double a=0;
double b=0.25;
double h=(b-a)/(2*N);
double F0,F1,F2;
int j;
double y,x;
F0=fx1(a)+fx1(b);
F1=0;
F2=0;
for(j=1;j<2*N;j++)
{
x=a+j*h;
if(j%2==0)
F2=F2+fx1(x);
else
F1=F1+fx1(x);
}
y=h*(F0+2*F2+4*F1)/3.0;
printf("%f\n",y);
b=1.0;
h=(b-a)/(2*N);
F0=fx2(a)+fx2(b);
F1=0;
F2=0;
for(j=1;j<2*N;j++)
{
x=a+j*h;
if(j%2==0)
F2=F2+fx2(x);
else
F1=F1+fx2(x);
}
y=h*(F0+2*F2+4*F1)/3.0;
printf("%f\n",y);
F0=fx3(a)+fx3(b);
F1=0;
F2=0;
for(j=1;j<2*N;j++)
{
x=a+j*h;
if(j%2==0)
F2=F2+fx3(x);
else
F1=F1+fx3(x);
}
y=h*(F0+2*F2+4*F1)/3.0;
printf("%f\n",y);
F0=fx4(a)+fx4(b);
F1=0;
F2=0;
for(j=1;j<2*N;j++)
{
x=a+j*h;
if(j%2==0)
F2=F2+fx4(x);
else
F1=F1+fx4(x);
}
y=h*(F0+2*F2+4*F1)/3.0;
printf("%f\n",y);
}
N=20
4
_1387219887.unknown
_1387219904.unknown
_1387219912.unknown
_1387219920.unknown
_1387219924.unknown
_1387219928.unknown
_1387219930.unknown
_1387219931.vsd
�
�
�
开始
开始
输入积分a,b值及N
h=(b-a)/N
F0=f(a)+f(b)
F1=0
i=1…N
x=a+ih
F1=F1+f(x)
Y=h*(F0+2*F1)/2.0
结束
输入积分a,b值及N
h=(b-a)/2N
F0=f(a)+f(b)
F1=0
F2=0
i=1…2N-1
x=a+ih
i为偶数->F2=F2+f(x)
else ->
F1=F1+f(x)
Y=h*(F0+2*F1)/2.0
结束
_1387219932.vsd
�
�
开始
Y
N
输入积分a,b值及精度ε
结束
_1387219929.unknown
_1387219926.unknown
_1387219927.unknown
_1387219925.unknown
_1387219922.unknown
_1387219923.unknown
_1387219921.unknown
_1387219916.vsd
�
�
开始
输入数据n,x1,x2,x3…xn及函数值y1,y2,y3...yn,所求值h
For(i=0;i|R|
判断k==N
输出x[1…n],k
|R|<=ε
i==n
i++
已经达到最大迭代次数,输出x[1…n],k
N
Y
Y
Y
N
Y
N
结束
_1387219913.unknown
_1387219908.unknown
_1387219910.unknown
_1387219911.unknown
_1387219909.unknown
_1387219906.unknown
_1387219907.unknown
_1387219905.unknown
_1387219896.unknown
_1387219900.unknown
_1387219902.unknown
_1387219903.unknown
_1387219901.unknown
_1387219898.unknown
_1387219899.unknown
_1387219897.unknown
_1387219891.unknown
_1387219894.unknown
_1387219895.unknown
_1387219893.unknown
_1387219889.vsd
�
�
�
开始
初始化系数矩阵及右端项和维数
循环k=1…n-1找到最大列主元,k<=j<=n,|a[i][k]|=max|a[j][k]|
a[i][k]==0
i==k
消元 for (i=k+1,i<=n,i++)
for(j=k,j<=n,j++)
l[i][k]=a[i][k]/a[k][k]
a[i][j]=a[i][j]-l[i][k]*a[k][j]
则b[i]=b[i]-l[i][k]*b[k]
j=k…n
a[k][j]与a[i][j]两行互换
判断a[n][n]==0
回代求解j=i+1...n
则x[n]=b[n]/a[n][n]
则x[i]=(b[i]-∑(a[i][j]*x[j]))/a[i][i]
没有唯一解
输出x[1…n]
结束
N
Y
Y
N
N
Y
Gauss顺序消去法
_1387219890.vsd
�
�
�
开始
初始化系数矩阵及右端项和维数
i=k+1..n;m=1…k-1
a[i][k]=(a[i][k]-∑a[i][m]a[k][m])/a[k][k]
y[k]=(b[k]-∑a[k][m]y[m])/a[k][k]
循环 k=1…n;m=1…k-1
则a[k][k]=(a[k][k]-∑(a[k][m]*a[k][m])^½
开始
回代求解则x[n]=y[n]/a[n][n]
则k=n-1…1;m=k+1…n;x[k]=(y[k]-∑(a[m][k]*x[m]))/a[k][k]
初始化系数矩阵及右端项和维数
输出x[1…n]
结束
α[1]=a[1]
对i=1…n-1;
计算β[i]=c[i]/α[i]
α[i+1]=a[i+1]-d[i+1]*β[i];
对于i=n-1…1;
x[n]=y[n];
x[i]=y[i]-β[i]*x[i+1];
输出x[1…n]
对于i=2…n;
y[1]=b[1]/α[1]
则y[i]=(b[1]-d[i]*y[i-1])/α[i]
结束
_1387219888.unknown
_1387219879.unknown
_1387219883.unknown
_1387219885.unknown
_1387219886.unknown
_1387219884.unknown
_1387219881.unknown
_1387219882.unknown
_1387219880.unknown
_1387219875.unknown
_1387219877.unknown
_1387219878.unknown
_1387219876.unknown
_1387219873.unknown
_1387219874.unknown
_1387219872.unknown