数值分析sdp.docx
- 文档编号:9744313
- 上传时间:2023-02-06
- 格式:DOCX
- 页数:15
- 大小:65.19KB
数值分析sdp.docx
《数值分析sdp.docx》由会员分享,可在线阅读,更多相关《数值分析sdp.docx(15页珍藏版)》请在冰豆网上搜索。
数值分析sdp
计算机数值方法
实习报告
电子工程与光电技术学院
通信工程
Xxx
0904220xxx
2010年6月
9.5方程求根的数值试验题1
㈠问题
当用Newton迭代法求方程f(x)=0的根时,我们从x0开始求解,为减少计算量,可以将导数取定初值的导数,或者每隔一个求一次导数。
对以上两种方法,以几个已知其根的简单函数为例,与Newton法作数值比较,打印出各方法中每步迭代的误差,以检查收敛性,分析各方法的求解效果。
㈡算法
取两个方程x*x-4*x+4=0与x*x*x-1=0来研究它们的收敛性。
两个方程取初值,分别为3和2。
(1)、Newton迭代法
xn+1=xn-f(xn)/f’(xn)=xn-(xn^2-4*xn+4)/(2*xn-4)
xn+1=xn-g(xn)/g’(xn)=xn-(xn^3-1)/(3xn^2)
(2)、初值求导迭代
xn+1=xn-f(xn)/f’(x0)=xn-(xn^2-4*xn+4)/2
xn+1=xn-g(xn)/g’(x0)=xn-(xn^3-1)/12
(3)、隔步求导迭代
x2n+1=x2n-f(x2n)/f’(x2n)=x2n-(x2n^2-4*x2n+4)/(2*x2n-4)
x2n+2=x2n+1-f(x2n+1)/f’(x2n)=x2n+1-(x2n+1^2-4*x2n+1+4)/(2*x2n-4)
x2n+1=x2n-g(x2n)/g’(x2n)=x2n-(x2n^3-1)/(3x2n^2)
x2n+2=x2n+1-g(x2n+1)/g’(x2n)=x2n+1-(x2n+1^3-1)/(3x2n^2)
㈢数据流向图
x0
㈣模块关系图和模块流程图
结论
输出误差
㈤符号引用表
标志符
数学符号
类型
个数
入
出
作用
x
x0
double
不定
*
方程初值
f
f(x)
double
不定
函数名
f1
f’(x)
double
不定
函数名
g
g(x)
double
不定
函数名
g1
g’(x)
double
不定
函数名
s
double
不定
数组名
i
int
不定
控制循环
㈥分程序
1第一个方程改进方法的两种方法与Newton法的比较
cout<<"求x*x-4*x+4=0的根:
"<<'\n';
doublex=3;
doubles[10][2];
cout<<"Newton迭代法:
"<<'\n';
for(inti=0;f(x)&&i<10;i++)
{s[i][0]=x;
s[i][1]=fabs(2-x);
cout<
"<
x=x-f(x)/f1(x);
}
cout<<"第二种方法(初值求导迭代):
"<<'\n';
x=s[0][0];
for(i=0;f(x)&&i<10;i++)
{s[i][0]=x;
s[i][1]=fabs(2-x);
cout<
"<
x=x-f(x)/f1(3);
}
cout<<"第三种方法(隔步求导迭代):
"<<'\n';
x=s[0][0];
for(i=0;f(x)&&i<10;i++)
{s[i][0]=x;
s[i][1]=fabs(2-x);
cout<
"<
if(i%2==0)x=x-f(x)/f1(x);
elsex=x-f(x)/f1(s[i-1][0]);
}
2第二个方程改进方法的两种方法与Newton法的比较
cout<<"求x*x*x-1=0的根:
"<<'\n';
x=2;
cout<<"Newton迭代法:
"<<'\n';
for(i=0;g(x)&&i<10;i++)
{s[i][0]=x;
s[i][1]=fabs(1-x);
cout<
"<
x=x-g(x)/g1(x);
}
cout<<"第二种方法(初值求导迭代):
"<<'\n';
x=s[0][0];
for(i=0;g(x)&&i<10;i++)
{s[i][0]=x;
s[i][1]=fabs(1-x);
cout<
"<
x=x-g(x)/g1(3);
}
cout<<"第三种方法(隔步求导迭代):
"<<'\n';
x=s[0][0];
for(i=0;g(x)&&i<10;i++)
{s[i][0]=x;
s[i][1]=fabs(1-x);
cout<
"<
if(i%2==0)x=x-g(x)/g1(x);
elsex=x-g(x)/g1(s[i-1][0]);
}
㈦程序的输出结果与问题分析
Ⅰ、程序的输出结果
求x*x-4*x+4=0的根:
Newton迭代法:
3误差:
1
2.5误差:
0.5
2.25误差:
0.25
2.125误差:
0.125
2.0625误差:
0.0625
2.03125误差:
0.03125
2.01563误差:
0.015625
2.00781误差:
0.0078125
2.00391误差:
0.00390625
2.00195误差:
0.00195313
第二种方法(初值求导迭代):
3误差:
1
2.5误差:
0.5
2.375误差:
0.375
2.30469误差:
0.304688
2.25827误差:
0.25827
2.22492误差:
0.224918
2.19962误差:
0.199624
2.1797误差:
0.179699
2.16355误差:
0.163553
2.15018误差:
0.150179
第三种方法(隔步求导迭代):
3误差:
1
2.5误差:
0.5
2.375误差:
0.375
2.1875误差:
0.1875
2.14063误差:
0.140625
2.07031误差:
0.0703125
2.05273误差:
0.0527344
2.02637误差:
0.0263672
2.01978误差:
0.0197754
2.00989误差:
0.0098877
求x*x*x-1=0的根:
Newton迭代法:
2误差:
1
1.41667误差:
0.416667
1.11053误差:
0.110534
1.01064误差:
0.0106368
1.00011误差:
0.000111557
1误差:
1.24432e-008
1误差:
2.22045e-016
第二种方法(初值求导迭代):
2误差:
1
1.74074误差:
0.740741
1.58242误差:
0.582416
1.4727误差:
0.472697
1.39144误差:
0.391436
1.3287误差:
0.328697
1.27886误差:
0.278855
1.23843误差:
0.238428
1.20512误差:
0.205118
1.17733误差:
0.177332
第三种方法(隔步求导迭代):
2误差:
1
1.41667误差:
0.416667
1.26307误差:
0.263069
1.05099误差:
0.0509875
1.01737误差:
0.01737
1.00029误差:
0.000294878
1.00001误差:
9.89921e-006
1误差:
9.79932e-011
1误差:
1.9984e-015
Ⅱ、问题分析
从结果我们可以知道Newton迭代法收敛速度最快,隔一次算一次导数的方法(隔步求导迭代)的收敛速度比Newton迭代法略慢一些,只算一次导数的方法(初值求导迭代)收敛速度最慢,又由于隔一次算一次导数的方法(隔步求导迭代)收敛速度虽然比Newton迭代法差一点,但计算量减少了,所以隔一次算一次导数(隔步求导迭代)的方法也是很可取的。
9.6线性方程组求解的数值试验题1
㈠问题
对从2到9的每一个n值,解n阶方程组Ax=b。
这里A和b如下定义:
aij=1/(i+j-1),bi=p(n+i-1)-p(i-1)
式中,p(x)=1/24*x^2*(2+x^2*(-7+n^2*(14+n*(12+3*n)))),解释发生的现象。
㈡算法
首先用两个for循环实现方程增广矩阵的赋值;再用三个for循环实现高斯消元过程;
然后再用两个for循环实现回代过程,解出n阶方程组的解;最后输出结果。
㈢数据流向图
㈣模块关系图与模块流程图
分析结果
j
㈤符号引用表
标志符
数学符号
类型
个数
入
出
作用
a
double
不定
数组名
b
double
不定
数组名
p
P(x)
double
不定
*
函数名
x
double
不定
存放解
i
double
不定
中间变量
j
double
不定
中间变量
k
double
不定
中间变量
sum
double
不定
中间变量
n
int
不定
方程阶数
㈥分程序
1、实现赋初值
for(i=0;i {for(j=0;j a[i][j]=(double)1/(i+j+1); b[i]=p((double)n+i,n)-p((double)i,n); } 2、实现高斯消元 for(k=0;k { for(i=k+1;i { b[i]=b[i]-(a[i][k]/a[k][k])*b[k]; for(j=k;j a[i][j]=a[i][j]-(a[i][k]/a[k][k])*a[k][j]; } } 3、实现回代过程 doubles=0; x[n-1]=b[n-1]/a[n-1][n-1];//回代过程 for(k=n-2;k>=0;k--) { for(j=k+1;j s=s+a[k][j]*x[j]; x[k]=(b[k]-s)/a[k][k]; } 4、输出解 cout<<"n阶方程组的解: "<<'\n'; for(i=0;i cout<<"x["< ㈦输出结果及问题分析 1、程序输出的结果 n=2 n阶方程组的解: x[1]=-740.25 x[2]=1738.5 n=3 n阶方程组的解: x[1]=-19421.6 x[2]=-26746.5 x[3]=60190 n=4 n阶方程组的解: x[1]=-28639.2 x[2]=-425780 x[3]=-241885 x[4]=650803 n=5 n阶方程组的解: x[1]=681517 x[2]=-982843 x[3]=-3.17889e+006 x[4]=-1.23228e+006 x[5]=3.97304e+006 n=6 n阶方程组的解: x[1]=3.2258e+006 x[2]=4.4299e+006 x[3]=-6.91437e+006 x[4]=-1.49936e+007 x[5]=-4.53719e+006 x[6]=1.71837e+007 n=7 n阶方程组的解: x[1]=2.58087e+006 x[2]=2.52885e+007 x[3]=1.51348e+007 x[4]=-2.99669e+007 x[5]=-5.38151e+007 x[6]=-1.35041e+007 x[7]=5.89271e+007 n=8 n阶方程组的解: x[1]=-1.78113e+007 x[2]=3.38814e+007 x[3]=9.5424e+007 x[4]=4.11571e+007 x[5]=-9.98642e+007 x[6]=-1.60334e+008 x[7]=-3.45467e+007 x[8]=1.70902e+008 n=9 n阶方程组的解: x[1]=-5.60419e+007 x[2]=-6.77917e+007 x[3]=1.3593e+008 x[4]=2.79662e+008 x[5]=9.70766e+007 x[6]=-2,79705e+008 x[7]=-4.16675e+008 x[8]=-7.88834e+007 x[9]=4.36577e+008 2、问题分析 由结果可看出,n=2,n=3及n=4时,求出的解一还比较小,而方程组在4阶以后得到的解就会很大或很小。 产生这种情况的原因可能是方程的系数矩阵是病态的,求出的解偏离真实解较大。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数值 分析 sdp