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

MATLAB数值实验:函数逼近法求方程的数值解

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

    这篇博客主要通过给定的数学迭代公式,利用MATLAB来迭代求解多项分数阶微分方程的数值解,主要用到的是函数逼近法,一种是非线性化数值解法,一种为线性化数值解法,并绘制解析解与数值解的函数图像,计算两者的误差。

1. 问题描述

2. MATLAB程序

demo_1.m

  1. clear
  2. clc
  3. format long % 数据形式为长精度
  4. % Author: 凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/
  5. %% 定义变量
  6. alpha1 = 0.9;
  7. alpha2 = 0.6;
  8. alpha3 = 0.3; % 1>alpha1>alpha2>alpha3>0
  9. %% 求解开始
  10. T = 2; % 区间右端点
  11. tau = 0.1; % 步长
  12. TT = 0:tau:T; % t变量序列,也就是方程中的自变量t
  13. N = length(TT)-1; % t变量序列个数-1
  14. % 定义三个1*N0矩阵用来储存方程中每一项的系数
  15. b_alpha1 = zeros(1,N);
  16. b_alpha2 = zeros(1,N);
  17. b_alpha3 = zeros(1,N);
  18. % 循环开始
  19. for k = 0 : (N-1)
  20. b_alpha1(k+1) = ((1+k)^(1-alpha1)-(k)^(1-alpha1))/gamma(2-alpha1);
  21. b_alpha2(k+1) = ((1+k)^(1-alpha2)-(k)^(1-alpha2))/gamma(2-alpha2)*tau^(alpha1-alpha2);
  22. b_alpha3(k+1) = ((1+k)^(1-alpha3)-(k)^(1-alpha3))/gamma(2-alpha3)*tau^(alpha1-alpha3);
  23. end
  24. coe_0 = b_alpha1(0+1) + b_alpha2(0+1) + b_alpha3(0+1);
  25. U = zeros(1,N+1); % 储存计算的结果
  26. for n = 1:N
  27. temp = 0;
  28. for k = 0 : n-2
  29. temp = temp + (b_alpha1(n-k-1+1) + b_alpha2(n-k-1+1) + b_alpha3(n-k-1+1))*(U(k+1+1)-U(k+1));
  30. end
  31. temp0 = U(n);
  32. while 1
  33. temp1 = U(n-1+1) - temp /coe_0+ tau^(alpha1)*right_fun(TT(n+1),temp0,alpha1,alpha2,alpha3)/coe_0;
  34. % 计算误差 如果前一次迭代和后一次迭代的误差小于10^-7,那么久退出循环,并把最后一次迭代的值赋给U
  35. if abs(temp0-temp1) < 10^(-7)
  36. U(n+1) = temp1;
  37. break;
  38. else
  39. temp0 = temp1;
  40. end
  41. end
  42. end
  43. True_sol = true_fun(TT,alpha1); % 真实值
  44. plot(TT,U,'-')
  45. hold on
  46. plot(TT,True_sol,'r*')
  47. legend('数值解','解析解','Location','northwest')
  48. title('Algorithm 1');
  49. xlabel('t');
  50. ylabel('u(t)');
  51. err = max(abs(U-True_sol)); % 误差
  52. saveas(gcf,sprintf('Algorithm 1.jpg'),'bmp'); %保存图片
  53. fprintf('方法一中解析解与数值解之间的误差为:%f\n', err);
  54. function aa = true_fun(t,alpha1)
  55. aa = t.^(2+alpha1);
  56. end
  57. function bb = right_fun(t,u,alpha1,alpha2,alpha3)
  58. bb = gamma(3+alpha1)/gamma(3)*t.^2+gamma(3+alpha1)/gamma(3+alpha1-alpha2)*t.^(2+alpha1-alpha2)+gamma(3+alpha1)/gamma(3+alpha1-alpha3)*t.^(2+alpha1-alpha3)+sin(t.^(2+alpha1))-sin(u);
  59. end

demo_2.m

  1. clear
  2. clc
  3. format long
  4. % Author: 凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/
  5. %% 定义变量
  6. alpha1 = 0.9;
  7. alpha2 = 0.6;
  8. alpha3 = 0.3; % 1 > alpha1 > alpha2 > alpha3 > 0
  9. %% 求解开始
  10. T = 2;
  11. tau = 0.1;
  12. TT = 0:tau:T;
  13. N = length(TT)-1;
  14. % 定义三个1*N0矩阵用来储存方程中每一项的系数
  15. b_alpha1 = zeros(1,N);
  16. b_alpha2 = zeros(1,N);
  17. b_alpha3 = zeros(1,N);
  18. % 循环开始
  19. for k = 0 :(N-1)
  20. b_alpha1(k+1) = ((1+k)^(1-alpha1)-(k)^(1-alpha1))/gamma(2-alpha1);
  21. b_alpha2(k+1) = ((1+k)^(1-alpha2)-(k)^(1-alpha2))/gamma(2-alpha2)*tau^(alpha1-alpha2);
  22. b_alpha3(k+1) = ((1+k)^(1-alpha3)-(k)^(1-alpha3))/gamma(2-alpha3)*tau^(alpha1-alpha3);
  23. end
  24. coe_0 = b_alpha1(0+1) + b_alpha2(0+1) + b_alpha3(0+1);
  25. %%%%%%%%%%%%%%%%%%%%%%%%%%
  26. U = zeros(1,N+1);
  27. temp0=U(2);
  28. %% 第一个值特殊处理
  29. while 1
  30. temp1= tau^(alpha1)*right_fun(TT(1+1),temp0,alpha1,alpha2,alpha3)/coe_0 ;
  31. if (abs(temp0-temp1) < 10^(-7) )
  32. U(2) = temp1;
  33. break;
  34. else
  35. temp0 = temp1;
  36. end
  37. end
  38. %% 2~N个值的计算
  39. for n = 2:N
  40. temp = 0;
  41. for k = 0 : n-2
  42. temp = temp + (b_alpha1(n-k-1+1) + b_alpha2(n-k-1+1) + b_alpha3(n-k-1+1))*(U(k+1+1)-U(k+1));
  43. end
  44. temp0 = U(n);
  45. while 1
  46. XX=2*U(n-1+1)-U(n-2+1);
  47. temp1 = U(n-1+1) - temp /coe_0+ tau^(alpha1)*right_fun(TT(n+1),XX,alpha1,alpha2,alpha3)/coe_0;
  48. % 计算误差 如果前一次迭代和后一次迭代的误差小于10^-7,那么久退出循环,并把最后一次迭代的值赋给U
  49. if (abs(temp0-temp1) < 10^(-7) )
  50. U(n+1) = temp1;
  51. break;
  52. else
  53. temp0 = temp1;
  54. end
  55. end
  56. end
  57. True_sol = true_fun(TT,alpha1); % 真实值
  58. plot(TT,U,'-')
  59. hold on
  60. plot(TT,True_sol,'r*')
  61. legend('数值解','解析解','Location','northwest')
  62. title('Algorithm 2');
  63. xlabel('t');
  64. ylabel('u(t)');
  65. err = max(abs(U-True_sol)); % 误差
  66. saveas(gcf,sprintf('Algorithm 2.jpg'),'bmp'); %保存图片
  67. fprintf('方法二中解析解与数值解之间的误差为:%f\n', err);
  68. function aa = true_fun(t,alpha1)
  69. aa = t.^(2+alpha1);
  70. end
  71. function bb = right_fun(t,u,alpha1,alpha2,alpha3)
  72. bb = gamma(3+alpha1)/gamma(3)*t.^2+gamma(3+alpha1)/gamma(3+alpha1-alpha2)*t.^(2+alpha1-alpha2)+gamma(3+alpha1)/gamma(3+alpha1-alpha3)*t.^(2+alpha1-alpha3)+sin(t.^(2+alpha1))-sin(u);
  73. end

3. 结果

  1. >> demo_1
  2. 方法一中解析解与数值解之间的误差为:0.169468
  3. >> demo_2
  4. 方法二中解析解与数值解之间的误差为:0.175177

方法一结果图

方法二结果图:

本博文问题来源:多项分数阶常微分方程的数值微分法 http://max.book118.com/file_down/e37129207cb5d8d84fa03b346b308819.docx

原文链接:http://www.cnblogs.com/kailugaji/p/14682575.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号