二分法与线性方程组求解全主元线性方程的直接解法实验分析方案.docx
- 文档编号:14193693
- 上传时间:2023-06-21
- 格式:DOCX
- 页数:22
- 大小:45.10KB
二分法与线性方程组求解全主元线性方程的直接解法实验分析方案.docx
《二分法与线性方程组求解全主元线性方程的直接解法实验分析方案.docx》由会员分享,可在线阅读,更多相关《二分法与线性方程组求解全主元线性方程的直接解法实验分析方案.docx(22页珍藏版)》请在冰点文库上搜索。
二分法与线性方程组求解全主元线性方程的直接解法实验分析方案
数值分析实验报告
—二分法与线性方程组求解
班级:
11级计本二班
组号:
第一组
组长:
狄永锋
组员:
聂嘉俊范中义许君晋
王浩陈广清
时间:
2018年6月13日
实验报告一
题目:
非线性方程求解
摘要:
非线性方程的解读解通常很难给出,因此线性方程的数值解法就尤为重要。
本实验采用最常见的求解方法二分法。
算法说明:
对于二分法,其数学实质就是说对于给定的待求解的方程f(x>,其在[a,b]上连续,f(a>f(b><0,且f(x>在[a,b]内仅有一个实根x*,取区间中点d,若,则d恰为其根,否则根据f(a>f(d><0是否成立判断根在区间[a,d]和[c,b]中的哪一个,从而得出新区间,仍称为[a,b]。
重复运行计算,直至满足精度为止。
这就是二分法的计算思想。
程序设计:
#include
#include
voidfun(doublex1,doublex2,double(*f>(double>>
{
doublex。
intk=0。
while(f(x1>*f(x2>>0>
{
printf("请重新输入:
\n">。
scanf("%f,%f",&x1,&x2>。
}
while(fabs(f(x>>>5e-6>
{
x=(x2+x1>/2。
if(f(x>*f(x1><0>
{
x2=x。
}
else
{
x1=x。
}
k++。
}
printf("%15.14f\n",x>。
printf("%15.14f\n",f(x>>。
printf("%d\n",k>。
}
//例一
doublet(doublex>
{
return(12-3*x+2*cos(x>>。
}
/*//例二:
doublet(doublex>
{
returnsin(x>-x*x/3。
}
//例三
doublet(doublex>
{
return(x*x*x-x-1>。
}
//例四
doublet(doublex>
{
return(x*x-x-1>。
}
//例五
doublet(doublex>
{
returnx*x-3*x-11。
}
*/
intmain(>
{doublex1,x2。
printf("enterx1,x2:
">。
scanf("%lf,%lf",&x1,&x2>。
fun(x1,x2,t>。
return0。
}
实例分析和讨论:
1.用二分法计算方程12-3*x+2*cos(x>=0在[2,4]内的根。
(
下同>
运行结果为:
enterx1,x2:
2,4
3.34740447998047
-0.00000424136941
18
计算结果为
x=3.34740447998047。
f(x>=-0.00000424136941;
k=18;
迭代次数为:
17
由f(x>知结果满足要求。
2.用二分法计算方程
在[1,3]内的根。
运行结果为:
enterx1,x2:
1,3
1.72212219238281
0.00000379219438
17
实际意义为:
x=1.72212219238281;
f(x>=0.00000379219438;
k=17;
由f(x>知结果满足要求。
3..用二分法计算方程
在[1,1.5]内的根。
运行结果为:
enterx1,x2:
1,1.5
1.32471847534180
0.00000220949485
17
计算结果为
x=1.32471847534180;
f(x>=0.00000220949485;
k=17;
由f(x>知结果满足要求。
4..用二分法计算方程x*x-x-1=0在[1,2]内的根。
运行结果为:
enterx1,x2:
1,2
1.61803436279297
0.00000083638588
17
计算结果为
x=1.61803436279297;
f(x>=0.00000083638588;
k=17;
由f(x>知结果满足要求。
5.用二分法计算方程
在[0,3]内的根。
运行结果为:
enterx1,x2:
0,3
2.14004417959595
0.00000171050328
21
实际意义为:
x=2.14004417959595;
f(x>=0.00000171050328;
k=21。
由f(x>知结果满足要求。
结论:
对于二分法,只要能够保证在给定的区间内有根,使能够收敛的,当时收敛的速度和给定的区间有关,二且总体上来说速度比较慢。
实验报告二
题目:
全主元线性方程的直接解法
摘要:
求解线性方程组的方法很多,主要分为直接法和间接法。
本实验运用直接法的Guass消去法,并采用选主元的方法对方程组进行求解。
算法说明:
本次实验是n阶线性代数方程组Ax=b,其中A=(aij>是方程组的系数aij构成的n×n阶矩阵,叫做系数矩阵。
B= 主元素消去法是为控制舍入误差而提出来的一种算法,在Gauss消去法的消元过程中,若出现akk(k>=0,则消元无法进行,即使akk(k>≠0,但很小,把它作为除数,就会导致其他元素量级的巨大增长和舍入误差的扩散,最后使计算结果不可靠,而全主元消去法正式解决这种问题的算法。 抑制舍入误差的增长,通常有两个途径,一是增加参加计算的数字位数,从而使最后结果中积累起来的误差随之减小。 但这样做会使计算的时间增加,我们这里要讲的是另一种途径,在做除法运算时,分母的绝对值越小,舍入误差影响就越大,因此在做除法运算时,要选取绝对值比较大的做分母,这就是主元素消去法的基本思想。 程序设计: #include"stdio.h" #include"math.h" structCx{intn,m。 double*x。 int*p。 }。 template { Td。 intk,i。 for(i=0。 i i++> {d=a[t*m+i]。 a[t*m+i]=a[s*m+i]。 a[s*m+i]=d。 } } template { Td。 intk,i。 for(i=0。 i i++> {d=a[i*m+t]。 a[i*m+t]=a[i*m+s]。 a[i*m+s]=d。 } } voidswapRC(doublea[],doubleb[],intb1[],intn,intk,intt,ints> { LtoL(a,n,n,k,t>。 LtoL(b,n,1,k,t>。 CtoC(a,n,n,k,s>。 LtoL /* inti。 doubled。 for(i=0。 i i++> {d=a[k*n+i]。 a[k*n+i]=a[t*n+i]。 a[t*n+i]=d。 } d=b[k]。 b[k]=b[t]。 b[t]=d。 for(i=0。 i i++> {d=a[i*n+k]。 a[i*n+k]=a[i*n+s]。 a[i*n+s]=d。 } intd1。 d1=b1[k]。 b1[k]=b1[s]。 b1[s]=d1。 */ } voidmaxRC(doublea[],intn,intk,int&t,int&s> { t=k。 s=k。 for(inti=k。 i i++> for(intj=k。 j j++> if(abs(a[t*n+s]> {t=i。 s=j。 } } voidRns(doublea[],doubleb[],intn,inti>//消元i列 { for(intj=i+1。 j j++> { doublem=-a[j*n+i]/a[i*n+i]。 a[j*n+i]=0。 for(intk=i+1。 k k++>a[j*n+k]=a[j*n+k]+a[i*n+k]*m。 b[j]=b[j]+b[i]*m。 } } voidgsT(doublea[],doubleb[],doubley[],intn,intm> { inti,j。 y[m-1]=b[m-1]/a[(m-1>*n+m-1]。 for(i=m-2。 i>=0。 i--> { doubles=0。 for(j=i+1。 j j++> s+=a[i*n+j]*y[j]。 y[i]=(b[i]-s>/a[i*n+i]。 } } double*gsTm(doublea[],doubleb[],intn,intm> { inti,k。 double*x=newdouble[n*(n-m+1>],*b1=newdouble[m],*y=newdouble[m]。 for(i=m。 i i++>x[i]=0。 gsT(a,b,y,n,m>。 for(k=0。 k k++>x[k*(n-m+1>]=y[k]。 for(i=m。 i i++> { x[i*(n-m+1>+i-m+1]=1。 for(k=0。 k k++>b1[k]=-a[k*n+i]。 gsT(a,b1,y,n,m>。 for(k=0。 k k++>x[k*(n-m+1>+i-m+1]=y[k]。 } delete[]y。 delete[]b1。 returnx。 } voidPtoP(doublex[],intp[],intn,intm> { inti,j。 for(i=0。 i i++> { if(p[i]! =i> { LtoL LtoL } } } CxgaAll(doublea[],doubleb[],intn>//解Ax=b,n元 { double*x=NULL。 int*p=newint[n]。 intm=n,i,j,t,s。 Cxcx={n,n-m+1,NULL,p}。 for(i=0。 i i++>p[i]=i。 for(i=0。 i i++> {maxRC(a,n,i,t,s>。 ///* if(a[t*n+s]==0> {m=i。 for(j=m。 j j++>if(b[j]! =0>returncx。 break。 } else {swapRC(a,b,p,n,i,t,s>。 Rns(a,b,n,i>。 } //*/ } cx.m=n-m+1。 cx.x=gsTm(a,b,n,m>。 PtoP(cx.x,cx.p,n,n-m+1>。 returncx。 } voidprint(doublea[],doubleb[],intn> { inti,j。 for(i=0。 i i++>{ for(j=0。 j j++>printf("%-15.6f",a[i*n+j]>。 printf("%-15.6f\n",b[i]>。 } printf("\n">。 } voidprintx(Cxcx> { inti,j。 if(cx.x==NULL>return。 for(i=0。 i i++> { printf("%-3d: ",cx.p[i]>。 for(j=0。 j j++> printf("%15.6f",cx.x[i*cx.m+j]>。 printf("\n">。 } } voidtest(doublea[],doubleb[],Cxcx> { inti,j。 for(i=0。 i i++> { doubles=0。 for(j=0。 j j++> s+=a[i*cx.n+j]*cx.x[j*cx.n]。 printf("%f",b[i]-s>。 } } voidcopyAb(doublea[],doubleb[],intn,doublea1[],doubleb1[]> { for(inti=0。 i i++>{ for(intj=0。 j j++> a1[i*n+j]=a[i*n+j]。 b1[i]=b[i]。 } } voidmain(> { inti,j。 doublea[]={1,1,1,2,2,2,2,4,3,3,3,6,1,1,1,2},b[]={1,2,3,1}。 print(a,b,4>。 Cxcx=gaAll(a,b,4>。 print(a,b,4>。 printx(cx>。 getchar(>。 } 实例分析和讨论: 例1、求解方程: = 运行结果为: 24.00000046.00000062.000000 83.00000019.00000038.000000 24.00000046.00000062.000000 83.00000019.00000038.000000 0: -1.250000 1: 2.000000 计算结果为: =-1.250000, =2.000000。 验证: 数据代入原方程结果满足要求 例2、求解方程 运行结果为: 3.000000-1.0000004.0000007.000000 -1.0000002.000000-2.000000-1.000000 4.000000-3.0000001.0000000.000000 3.000000-1.0000004.0000007.000000 -1.0000002.000000-2.000000-1.000000 4.000000-3.0000001.0000000.000000 0: 2.166667 1: -0.500000 2: 0.000000 计算结果为: =2.166667 =-0.500000 =0.000000 验证: 数据代入原方程结果满足要求 例3、求解方程: = 运行结果为: 2.0000005.0000008.0000003.0000001.0000002.000000 4.0000006.0000008.0000009.0000003.0000004.000000 4.0000003.0000001.0000005.0000002.0000006.000000 0.0000002.0000000.0000001.0000002.0000005.000000 0.0000000.0000000.0000000.0000001.0000000.000000 2.0000005.0000008.0000003.0000001.0000002.000000 4.0000006.0000008.0000009.0000003.0000004.000000 4.0000003.0000001.0000005.0000002.0000006.000000 0.0000002.0000000.0000001.0000002.0000005.000000 0.0000000.0000000.0000000.0000001.0000000.000000 0: 23.250000 1: 18.500000 2: -19.000000 3: 5.000000 4: 0.000000 计算结果为: =23.250000, =18.500000, =-19.000000, =5.000000, =0.000000 验证: 数据代入原方程结果满足要求 例4、求解方程 = 运行结果为: 1.0000001.0000001.0000002.0000002.0000001.000000 2.0000002.0000004.0000003.0000003.0000002.000000 3.0000006.0000001.0000001.0000001.0000003.000000 2.0000003.0000004.0000006.0000003.0000001.000000 2.0000003.0000004.0000005.0000006.0000006.000000 1.0000001.0000001.0000002.0000002.0000001.000000 2.0000002.0000004.0000003.0000003.0000002.000000 3.0000006.0000001.0000001.0000001.0000003.000000 2.0000003.0000004.0000006.0000003.0000001.000000 2.0000003.0000004.0000005.0000006.0000006.000000 0: 2.000000 1: -4.666667 2: 2.333333 3: -0.333333 4: 1.000000 计算结果为: =2.000000, =-4.666667, =2.333333, =-0.333333, =1.000000 验证: 数据代入原方程结果满足要求 例5、求解方程: = 。 其中ε=8。 运行结果为: 8.0000009.0000003.0000006.0000002.0000007.0000001.0000006.0000008.00000010.0000003.000000 1.0000002.0000005.0000009.00000013.0000004.0000006.00000012.00000027.0000006.0000002.000000 7.00000021.0000002.0000005.0000009.0000001.0000003.0000005.0000004.0000001.0000009.000000 6.00000018.0000002.0000007.0000006.0000003.0000001.0000007.0000002.0000008.0000007.000000 1.00000019.00000010.00000023.0000007.0000006.0000001.0000001.0000000.0000001.0000006.000000 1.0000007.0000007.0000004.0000002.0000007.0000008.0000003.0000005.0000002.0000005.000000 0.0000003.0000009.0000003.0000008.0000006.0000005.0000003.0000005.0000001.0000007.000000 3.0000005.0000001.0000000.0000003.0000004.0000003.0000006.0000003.0000005.0000004.000000 4.0000004.0000008.0000009.0000007.0000009.0000001.0000003.0000002.0000001.0000009.000000 7.0000002.00000010.0000008.0000001.0000006.0000007.0000000.0000009.0000007.0000001.000000 8.0000009.0000003.0000006.0000002.0000007.0000001.0000006.0000008.00000010.0000003.000000 1.0000002.0000005.0000009.00000013.0000004.0000006.00000012.00000027.0000006.0000002.000000 7.00000021.0000002.0000005.0000009.0000001.0000003.0000005.0000004.0000001.0000009.000000 6.00000018.0000002.0000007.0000006.0000003.0000001.0000007.0000002.0000008.0000007.000000 1.00000019.00000010.00000023.0000007.0000006.0000001.0000001.0000000.0000001.0000006.000000 1.0000007.0000007.0000004.0000002.0000007.0000008.0000003.0000005.0000002.0000005.000000 0.0000003.0000009.0000003.0000008.0000006.0000005.0000003.0000005.0000001.0000007.000000 3.0000005.0000001.0000000.0000003.0000004.0000003.0000006.0000003.0000005.0000004.000000 4.0000004.0000008.0000009.0000007.0000009.0000001.0000003.0000002.0000001.0000009.000000 7.0000002.00000010.0000008.0000001.0000006.0000007.0000000.0000009.00000
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二分法 线性方程组 求解 全主元 线性方程 直接 解法 实验 分析 方案