经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » MATLAB » 查看文章
MATLAB实例:非线性方程数值解法(迭代解)
来源:cnblogs  作者:凯鲁嘎吉  时间:2021/5/6 17:59:33  对本文有异议

MATLAB实例:非线性方程数值解法(迭代解)

作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/

    很久之前写过一篇关于“MATLAB用二分法、不动点迭代法及Newton迭代(切线)法求非线性方程的根”,本博文相当于之前这一篇的延续与拓展,介绍四种求解一元非线性方程的数值解法(迭代解),包括:牛顿迭代法,Halley迭代法,Householder迭代法以及预测校正牛顿-哈雷迭代法(Predictor-Corrector Newton-Halley,PCNH),具体参考文献[1],来源于这篇文章:THREE-STEP ITERATIVE METHOD WITH EIGHTEENTH ORDER CONVERGENCE FOR SOLVING NONLINEAR EQUATIONS。

1. 迭代更新公式

2. MATLAB程序

newton.m

  1. function [x1, k]=newton(t1,esp,m)
  2. syms x;
  3. fun=x^3+4*(x^2)-10;
  4. for k=1:m
  5. if abs(subs(diff(fun,'x'),x,t1))<esp
  6. x1=t1;
  7. break;
  8. else
  9. if subs(diff(fun,'x',2),x,t1)==0
  10. break;
  11. disp('解题失败!')
  12. else
  13. t0=t1;
  14. t1=t0-subs(fun,x,t0)/subs(diff(fun,'x'),x,t0);
  15. if abs(t1-t0)<esp
  16. x1=t1;
  17. break;
  18. end
  19. end
  20. end
  21. end
  22. % x1=vpa(x1,15);

halley.m

  1. function [x1, k]=halley(t1,esp,m)
  2. syms x;
  3. fun=x^3+4*(x^2)-10;
  4. for k=1:m
  5. if abs(subs(diff(fun,'x'),x,t1))<esp
  6. x1=t1;
  7. break;
  8. else
  9. if subs(diff(fun,'x',2),x,t1)==0
  10. break;
  11. disp('解题失败!')
  12. else
  13. t0=t1;
  14. t1=t0-(2*subs(fun,x,t0)*subs(diff(fun,'x'), x, t0))/(2*(subs(diff(fun,'x'), x, t0))^2-subs(fun, x, t0)*subs(diff(fun,'x',2),x,t0));
  15. if abs(t1-t0)<esp
  16. x1=t1;
  17. break;
  18. end
  19. end
  20. end
  21. end
  22. % x1=vpa(x1,15);

householder.m

  1. function [x1, k]=householder(t1,esp,m)
  2. syms x;
  3. fun=x^3+4*(x^2)-10;
  4. for k=1:m
  5. if abs(subs(diff(fun,'x'),x,t1))<esp
  6. x1=t1;
  7. break;
  8. else
  9. if subs(diff(fun,'x',2),x,t1)==0
  10. break;
  11. disp('解题失败!')
  12. else
  13. t0=t1;
  14. t1=t0-(subs(fun, x, t0))/(subs(diff(fun,'x'),x,t0))-(((subs(fun, x, t0))^2)*subs(diff(fun,'x',2),x,t0))/(2*(subs(diff(fun,'x',2),x,t0))^3);
  15. if abs(t1-t0)<esp
  16. x1=t1;
  17. break;
  18. end
  19. end
  20. end
  21. end
  22. % x1=vpa(x1,15);

PCNH.m

  1. function [x1, k]=PCNH(t1,esp,m)
  2. syms x;
  3. fun=x^3+4*(x^2)-10;
  4. for k=1:m
  5. if abs(subs(diff(fun,'x'),x,t1))<esp
  6. x1=t1;
  7. break;
  8. else
  9. if subs(diff(fun,'x',2),x,t1)==0
  10. break;
  11. disp('解题失败!')
  12. else
  13. t0=t1;
  14. w=t0-subs(fun,x,t0)/subs(diff(fun,'x'),x,t0);
  15. y=w-(2*subs(fun,x,w)*subs(diff(fun,'x'), x, w))/(2*(subs(diff(fun,'x'), x, w))^2-subs(fun, x, w)*subs(diff(fun,'x',2),x,w));
  16. t1=y-(subs(fun, x, y))/(subs(diff(fun,'x'),x,y))-(((subs(fun, x, y))^2)*subs(diff(fun,'x',2),x,y))/(2*(subs(diff(fun,'x',2),x,y))^3);
  17. if abs(t1-t0)<esp
  18. x1=t1;
  19. break;
  20. end
  21. end
  22. end
  23. end
  24. % x1=vpa(x1,15);

demo.m

  1. clear
  2. clc
  3. % Input: 初始值,迭代终止条件,最大迭代次数
  4. [x1, k1]=newton(1,1e-4,20); % 牛顿迭代法
  5. [x2, k2]=halley(1,1e-4,20); % Halley迭代法
  6. [x3, k3]=householder(1,1e-4,20); % Householder迭代法
  7. [x4, k4]=PCNH(1,1e-4,20); % 预测校正牛顿-哈雷迭代法(PCNH)
  8. fprintf('牛顿迭代法求解得到的方程的根为:%.15f, 实际迭代次数为:%d次\n', x1, k1);
  9. fprintf('Halley迭代法求解得到的方程的根为:%.15f, 实际迭代次数为:%d次\n', x2, k2);
  10. fprintf('Householder迭代法求解得到的方程的根为:%.15f, 实际迭代次数为:%d次\n', x3, k3);
  11. fprintf('预测校正牛顿-哈雷迭代法(PCNH)求解得到的方程的根为:%.15f, 实际迭代次数为:%d次\n', x4, k4);
  12. %% 函数图像
  13. x=-5:0.01:5;
  14. y=x.^3+4.*(x.^2)-10;
  15. y_0=zeros(length(x));
  16. plot(x, y, 'r-', x, y_0, 'b-');
  17. xlabel('x');
  18. ylabel('f(x)');
  19. title('f(x)=x^3+4{x^2}-10');
  20. saveas(gcf,sprintf('函数图像.jpg'),'bmp'); %保存图片

3. 数值结果

求解$f(x)=x^3+4{x^2}-10=0$方程在$x_0=1$附近的根。

  1. 牛顿迭代法求解得到的方程的根为:1.365230013435367, 实际迭代次数为:4
  2. Halley迭代法求解得到的方程的根为:1.365230013414097, 实际迭代次数为:3
  3. Householder迭代法求解得到的方程的根为:1.365230013391664, 实际迭代次数为:3
  4. 预测校正牛顿-哈雷迭代法(PCNH)求解得到的方程的根为:1.365230013414097, 实际迭代次数为:2

函数图像:

4. 参考文献

[1]  Bahgat, Mohamed & Hafiz, Mohammad. (2014). THREE-STEP ITERATIVE METHOD WITH EIGHTEENTH ORDER CONVERGENCE FOR SOLVING NONLINEAR EQUATIONS. International Journal of Pure and Applied Mathematics. 93.

原文链接:http://www.cnblogs.com/kailugaji/p/14724782.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号