matlab数值分析程序--高等数学,数值代数的matlab实现-文字版, matlab电子书, 和matlab 有关的电子书:

2.6.6 牛顿切线法的加速及其两种MATLAB程序

2.6.6  牛顿切线法的加速及其两种MATLAB程序

(一) 已知方程根的重数

已知方程根的重数,求重根的修正牛顿切线法的MATLAB主程序

现提供名为newtonxz.m的M文件:

function [k,piancha,xdpiancha,xk,yk]=newtonxz(m,x0,tol,ftol,gxmax)

x(1)=x0;

for i=1: gxmax

x(i+1)=x(i)-m*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) piancha xdpiancha xk yk];

  if ((piancha<tol)|(xdpiancha< tol))&(abs(yk)<ftol)

        k=i-1;   xk=x(i); yk=fnq(x(i));

[(i-1) piancha xdpiancha xk yk];

       return;

end

end

 if i>gxmax

    disp('请注意:迭代次数超过给定的最大值gxmax.')

    k=i-1;   xk=x(i); yk=fnq(x(i));

[(i-1) piancha xdpiancha xk yk];

return;

end

例2.6.7  判断是方程e的几重根?在区间上,分别用牛顿切线法和求重根的修正牛顿切线公式求此根的近似值,使精确到.

解  经判断知,是方程的三重根.在MATLAB工作窗口输入程序

>> [k,piancha,xdpiancha,xk,yk]= newtonqx (0.5,1e-4, 1e-4,100)

运行后整理结果列入表 2-20.

表 2-20

k

piancha

xdpiancha

xk

yk

1

0.144 10

0.404 89

0.355 90

0.541 98

2

0.107 41

0.432 25

0.248 49

0.168 20

3

0.077 45

0.452 80

0.171 04

0.051 46

4

0.054 50

0.467 60

0.116 55

0.015 58

5

0.037 69

0.477 98

0.078 85

0.004 69

6

0.025 76

0.485 14

0.053 10

0.001 40

7

0.017 46

0.490 01

0.035 63

0.000 42

8

0.011 77

0.493 30

0.023 86

0.000 12

9

0.007 91

0.495 52

0.015 96

0.000 04

10

0.005 30

0.497 00

0.010 66

0.000 01

11

0.003 54

0.498 00

0.007 12

0.000 00

12

0.002 37

0.498 67

0.004 75

0.000 00

13

0.001 58

0.499 11

0.003 17

0.000 00

14

0.001 05

0.499 41

0.002 11

0.000 00

15

0.000 70

0.499 60

0.001 41

0.000 00

16

0.000 47

0.499 74

0.000 94

0.000 00

17

0.000 31

0.499 82

0.000 63

0.000 00

18

0.000 21

0.499 88

0.000 42

0.000 00

19

0.000 14

0.499 92

0.000 28

0.000 00

20

0.000 09

0.499 95

0.000 19

0.000 00

 

迭代次数k=20,精确到的根的近似值是xk =0.000 2,其函数值是

yk =5.752 0e-011,收敛速度较慢.

根据求重根的修正牛顿切线公式,在MATLAB工作窗口输入程序

>>[k,piancha,xdpiancha,xk,yk]=newtonxz(3,0.5,1e-4, 1e-4,100)

运行后整理结果得表 2-21.

 

表 2-21

k

piancha

xdpiancha

xk

yk

1

0.432 30

6.385 79

0.067 70

0.002 94

2

0.066 54

57.310 85

0.001 16

0.000 00

3

0.001 16

3443.447 27

0.000 00

0.000 00

4

0.000 43

1.000 78

-0.000 43

-0.000 00

5

0.000 43

9228.792 13

0.000 00

-0.000 00

6

0.011 15

1.000 00

0.011 15

0.000 01

7

0.011 12

356.869 17

0.000 03

0.000 00

8

0.000 03

1638.927 03

0.000 00

0.000 00

迭代次数k=8,精确到的根的近似值是xk =1.900 3e-008,其函数值是yk = 4.440 9e-016,piancha = 3.114 5e-005,xdpiancha=1638.927 0,是二阶收敛(平方收敛).可见,求重根的修正牛顿切线公式比牛顿切线法收敛速度快得多.

(二) 未知方程根的重数

未知方程根的重数为,求重根的修正牛顿切线法的MATLAB主程序

现提供名为newtonxz1.m的M文件

function [k,piancha,xdpiancha,xk,yk]=newtonxz1(x0,tol,ftol,gxmax)

x(1)=x0;

for i=1: gxmax

u(i)=fnq(x(i))/dfnq(x(i));

du(i)=1-fnq(x(i))*ddfnq(x(i))/((dfnq(x(i)))^2+eps);

x(i+1)=x(i)-u(i)/du(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));

  if ((piancha<tol)|(xdpiancha< tol))&(abs(yk)<ftol)

        k=i-1;   xk=x(i); [(i-1) piancha xdpiancha xk yk]

   return;

end

end

if i>gxmax

    disp('请注意:迭代次数超过给定的最大值gxmax.')

k=i-1; xk=x(i); yk=fnq(x(i)); [(i-1) piancha xdpiancha xk yk] ;

return;

end

例2.6.8  用未知重数的求重根的修正牛顿切线法,求方程  在区间上的根,使精确到.

解  在MATLAB工作窗口输入程序

>> [k,piancha,xdpiancha,xk,yk]=newtonxz1(0.5,1e-4, 1e-4,100)

运行后整理结果得表 2-22.

表 2-22

k

piancha

xdpiancha

xk

yk

1

0.599 23

6.038 57

-0.099 23

-0.008 18

2

0.096 98

43.054 85

-0.002 25

-0.000 00

3

0.002 25

1 778.327 84

-0.000 00

0

4

0

0

-0.000 00

0

欢迎转载,转载请注明来自一手册:http://yishouce.com/book/3/3020606.html
友情链接It题库(ittiku.com)| 版权归yishouce.com所有| 友链等可联系 admin#yishouce.com|粤ICP备16001685号-1