当前位置:   article > 正文

matlab:使用龙格库塔法求解微分方程组_matlab龙格库塔法解微分方程组

matlab龙格库塔法解微分方程组
  1. %书籍:常用数值算法及其matlab实现
  2. %第10章 常微分方程初值问题的数值解法,例10.14使用
  3. %四阶龙格库塔方法
  4. function [t,z] = rk4symeq(fun, t0, tf, Za, h)
  5. %fun:微分方程的右表达式
  6. %t0, tn为区间
  7. %Za为初值,是列向量
  8. M = floor(tf-t0)/h ; %离散点的个数M+1
  9. if t0 >= tf
  10. printf('左端点必须小于右端点');
  11. return;
  12. end
  13. N = length(Za); %获得变量个数,N
  14. z = zeros(M+1, N);
  15. t = zeros(M +1, 1);
  16. t =[t0 : h :tf]';
  17. z(1,:) = Za'; %假设Za为列向量,与微分方程中的变量方向统一,变成行向量
  18. for i = 1:M
  19. K1 = feval(fun, t(i) , z(i,:)); %K是行向量
  20. K2 = feval(fun, t(i)+1/2*h ,z(i,:)+1/2* h*K1);
  21. K3 = feval(fun, t(i)+1/2*h ,z(i,:)+1/2* h*K2);
  22. K4 = feval(fun, t(i)+ h ,z(i,:)+ h*K3);
  23. z(i+1,:) = z(i,:) +h/6 *(K1 + 2*K2 + 2*K3 + K4);
  24. end
  25. 以下为求解的方程组
  26. %书籍:常用数值算法及其matlab实现
  27. %第10章 常微分方程初值问题的数值解法
  28. %四阶龙格库塔,例10.16
  29. function s = exa10_16(t,z)
  30. %z是个向量,1*3
  31. %输出s也是向量,1*3
  32. s = zeros(1,2);
  33. dy1 = z(2) ;
  34. dy2 = -z(1) +(1-z(1)^2)*z(2);
  35. s = [dy1 dy2 ]; %输出s为行向量
  36. 主函数
  37. clear all;clc;close all;
  38. %书籍:常用数值算法及其matlab实现
  39. %第10章 常微分方程组初值问题的数值解法
  40. %四阶龙格库塔,例10.16
  41. %函数原型 function [t,z] = rk4symeq(fun, t0, tn, Za, h)
  42. format long
  43. t0 = 0; tf = 15;
  44. Za = [-3 ; -0.1]; %x初值
  45. h1 = 0.01;
  46. [t1,z1] = rk4symeq(@exa10_16, t0, tf , Za, h1);
  47. figure(1)
  48. plot(t1,z1(:,1),'b',t1,z1(:,2), 'r*')
  49. legend('y1','y2')
  50. figure(2)
  51. plot(z1(:,1),z1(:,2));
  52. xlabel('x');ylabel('y');

运行结果:

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/550646
推荐阅读
相关标签
  

闽ICP备14008679号