@su
2014-06-02T17:03:10.000000Z
字数 5028
阅读 4303
matlab 微分方程数值解 微分变换法
考虑方程
对方程进行微分变换,获得的结果如下:
我们取
Matlab 代码如下:
function [] = main(N,alpha,miu )% 分数阶常微分方程数值方法之微分变换法 方程为 D(u)(y(x))=y^2 +1;% 输入的参数为 N,alpha miu 三种其中 N 是 大于 0的整数,alpha 为大于0的整数,miu 为大于零的小数;%% 首先对数据进行初始化;startp 代表微分方程的定义域的左端,endp 代表微分方程定义域的右端点;ydao 代表 存储 F(k)的数值;N 代表级数的个数;[startp,endp] = deal(0,1);ydao = zeros(N,1);xarr = startp:0.1:endp;miualpha= miu*alpha;%% 通过循环计算函数的导数的值并存入向量中;for t = miualpha:1:N+3;k = t-miualpha;upgamma1 = gamma(1+k/alpha);upright=0;if k==0;upright = upright +1;endfor k1=0:kupright = upright + ydao(k1+1)*ydao(k-k1+1);endydao(t+1)=upgamma1*upright/gamma(1+miu+k/alpha);end%disp(ydao);%% 通过循环计算函数在定义域的近似数值;leng = length(xarr);y=zeros(leng,1);for m=1:1:leng;for k = 1:N+1;y(m) = y(m)+ydao(k)*(xarr(m)-startp)^((k-1)/alpha);endenddisp(y);end
调用函数为:
main(30,2,1.5)
此时取
00.02380.06730.12390.19140.26890.35620.45400.56300.68510.8225
画出的图像为:

给定方程为
对方程进行微分变换,我们得到:
主函数的代码:
function [ ] = fenbu_weifen(N,)% 本函数使用多步微分变换法求解分数阶微分方程求解 方程为 D(u)(y)=3*y+1;% 所需的参数为N,级数的级数,alpha大于零的整数 miu 是分数;miu = 1;alpha=2;startydao=zeros(miu*alpha+1,1);truy =[];xarr=[];for t=1:5;[startp,endp]=deal((t-1)*0.2,t*0.2);x=startp:0.1:endp;[ydaoend,y] = DeriTrans(N,startp,endp,startydao );startydao = ydaoend;disp(y);truy=[truy ;y];xarr=[xarr x];disp(ydaoend);endsize(xarr)size(truy)plot(xarr,truy);end
所用的 DeriTransh 子函数代码如下:
function [ydaoend,y] = DeriTrans(N,startp,endp,startydao )% 分数阶常微分方程数值方法之微分变换法 方程为 D(u)(y(x))=y^2 +1;% 输入的参数为 N,alpha miu 三种其中 N 是 大于 0的整数,alpha 为大于0的整数,miu 为大于零的小数;% 函数的返回值为ydao 即函数在终点处的各阶导数的值;y为函数的数值解;%% 首先对数据进行初始化;startp 代表微分方程的定义域的左端,endp 代表微分方程定义域的右端点;ydao 代表 存储 F(k)的数值;N 代表级数的个数;alpha=2;miu=1;ydao = zeros(N,1);ydao(1:miu*alpha+1)=startydao;xarr = startp:0.1:endp;miualpha= miu*alpha;%% 通过循环计算函数的导数的值并存入向量中;for t = miualpha:1:N+3;k = t-miualpha;upgamma1 = gamma(1+k/alpha);upright=0;if k==0;upright = upright +1;elsefor k1=0:kupright = upright + ydao(k1+1)*ydao(k-k1+1);endendydao(t+1)=upgamma1*upright/gamma(1+miu+k/alpha);end%disp(ydao);%% 通过循环计算函数在定义域的近似数值;leng = length(xarr);y=zeros(leng,1);for m=1:1:leng;for k = 1:N+1;y(m) = y(m)+ydao(k)*(xarr(m)-startp)^((k-1)/alpha);endend%disp(ydao);%dos('explorer http://mathnews.')%% 计算导数在右端点处的数值,k-1代表求导的阶数;ydaoend=zeros(miualpha,1);val1=0;val2=0;for n=1:Ntemp=(endp-startp)^((n-1)/alpha)*ydao(n);val1 = val1 + temp;temp = (endp-startp)^((n-1)/alpha-1)*ydao(n);val2 = val2 + temp*(n-1)/alpha;endydaoend(1) = val1;ydaoend(3) = val2;% syms x;% expr=0;% for n=1:N;% expr=expr+ydao(n)*(x-startp)^((n-1)/alpha);% end%% for k=0:miu% res=diff(expr,x,k);% ydaoend(k*alpha+1)=subs(res,x,endp);%% endend
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
画出的图像为:
在代码中 ,我们取
考虑分数阶微分代数系统:
对方程进行微分变换,获得方程如下: