二分法简单迭代法的matlab代码实现.docx
《二分法简单迭代法的matlab代码实现.docx》由会员分享,可在线阅读,更多相关《二分法简单迭代法的matlab代码实现.docx(16页珍藏版)》请在冰豆网上搜索。
![二分法简单迭代法的matlab代码实现.docx](https://file1.bdocx.com/fileroot1/2023-1/3/ea537d89-0547-4f5a-ab78-e44a0c671797/ea537d89-0547-4f5a-ab78-e44a0c6717971.gif)
二分法简单迭代法的matlab代码实现
实验一非线性方程的数值解法
(一)
信息与计算科学金融崔振威201002034031
一、实验目的:
熟悉二分法和简单迭代法的算法实现。
二、实验内容:
教材P402.1.5
三、实验要求
1根据实验内容编写二分法和简单迭代法的算法实现
2简单比较分析两种算法的误差
3试构造不同的迭代格式,分析比较其收敛性
(一)、二分法程序:
functionef=bisect(fx,xa,xb,n,delta)
%fx是由方程转化的关于x的函数,有fx=0。
%xa解区间上限
%xb解区间下限
%n最多循环步数,防止死循环。
%delta为允许误差
x=xa;fa=eval(fx);
x=xb;fb=eval(fx);
disp('[nxaxbxcfc]');
fori=1:
n
xc=(xa+xb)/2;x=xc;fc=eval(fx);
X=[i,xa,xb,xc,fc];
disp(X),
iffc*fa<0
xb=xc;
elsexa=xc;
end
if(xb-xa)end
(二)、简单迭代法程序:
function[x0,k]=iterate(f,x0,eps,N)
ifnargin<4
N=500;
end
ifnargin<3
ep=1e-12;
end
x=x0;
x0=x+2*eps;
k=0;
whileabs(x-xO)>eps&kx=feval(f,xO);
k=k+1;
endx0=x;
ifk==N
end
解:
a、g(x)=x5-3x3-2x2+2二分法求方程:
(1)、在matlab的命令窗口中输入命令:
>>fplot('[xA5-3*xA3-2*xA2+2]',[-3,3]);grid
得下图:
由上图可得知:
方程在[-3,3]区间有根。
(2)、二分法输出结果
>>f='xA5-3*xA3-2*xA2+2'f=
xA5-3*xA3-2*xA2+2>>bisect(f,-3,3,20,10A(-12))
2.0000-3.0000
3.0000
-3.0000
-1.5000
-2.2500
-31.6182
4.0000
-2.2500
-1.5000
-1.8750
-8.4301
5.0000
-1.8750
-1.5000
-1.6875
-2.9632
6.0000
-1.6875
-1.5000
-1.5938
-1.2181
7.0000
-1.5938
-1.5000
-1.5469
-0.5382
8.0000
-1.5469
-1.5000
-1.5234
-0.2405
9.0000
-1.5234
-1.5000
-1.5117
-0.1015
10.0000
-1.5117
-1.5000
-1.5059
-0.0343
11.0000
-1.5059
-1.5000
-1.5029
-0.0014
12.0000
-1.5029
-1.5000
-1.5015
0.0150
13.0000
-1.5029
-1.5015
-1.5022
0.0068
14.0000
-1.5029
-1.5022
-1.5026
0.0027
15.0000
-1.5029
-1.5026
-1.5027
0.0007
16.0000
-1.5029
-1.5027
-1.5028
-0.0003
17.0000
-1.5028
-1.5027
-1.5028
0.0002
18.0000
-1.5028
-1.5028
-1.5028
-0.0001
19.0000
-1.5028
-1.5028
-1.5028
0.0001
20.0000
-1.5028
-1.5028
-1.5028
-0.0000
2、迭代法求方程:
迭代法输出结果:
>>f=inline('xA5-3*xA3-2*xA2+2');
>>[xO,k]=iterate(fun1,2)x0=
2
k=
1
>>[xO,k]=iterate(fun1,1.5)x0=
NaN
k=
6
>>[xO,k]=iterate(fun1,2.5)x0=
NaNk=
5
(3)、误差分析:
由二分法和迭代法输出结果可知,通过定点迭代法得出方程的解误差比二
分法大,而利用二分法求出的结果中,可以清楚看出方程等于零时的解,其误差比迭代法小。
b、g(x)=cos(sin(x))
二分法求方程:
(1)、在matlab的命令窗口中输入命令:
>>fplot('[cos(sin(x))]',[-4,4]);grid
得下图:
由上图可得知:
方程在[-4,4]区间无根。
(2)、二分法输出结果
>>f='cos(sin(x))'
f=
cos(sin(x))
>>bisect(f,-4,4,20,10A(-12))
2.0000
0
4.0000
2.0000
0.6143
3.0000
2.0000
4.0000
3.0000
0.9901
4.0000
3.0000
4.0000
3.5000
0.9391
5.0000
3.5000
4.0000
3.7500
0.8411
6.0000
3.7500
4.0000
3.8750
0.7842
7.0000
3.8750
4.0000
3.9375
0.7554
8.0000
3.9375
4.0000
3.9688
0.7412
9.0000
3.9688
4.0000
3.9844
0.7341
10.0000
3.9844
4.0000
3.9922
0.7305
11.0000
3.9922
4.0000
3.9961
0.7288
12.0000
3.9961
4.0000
3.9980
0.7279
13.0000
3.9980
4.0000
3.9990
0.7275
14.0000
3.9990
4.0000
3.9995
0.7273
15.0000
3.9995
4.0000
3.9998
0.7271
16.0000
3.9998
4.0000
3.9999
0.7271
17.0000
3.9999
4.0000
3.9999
0.7271
18.0000
3.9999
4.0000
4.0000
0.7270
19.0000
4.0000
4.0000
4.0000
0.7270
20.0000
4.0000
4.0000
4.0000
0.7270
2、迭代法求方程:
迭代法输出结果:
>>f=inline('cos(sin(x))');
>>[x0,k]=iterate(f,0.5)
x0=
0.7682
k=
15
>>[xO,k]=iterate(f,1)
x0=
0.7682
k=
15
>>[x0,k]=iterate(f,1.5)
x0=
0.7682
k=
16
>>[x0,k]=iterate(f,2)
x0=
0.7682
k=
15
>>[x0,k]=iterate(f,2.5)
x0=
0.7682
k=
14
(3)、由于该方程无解,所以无法比较误差。
2
c、g(x)=x-sin(x+0.15)
二分法求方程:
(1)、在matlab的命令窗口中输入命令:
>>fplotCQ-sin(x+0.15)]',[-10,10]);grid得下图:
-10-B*64-20246810
由上图可得知:
方程在[-3,3]区间有根。
(2)、二分法输出结果
>>f='xA2-sin(x+0.15)'
f=
xA2-sin(x+0.15)
>>bisect(f,-3,3,30,10A(-12))
1.0000
-3.0000
3.0000
0
-0.1494
2.0000
-3.0000
0
-1.5000
3.2257
3.0000
-1.5000
0
-0.7500
1.1271
4.0000
-0.7500
0
-0.3750
0.3637
5.0000
-0.3750
0
-0.1875
0.0726
6.0000
-0.1875
0
-0.0938
-0.0474
7.0000
-0.1875
-0.0938
-0.1406
0.0104
8.0000
-0.1406
-0.0938
-0.1172
-0.0191
9.0000
-0.1406
-0.1172
-0.1289
-0.0045
10.0000
-0.1406
-0.1289
-0.1348
0.0029
11.0000
-0.1348
-0.1289
-0.1318
-0.0008
12.0000
-0.1348
-0.1318
-0.1333
0.0011
13.0000
-0.1333
-0.1318
-0.1326
0.0001
14.0000
-0.1326
-0.1318
-0.1322
-0.0003
15.0000
-0.1326
-0.1322
-0.1324
-0.0001
16.0000
-0.1326
-0.1324
-0.1325
0.0000
17.0000
-0.1325
-0.1324
-0.1324
-0.0000
18.0000
-0.1325
-0.1324
-0.1325
-0.0000
19.0000
-0.1325
-0.1325
-0.1325
0.0000
20.0000
-0.1325
-0.1325
-0.1325
0.0000
21.0000
-0.1325
-0.1325
-0.1325
0.0000
22.0000
-0.1325
-0.1325
-0.1325
0.0000
23.0000
-0.1325
-0.1325
-0.1325
-0.0000
24.0000
-0.1325
-0.1325
-0.1325
0.0000
25.0000
-0.1325
-0.1325
-0.1325
-0.0000
26.0000
-0.1325
-0.1325
-0.1325
0.0000
27.0000
-0.1325
-0.1325
-0.1325
0.0000
28.0000
-0.1325
-0.1325
-0.1325
0.0000
29.0000
-0.1325
-0.1325
-0.1325
0.0000
30.0000
-0.1325
-0.1325
-0.1325
-0.0000
2、迭代法求方程:
迭代法输出结果:
>>f=inline('xA2-sin(x+0.15)');
>>[x0,k]=iterate(f,1.96)
x0=
NaN
k=
12
>>[x0,k]=iterate(f,0,2)x0=
-0.1494
k=
1
>>[x0,k]=iterate(f,0.2)x0=
0.3234
k=
500
>>[x0,k]=iterate(f,0.3)x0=
0.3234
k=
>>[xO,k]=iterate(f,O.OO1)x0=
0.3234k=
500
(3)、误差分析:
由二分法和迭代法输出结果可知,利用二分法求出的结果中,可以清楚
看出方程等于零时的解,其误差比迭代法小。
x-cos(x)
d、g(x)=x
二分法求方程:
(1)、在matlab的命令窗口中输入命令:
>>fplot('[xA(x-cos(x))]',[-1,1]);grid
得下图:
12
10
8
6
4
2
0
-2
-1OB-0.614-0.200.2040.61
由上图可得知:
方程在[-1,1]区间有根。
(2)、二分法输出结果
>>f='x人(x-cos(x))'
xA(x-cos(x))
>>bisect(f,-0.1,0.1,20,10A(-12))
0Inf
1.0000-0.10000.1000
2.0000
-22.8740+3.5309i
3.0000
-43.6821+3.3947i
4.0000
-84.4110+3.2958i
1.0e+002*
0.0500
-1.6511+0.0323i
1.0e+002*
0.0600
-3.2580+0.0319i
1.0e+002*
0.0700
-6.4648+0.0317i
1.0e+003*
0.0080
-1.2872+0.0032i
1.0e+003*
0.0090
-2.5679+0.0032i
1.0e+003*
0.0100
-5.1285+0.0031i
1.0e+004*
0.0011
-1.0249+0.0003i
1.0e+004*
0.0012
-2.0490+0.0003i
1.0e+004*
0.0013
-4.0971+0.0003i
1.0e+004*
0.0014
-8.1931+0.0003i
1.0e+005*
0.0001
-1.6385+0.0000i
1.0e+005*
0.0002
-3.2769+0.0000i
-0.1000
-0.0500
-0.0250
-0.0001
-0.0001
-0.0000
-0.0000
-0.0000
-0.0000
-0.0000
-0.0000
-0.0000
-0.0000
-0.0000
-0.0000
-0.0500
-0.0250
-0.0125
-0.0001
-0.0000
-0.0000
-0.0000
-0.0000
-0.0000
-0.0000
-0.0000
-0.0000
-0.0000
-0.0000
-0.0000
1.0e+005*
0
-0.0000
0.0002
-0.0000
-6.5537+0.0000i
1.0e+006*
0.0000
-0.0000
0
-0.0000
-1.3107+0.0000i
1.0e+006*
0.0000
-0.0000
0
-0.0000
-2.6215+0.0000i
1.0e+006*
0.0000
-0.0000
0
-0.0000
-5.2429+O.OOOOi
2、迭代法求方程:
迭代法输出结果:
>>f=inline('xA2-sin(x+0.15)');
x0=
0.3234
k=
500
>>[x0,k]=iterate(f,0.01)
x0=
0.3234
k=
500
>>[x0,k]=iterate(f,0.81)
x0=
0.3234
k=
500
>>[x0,k]=iterate(f,0.61)
x0=
0.3234
k=
500
(3)、误差分析:
由二分法和迭代法输出结果可知,利用二分法求出的结果中,可以清楚看
出方程等于零时的解,其误差比迭代法小。