matlab vdp1000,Matlab讨论区 - 声振论坛 - 振动,动力学,声学,信号处理,故障诊断 - Powered by Discuz!...

搜狗截图20140423191008.png (21.33 KB, 下载次数: 1)

2014-4-23 19:10 上传

程序如下:

syms t y;

u=exp(-5*t)*cos(2*t-1)+5;

uu=5*diff(u,t,2)+4*diff(u,t)+2*u;

y=dsolve(['D4y+10*D3y+35*D2y+24*Dy= uu '])复制代码

接下来,介绍一下关于数值解的解法。

大家应该都有这种意识:能够解析求解的微分方程(组)占少数,对于大多数微分方程(组)而言不能得到解析解,这时只能进行数值求解。关于数值分析方法,比较著名的当属Eular法、 Runge-Kutta了!在matlab中内置的ode求解器可以实现不同求解方法的相同格式的调用,而不必太关心matlab究竟是用什么算法完成的。在这里,我主要和大家分享关于ode45等求解器的具体使用方法,其他的求解器的使用有相似之处,在此不再赘述。

先不介绍其具体调用格式,先来个例子,看看他的庐山真面目:

求解方程组

Dx=y+x(1-x^2-y^2);

Dy=-x+y*(1-x^2-y^2)

初值x=0.1;y=0.2;

程序:

function weifen1

clear;clc

x0=[0.1;0.2];

[t,x]=ode45(@jxhdot,[0,100],x0);

plot(x(:,1),x(:,2))

function dx=jxhdot(t,x)

dx=[x(2)+x(1).*(1-x(1).^2-x(2).^2); -x(1)+x(2).*(1-x(1).^2-x(2).^2)];复制代码

结果如图1所示:

看完例子,我说明一下最常用的ode45调用方式,和相应的函数文件定义格式。

[t,x]=ode45(odefun,tspan,x0);

其中,Fun就是导函数,tspan为求解的时间区间(或时间序列,如果采用时间序列,则必须单调),x0为初值。

这时,函数文件可以采用如下方式定义:

function dx=odefun(t,x)

接着, (1)刚性方程的求解:刚性方程就是指各个自变量的变化率差异很大,会造成通常的求解方法失效。下面是matlab中自带的一个例子,使用ode15s求解,如果用ode45求解就会出现错误。

function myode15study

[T,Y] = ode15s(@vdp1000,[0 3000],[2 0]);

plot(T,Y(:,1),'-o')

figure;plot(Y(:,1),Y(:,2))

function dy = vdp1000(T,y)

dy = zeros(2,1);

dy(1) = y(2);

dy(2) = 1000*(1 - y(1)^2)*y(2) - y(1);复制代码结果如图2和图3.

(2)高阶微分方程的求解!通常的方法是进行变量替换,将原方程降阶,转换成更多变量的一阶方程组进行求解。在这个例子里我们求解一个动力学系统里最常见的一个运动方程。

程序:

function myhighoder

clear;clc

x0=zeros(6,1);

[t,x]=ode45(@myhigh,[0,100],x0);

plot(t,x(:,1))

function dx=myhigh(t,x)

f=[sin(t);0;0];

M=eye(3);

C=eye(3)*0.1;

K=eye(3)-0.5*diag(ones(2,1),1)-0.5*diag(ones(2,1),-1);

dx=[x(4:6);inv(M)*(f-C*x(4:6)-K*x(1:3))];复制代码结果如图4.

(3)延迟微分方程:matlab提供了dde23求解非中性微分方程。dde23的调用格式如下:

sol = dde23(ddefun,lags,history,tspan)

lags是延迟量,比如方程中包含y1(t-0.2)和y2(t-0.3)则可以使用lags=[0.2,0.3]。

这里的ddefun必须采用如下的定义方式:

dydt = ddefun(t,y,Z)

其中的Z(:,1)就是y(t-lags(1)),Z(:,2)就是y(t-lags(2))...

下面是个使用dde23求解延迟微分方程的例子:

function mydde23study

%   The differential equations

%

%        y'_1(t) = y_1(t-1)

%        y'_2(t) = y_1(t-1)+y_2(t-0.2)

%        y'_3(t) = y_2(t)

%

%   are solved on [0, 5] with history y_1(t) = 1, y_2(t) = 1, y_3(t) = 1 for

%   t <= 0.

clear;clc

lags=[1,0.2];

history=[1;1;1];

tspan=[0,5];

sol = dde23(@myddefun,lags,history,tspan)

plot(sol.x,sol.y)

function dy = myddefun(t,y,Z)

dy=[Z(1,1);Z(1)+Z(2,2); y(2) ];复制代码结果如图5所示。

(4)隐式微分方程:求解此类方程需要使用ode15i函数。调用格式:[T,Y] = ode15i(odefun,tspan,y0,yp0)

yp0为y'的初值。odefun的格式如下  dy =odefun(t,y,yp),yp表示y',而方程中应该使得f(t,y,y')=0

function myodeIMP

%   The problem is

%

%         y(1)' = -0.04*y(1) + 1e4*y(2)*y(3)

%         y(2)' =  0.04*y(1) - 1e4*y(2)*y(3) - 3e7*y(2)^2

%         y(3)' =  3e7*y(2)^2

%

%   It is to be solved with initial conditions y(1) = 1, y(2) = 0, y(3) = 0

%   to steady state.

clear;clc

y0=[1;0;0];

fixed_y0=[1;1;1];

yp0=[0 0 0];

fixed_yp0=[];

[y0mod,yp0mod]=decic(@myodefunimp,0,y0,fixed_y0,yp0,fixed_yp0);

tspan=[0, logspace(-6,6)];

[t,y] = ode15i(@myodefunimp,tspan,y0mod,yp0mod);

y(:,2)=1e4*y(:,2);

semilogx(t,y)

function res=myodefunimp(t,y,yp)

res=[ -yp(1)-0.04*y(1)+1e4*y(2)*y(3);-yp(2)+0.04*y(1)-1e4*y(2)*y(3)-3e7*y(2)^2;-yp(3)+3e7*y(2)^2 ];复制代码运行结果如图6.

在讲了这么多之后,我想大家也看烦了!所以,我结合相关论坛、帖子总结一个新的求解ode的方法——那就是使用simulink的积分器求解!!

还是咱们举的第一个例子:Dx=y+x(1-x^2-y^2);Dy=-x+y*(1-x^2-y^2)

初值x=0.1;y=0.2;积分器中设置初始条件;f(u)中指定Dx,Dy的计算公式。

在Simulink中建立模块框图,如图7所示。

运行这个仿真,scope中可以看到两个变量的时程如图8.在WorkSpace里可以得到tout和yout,执行plot(yout(:,1),yout(:,1))得到与ode45求解相似的结果!!!

除此之外,使用simulink还可以求解的一类延迟微分方程。(PS:transportDelay,就可以实现对于信号的延迟!!)

实例:x'(t)=A1*x(t-t1)+A2*x'(t-t2)+B*u(t)

t1=0.15;t2=0.5

A1=[-12     3   -3]      A2=[0.02    0     0]    B=[0]

[106  -116   62]            [0    0.03     0]         [1]

[207  -207  113]            [0       0  0.04]        [2]

Simulink中建立的模块框图和仿真结果图,如图9和10所示.

最后,给大家一些matlab求解微分方程的资料!见附件(本人强烈推荐一本书      薛定宇编写的《高等应用数学问题的MATLAB求解》,很不错!链接地址为http://ishare.iask.sina.com.cn/f/7453073.html)。

不足之处,还请大家补充、指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值