[关闭]
@su 2014-06-02T17:03:10.000000Z 字数 5028 阅读 4303

分数阶微分方程数值解法

matlab 微分方程数值解 微分变换法

信计12        苏泽明
学号:2110902035

分数阶常微分方程数值解法-微分变换法

一、 题目

考虑方程

Dμ=y2+1,m1<μm,0<x<1
初始条件为:
y(k)(0)=0,k=0,,m1

二、 分析

对方程进行微分变换,获得的结果如下:

Y(k+μα)=Γ(1+kα)[k1=0kY(k1)Y(kk1)+δ(k)]Γ(1+μ+kα)
对初始条件进行微分变换,得到:
Y(k)=0,k=0,1,,μα1
现在可以利用由黎曼-刘维尔公式定义的分数阶微分扩展连续函数 f(x) 的分数幂级数上的形式:
f(x)=k=0F(K)(xx0)kα
其中 F(k) 是微分变换下相应的系数,所以只需要计算出相应的 F(k) 便可以利用以上的公式求出函数在某点处的近似值,编写程序代码如下计算

三、代码

我们取N=30,α=2,μ=0.5&1.5,t=0.0,0.1,,1.0
Matlab 代码如下:

  1. function [] = main(N,alpha,miu )
  2. % 分数阶常微分方程数值方法之微分变换法 方程为 D(u)(y(x))=y^2 +1
  3. % 输入的参数为 N,alpha miu 三种其中 N 大于 0的整数,alpha 为大于0的整数,miu 为大于零的小数;
  4. %% 首先对数据进行初始化;startp 代表微分方程的定义域的左端,endp 代表微分方程定义域的右端点;ydao 代表 存储 F(k)的数值;N 代表级数的个数;
  5. [startp,endp] = deal(0,1);
  6. ydao = zeros(N,1);
  7. xarr = startp:0.1:endp;
  8. miualpha= miu*alpha;
  9. %% 通过循环计算函数的导数的值并存入向量中;
  10. for t = miualpha:1:N+3;
  11. k = t-miualpha;
  12. upgamma1 = gamma(1+k/alpha);
  13. upright=0;
  14. if k==0;
  15. upright = upright +1;
  16. end
  17. for k1=0:k
  18. upright = upright + ydao(k1+1)*ydao(k-k1+1);
  19. end
  20. ydao(t+1)=upgamma1*upright/gamma(1+miu+k/alpha);
  21. end
  22. %disp(ydao);
  23. %% 通过循环计算函数在定义域的近似数值;
  24. leng = length(xarr);
  25. y=zeros(leng,1);
  26. for m=1:1:leng;
  27. for k = 1:N+1;
  28. y(m) = y(m)+ydao(k)*(xarr(m)-startp)^((k-1)/alpha);
  29. end
  30. end
  31. disp(y);
  32. end

四、结果

调用函数为:

  1. main(30,2,1.5)

此时取α=2,μ=1.5 获得的结果为:

  1. 0
  2. 0.0238
  3. 0.0673
  4. 0.1239
  5. 0.1914
  6. 0.2689
  7. 0.3562
  8. 0.4540
  9. 0.5630
  10. 0.6851
  11. 0.8225

画出的图像为:
微分变换法

分数阶微分方程数值解法-多步微分变换法

一、题目

给定方程为

Dμy(x)=y2+1m1<μm,0<x<5
初始条件为:
y(0)(k)=0;k=0,,m1

二、分析

对方程进行微分变换,我们得到:

Y(k+μα)=Γ(1+kα)[k1=0kY(k1)Y(kk1)+δ(k)]Γ(1+μ+kα)
对初始条件条件进行微分变换,得到:
Y(0)(0)=0k=0,,μα1
现在可以利用由黎曼-刘维尔公式定义的分数阶微分扩展连续函数 f(x) 的分数幂级数上的形式:
f(x)=k=0F(K)(xx0)kα
其中 F(k) 是微分变换下相应的系数,所以只需要计算出相应的 F(k) 便可以利用以上的公式求出函数在某点处的近似值.
当获得近似值后,可以对定义域中由分成五个小段逐个求得在 x=0,1,2,3,4 的数值,使用微分变换法便可求得近似的数值解。
对函数从 05 分成5段,依次进行微分变换,求得方程的数值解;
代码如下:

三、代码

主函数的代码:

  1. function [ ] = fenbu_weifen(N,)
  2. % 本函数使用多步微分变换法求解分数阶微分方程求解 方程为 D(u)(y)=3*y+1;
  3. % 所需的参数为N,级数的级数,alpha大于零的整数 miu 是分数;
  4. miu = 1;
  5. alpha=2;
  6. startydao=zeros(miu*alpha+1,1);
  7. truy =[];
  8. xarr=[];
  9. for t=1:5;
  10. [startp,endp]=deal((t-1)*0.2,t*0.2);
  11. x=startp:0.1:endp;
  12. [ydaoend,y] = DeriTrans(N,startp,endp,startydao );
  13. startydao = ydaoend;
  14. disp(y);
  15. truy=[truy ;y];
  16. xarr=[xarr x];
  17. disp(ydaoend);
  18. end
  19. size(xarr)
  20. size(truy)
  21. plot(xarr,truy);
  22. end

所用的 DeriTransh 子函数代码如下:

  1. function [ydaoend,y] = DeriTrans(N,startp,endp,startydao )
  2. % 分数阶常微分方程数值方法之微分变换法 方程为 D(u)(y(x))=y^2 +1
  3. % 输入的参数为 N,alpha miu 三种其中 N 大于 0的整数,alpha 为大于0的整数,miu 为大于零的小数;
  4. % 函数的返回值为ydao 即函数在终点处的各阶导数的值;y为函数的数值解;
  5. %% 首先对数据进行初始化;startp 代表微分方程的定义域的左端,endp 代表微分方程定义域的右端点;ydao 代表 存储 F(k)的数值;N 代表级数的个数;
  6. alpha=2;
  7. miu=1;
  8. ydao = zeros(N,1);
  9. ydao(1:miu*alpha+1)=startydao;
  10. xarr = startp:0.1:endp;
  11. miualpha= miu*alpha;
  12. %% 通过循环计算函数的导数的值并存入向量中;
  13. for t = miualpha:1:N+3;
  14. k = t-miualpha;
  15. upgamma1 = gamma(1+k/alpha);
  16. upright=0;
  17. if k==0;
  18. upright = upright +1;
  19. else
  20. for k1=0:k
  21. upright = upright + ydao(k1+1)*ydao(k-k1+1);
  22. end
  23. end
  24. ydao(t+1)=upgamma1*upright/gamma(1+miu+k/alpha);
  25. end
  26. %disp(ydao);
  27. %% 通过循环计算函数在定义域的近似数值;
  28. leng = length(xarr);
  29. y=zeros(leng,1);
  30. for m=1:1:leng;
  31. for k = 1:N+1;
  32. y(m) = y(m)+ydao(k)*(xarr(m)-startp)^((k-1)/alpha);
  33. end
  34. end
  35. %disp(ydao);
  36. %dos('explorer http://mathnews.')
  37. %% 计算导数在右端点处的数值,k-1代表求导的阶数;
  38. ydaoend=zeros(miualpha,1);
  39. val1=0;
  40. val2=0;
  41. for n=1:N
  42. temp=(endp-startp)^((n-1)/alpha)*ydao(n);
  43. val1 = val1 + temp;
  44. temp = (endp-startp)^((n-1)/alpha-1)*ydao(n);
  45. val2 = val2 + temp*(n-1)/alpha;
  46. end
  47. ydaoend(1) = val1;
  48. ydaoend(3) = val2;
  49. % syms x;
  50. % expr=0;
  51. % for n=1:N;
  52. % expr=expr+ydao(n)*(x-startp)^((n-1)/alpha);
  53. % end
  54. %
  55. % for k=0:miu
  56. % res=diff(expr,x,k);
  57. % ydaoend(k*alpha+1)=subs(res,x,endp);
  58. %
  59. % end
  60. end

四、结果

Matlab 输出的结果如下:
调用函数:

fenbu_weifen(30,2)

输出结果为:

0
0.1003
0.2027

0.2027
     0
1.0411

0.2027
0.3051
0.4140

0.4140
     0
1.1303

0.4140
0.5186
0.6347

0.6347
     0
1.2315

0.6347
0.7417
0.8659

0.8659
     0
1.3469

0.8659
0.9755
1.1088

1.1088
     0
1.4796

画出的图像为:
图像
在代码中 ,我们取 μ 的数值为2;α 的数值为2 这样获得的图像如上,与真实的值相差比较小。

分数阶微分方程数值解法-方程组解法

一、题目

考虑分数阶微分代数系统:

Dαx(t)ty(t)+t2z(t)+x(t)(1+t)y(t)+(t2+2t)z(t)=0Dαy(t)tz(t)y(t)+(t1)z(t)=0z(t)=sint,0<α1

满足初始条件:
x(0)=y(0)=1,z(0)=0

二、分析

对方程进行微分变换,获得方程如下:

X(0)=1,Y(0)=1,Z(0)=0Γ(α(k+1)+1)Γ(αk+1)X(k+1)=(k+1)Y(k)(k+1)Z(k1)X(k)+Y(K1)Z(k2)Γ(α(k+1)+1)Γ(αk+1)Y(k+1)=(k+1)Z(k)+Y(k)Z(k1)Z(2k)=0,Z(2k+1)=(1)k/(2k+1)!
其中
Y(1)=Z(1)=Z(2)=0

三、代码

四、结果

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注