计算方法第二章作业答案参考
习题二
1. 用二分法求方程0134
=+-x x 在区间【0.3,0.4】内的根,要求误差不超过
2102
1
-?。
#include
#define f(x) (x)*(x)*(x)*(x)-3*(x)+1 main() { double mid=0,x1=0.3,x2=0.4; while(1) {mid=(x1+x2)/2; if(f(mid)<0) {x2=mid;printf("x1=%10f,x2=%10f\n",x1,x2);} else if(f(mid)>0) {x1=mid;printf("x1=%10f,x2=%10f\n",x1,x2);} else break;} printf("因此,x=%f\n",mid); }
3.方程012
3=--x x 在1.5附近有根,把方程写成4种不同的等价形式,并建立相应的迭代公式。
(1)2
31x x +=,32
11n n x x +=+
#include
#define f(x) pow(1+(x)*(x),1.0/3) main() { float x1=1.3; int i; for(i=0;i<20;i++) { x1=f(x1); printf("%10f",x1); } printf("\n 因此,x=%f\n",x1); }
(2)211x x +
=,=+1n x 2
1
1n
x + #include
#include
#define f(x) 1+1.0/(x*x) main() {
float x1=1.3; int i;
for(i=0;i<20;i++) { x1=f(x1); printf("%10f",x1); }
printf("\n 因此,x=%f\n",x1);
}
(3)1
1
2
-=
x x ,=+1n x 1
1-n x
#include
#define f(x) pow(x-1,-1*1.0/2) main() { float x1=1.3; int i; for(i=0;i<20;i++) { x1=f(x1); printf("%10f",x1); } printf("\n 因此,x=%f\n",x1); }
(4)13
2
-=x x ,=
+1n x 13-n x
#include
#define f(x) pow((x)*(x)*(x)-1,1.0/2) main() { float x1=1.3; int i; for(i=0;i<20;i++) { x1=f(x1); printf("%10f",x1); } printf("\n 因此,x=%f\n",x1); }
4.用迭代法求02.05
=--x x 的正根,要求准确到小数点后第5位 解:
迭
代
公
式
:
512
.0+=+x x n
#inc
lude
#define f(x) pow((x)+0.2,1.0/5) main() { float x1=4.0; int i; for(i=0;i<20;i++) { x1=f(x1); printf("%10f",x1); } printf("\n 因此,x=%.5f\n",x1); }
7.用迭代-加速公式求方程x
e
x -=在x=0.5附近的根,要求准确到小数点后第4位
解:迭代公式:
x
n e x -+=1,
n
n x q
q x q x ---=
+1111
#in
clude
#include
float x1=1.0,a=0,q=-1*exp(-1*0.5); int i;
for(i=0;i<20;i++) { a=x1; x1=f(x1); x1=1.0/(1.0-q)*(x1)-q/(1.0-q)*(a); printf("%10f",x1); }
printf("\n 因此,x=%.4f\n",x1); }
8用埃特金加速法求方程13
-=x x 在区间【1,1.5】内的根,要求准确到小数点后第4位 解
:
迭
代
公式:
1
31-=+x x n ,
1
3
12-=++n n x x ,
n
n n n n n n x x x x x x x +--=
++-++122
1
21
2#in
clude
#define f(x) (x)*(x)*(x)-1 main() { float x1=1.5,a=0,b=0; int i; for(i=0;i<20;i++) { b=x1; a=f(x1);
x1=f(a); x1=(x1*b-a*a)/(x1-2*a+b); printf("%10f",x1); }
printf("\n 因此,x=%.4f\n",x1);
}
9.用牛顿法求方程0133
=--x x 在20=x 附近的根,要求准确到小数点后第3位 解
:
迭代公式:
3
3132
31
----=+n n n n n x x x x x
#inc
lude
#include
#define f(x) (x)*(x)*(x)-3*(x)-1 #define f1(x) 3*(x)*(x)-3 main() {
float x1=2.2,a=0,b=0; int i;
for(i=0;i<20;i++) { a=f(x1); b=f1(x1); x1=x1-a/b; printf("%10f",x1); }
printf("\n 因此,x=%.3f\n",x1);
}
11.分别用单点和双点弦截法求方程013
=--x x 在【1,1.5】内的根,要求
51102
1
||-+?≤
-n n x x 解
:
单
点
:
)111()
111()1(1
13
1---------
=+n n n n x x x x
#incl
ude
#include
#define f(x) (x)*(x)*(x)-(x)-1
main()
{
float x1=1.5,a=0,b=0,c=0;
int i;
for(i=0;;i++)
{
c=x1;
a=f(1);
b=f(x1);
x1=1-(x1-1)/(b-a)*a;
printf("%10f",x1);
if(fabs(x1-c)<=0.000005) break;
}
printf("\n因此,x=%f\n",x1);
}
双点:)1()
1()1(3
13
1311---------
=---+n n n n n n n n n n x x x x x x x x x x #include
#define f(x) (x)*(x)*(x)-(x)-1 main() { float x1=1,x2=1.5,a=0,b=0,c=0; int i; for(i=0;;i++) { c=x1; a=f(x2); b=f(x1); x1=x1-(x1-x2)/(b-a)*b; printf("%10f",x1); if(fabs(x1-c)<=0.000005) break; } printf("\n 因此,x=%f\n",x1); }