上机练习1.docx
《上机练习1.docx》由会员分享,可在线阅读,更多相关《上机练习1.docx(15页珍藏版)》请在冰点文库上搜索。
上机练习1
班级:
数学三班
姓名:
齐照辉
学号:
20111001316
练习:
1.1用差商
求
在
处导数的近似值.取
,
,
=0.000000000000001和
=0.0000000000000001分别用MATLAB软件计算,取十五位数字计算.
解:
当h=0.1时:
>>formatlongg
>>a=3;h=0.1;y=log(a+h)-log(a);yx=y/h
yx=
0.32789822822991
当h=0.0001时:
>>formatlongg
>>a=3;h=0.0001;y=log(a+h)-log(a);yx=y/h
yx=
0.333327777903847
当h=0.0000000000000001时:
>>formatlongg
>>a=3;h=0.0000000000000001;y=log(a+h)-log(a);yx=y/h
yx=
0
练习1.2设计三种算法求方程
在
的一个正根
的近似值,并研究每种算法的误差传播情况.
解:
第一种算法:
将已知方程化为通解方程:
x=15-2x^2.取初值x0=2,按叠代公式Xk+1=15-2xk^2.
第二种算法:
将已知方程化为同解方程:
第三种算法:
将已知方程化为通解方程:
X=
Matab主程序:
function[k,juecha,xiangcha,xk]=liti112(x0,x1,limax)
x
(1)=x0;
fori=1:
limax
x(i+1)=fl(x(i));
juecha=abs(x(i)-x1);
xiangcha=juecha/(abs(x(i))+eps);
xk=x(i);k=i-1;[(i-1),juecha,xiangcha,xk]
end
第一问:
[k,juecha,xiangcha,xk]=liti112(2,2.5,100)
Y1=15-2*x^2
第二问:
functiony1=f1(x)
y1=15/(2*x+1);
第三问:
[k,juecha,xiangcha,xk]=liti112(2,2.5,100)
Y1=x-(2*x^2+x-15)/(4*x+1)
结果:
迭代次数算法1算法2算法3
022.000000002.00000000
173.000000002.55555556
2-832.142857142.50055006
3-137632.837837842.50000000
4-3788403232.246963562.500000000
……………………………………………………………………………………….
99-inf2.500000012.500000000
分析:
由表格知,算法一不收敛,算法二的初始绝对误差和相对误差分别是0.0500000000和0.166666667,它的相对误差和绝对误差是收敛的随着迭代次数增大,误差逐步趋近于零,而叠代结果趋近于2.500000000,第三种算法,绝对误差和相对误差是稳定的,结果也很快的趋近精确解2.5
练习1.3求数
的近似值.
解:
>>formatlong
>>7^15*8^(-19)/(sqrt(1+8^(-19))+1)
得到结果:
ans=
1.647141280988404e-005
练习2.1确定方程x3-x+4=0的实根的分布情况,并用二分法求在开区间(-2,-1)内的实根的近似值,要求精度为0.001.
解:
(1)确定方程实根的分布情况:
在命令窗口输入:
>>symsx
>>y=solve('x^3-x+4=0')
>>eval(y)
得到:
ans=
-1.79632190325944
-22.93525496046493
24.73157686372437
(2)利用二分法求在开区间(-2,-1)内的实根的近似值:
在命令窗口输入:
>>funhan=@(x)x^3-x+4
a=-2;
b=-1;
eps=1.0e-3;
M=1000;
[c,n]=erfenfa(funhan,a,b,eps,M)
%c是根
得到结果:
funhan=
@(x)x^3-x+4
c=
-1.79589843750000
n=
10
练习2.2用迭代法求方程求x5-3x+1=0在0.3附近的根,精确到4位小数.
解:
1.创建名为diedail2.m的M文件:
function[k,piancha,xdpiancha,xk,yk]=diedail2(x0,tol,ddmax)
x
(1)=x0;
fori=1:
ddmax
x(i+1)=fun(x(i));piancha=abs(x(i+1)-x(i));
xdpiancha=piancha/(abs(x(i+1))+eps);i=i+1;
xk=x(i);yk=fun(x(i));[(i-1)pianchaxdpianchaxkyk]
if(pianchak=i-1;xk=x(i);
return;
end
end
ifi>ddmax
disp('迭代次数超过给定的最大值ddmax')
k=i-1;xk=x(i);yk=fun(x(i));[(i-1)pianchaxdpianchaxkyk]
return;
end
p=[(i-1),piancha,xdpiancha,xk,yk];
2.创建M文件fun.m
functiony=fun(x)
y=(x^5+1)/3;
3.在MATLAB工作窗口输入程序
>>[k,piancha,xdpiancha,xk,yk]=diedail2(0.3,1.0e-4,500)
4.运行后输出的结果
[k,piancha,xdpiancha,xk,yk]=diedail2(0.3,1.0e-4,500)
ans=
1.00000.03410.10220.33410.3347
ans=
2.00000.00060.00170.33470.3347
ans=
3.00000.00000.00000.33470.3347
k=
3
piancha=
1.2061e-005
xdpiancha=
3.6031e-005
xk=
0.3347
yk=
0.3347
练习2.3用艾特肯加速方法求2e
在0.85附近的一个近似根,要求精度
..
解:
1.创建M文件Aitken.m:
function[k,xk,yk,p]=Aitken(x0,tol,ddmax)
x
(1)=x0;
fori=1:
ddmax
x1(i+1)=fun(x(i));
x2(i+1)=fun(x1(i+1));
x(i+1)=x2(i+1)-(x2(i+1)-x1(i+1))^2/(x2(i+1)-2*x1(i+1)+x(i));
piancha=abs(x(i+1)-x(i));
xdpiancha=piancha/(abs(x(i+1)+eps));
i=i+1;xk=x(i);yk=fun(x(i));
if(pianchak=i-1;xk=x(i);yk=fun(x(i));m=[0,1:
i-1];
p=[m',x1',x2',x'];
return;
end
end
ifi>ddmax
disp('迭代次数超过给定的最大值ddmax')
k=i-1;xk=x(i);yk=fun(x(i));m=[0,1:
i-1];p=[m',x1',x2',x']
return;
end
m=[0,1:
i-1];p=[m',x1',x2',x'];
2.创建M文件fun.m
functiony=fun(x)
x1=exp
(1);y=2*x1^(-x);
3.
3.在MATLAB工作窗口输入程序
>>[k,xk,yk,p]=Aitken(0.85,1e-6,100)
4.运行后得到结果
k=
3
xk=
0.8526
yk=
0.8526
p=
0000.8500
1.00000.85480.85070.8526
2.00000.85260.85260.8526
3.00000.85260.85260.8526
练习2.4分别用牛顿法、割线法求方程
在
的近似根,要求精度
.
解:
牛顿法:
1.创建牛顿法的MATLAB程序为M文件newtonqx.m
function[k,xk,yk,piancha,xdpiancha]=newtonqx(x0,tol,ftol,gxmax)
x
(1)=x0;
fori=1:
gxmax
x(i+1)=x(i)-fnq(x(i))/(dfnq(x(i))+eps);piancha=abs(x(i+1)-x(i));
xdpiancha=piancha/abs(x(i+1)+eps);i=i+1;
xk=x(i);
yk=fnq(x(i));[(i-1)xkykpianchaxdpiancha]
if(abs(yk)k=i-1;xk=x(i);[(i-1)xkykpianchaxdpiancha];
return;
end
end
ifi>gxmax
disp('请注意:
迭代次数超过给定的最大值gxmax.')
return;
end
[(i-1),xk,yk,pianchaxdpiancha]';
2.创建fnq.m的M文件
functiony=fnq(x)
y=2*x^3-3*x^2+1;
3.创建dfnq.m文件
functiony=dfnq(x)
y=6*x^2-6*x;
4.在工作窗口输入程序:
>>[k,xk,piancha,xdpiancha]=newtonqx(-0.4,0.001,0.001,100)
得到结果:
ans=
1.0000-0.5167-0.07670.11670.2258
ans=
2.0000-0.5004-0.00160.01630.0326
ans=
3.0000-0.5000-0.00000.00040.0007
k=
3
xk=
-0.5000
piancha=
-7.7025e-007
xdpiancha=
3.5825e-004
5.在工作窗口输入程序:
>>[k,xk,piancha,xdpiancha]=newtonqx(0.9,0.001,0.001,100)
6.得到结果:
ans=
1.00000.95190.00670.05190.0545
ans=
2.00000.97630.00170.02450.0251
ans=
3.00000.98830.00040.01190.0121
ans=
4.00000.99420.00010.00590.0059
ans=
5.00000.99710.00000.00290.0029
ans=
6.00000.99850.00000.00150.0015
ans=
7.00000.99930.00000.00070.0007
k=
7
xk=
0.9993
piancha=
1.5903e-006
xdpiancha=
7.2896e-004
割线法
1.编写名为gexian.m的M文件:
function[k,piancha,xdpiancha,xk,yk]=gexian(x01,x02,tol,ftol,gxmax)
x
(1)=x01;x
(2)=x02;
fori=2:
gxmax
u(i)=fnq(x(i))*(x(i)-x(i-1));v(i)=fnq(x(i))-fnq(x(i-1));
x(i+1)=x(i)-u(i)/(v(i));piancha=abs(x(i+1)-x(i));
xdpiancha=piancha/(abs(x(i+1)+eps));i=i+1;xk=x(i);
yk=fnq(x(i));[(i-2)pianchaxdpianchaxkyk]
if(abs(yk)k=i-2;xk=x(i);yk=fnq(x(i));[(i-2)pianchaxdpianchaxkyk];
return;
end
end
ifi>gxmax
disp('请注意:
迭代次数超过给定的最大值gxmax.')
k=i-2;xk=x(i);yk=fnq(x(i));[(i-2)pianchaxdpianchaxkyk];
return;
end
2.在命令窗口输入程序:
>>[k,piancha,xdpiancha,xk,yk]=gexian(-0.5,-0.3,1e-3,0.001,100)
3.得到结果:
ans=
1.00000.20000.4000-0.50000
ans=
2.000000-0.50000
k=
2
piancha=
0
xdpiancha=
0
xk=
-0.5000
yk=
0
4.在命令窗口输入程序:
>>[k,piancha,xdpiancha,xk,yk]=gexian(0.8,1.0,0.001,0.001,100)
5.得到结果:
ans=
10010
k=
1
piancha=
0
xdpiancha=
0
xk=
1
yk=
0