差分方程及matlab求解综述
- 格式:ppt
- 大小:878.50 KB
- 文档页数:102
实验二: 微分方程与差分方程模型Matlab 求解一、实验目的[1] 掌握解析、数值解法,并学会用图形观察解的形态和进展解的定性分析;[2] 熟悉MATLAB 软件关于微分方程求解的各种命令; [3] 通过范例学习建立微分方程方面的数学模型以及求解全过程;[4] 熟悉离散 Logistic 模型的求解与混沌的产生过程。
二、实验原理1. 微分方程模型与MATLAB 求解 解析解用MATLAB 命令dsolve(‘eqn1’,’eqn2’, ...) 求常微分方程〔组〕的解析解。
其中‘eqni'表示第i 个微分方程,Dny 表示y 的n 阶导数,默认的自变量为t 。
〔1〕 微分方程例1 求解一阶微分方程 21y dxdy+= (1) 求通解 输入:dsolve('Dy=1+y^2') 输出: ans =tan(t+C1) 〔2〕求特解 输入:dsolve('Dy=1+y^2','y(0)=1','x') 指定初值为1,自变量为x输出: ans =tan(x+1/4*pi)例2 求解二阶微分方程 221()04(/2)2(/2)2/x y xy x y y y πππ'''++-=='=-原方程两边都除以2x ,得211(1)04y y y x x '''++-= 输入:dsolve('D2y+(1/x)*Dy+(1-1/4/x^2)*y=0','y(pi/2)=2,Dy(pi/2)=-2/pi','x') ans =- (exp(x*i)*(pi/2)^(1/2)*i)/x^(1/2) +(exp(x*i)*exp(-x*2*i)*(pi/2)^(3/2)*2*i)/(pi*x^(1/2))试试能不用用simplify 函数化简 输入: simplify(ans)ans =2^(1/2)*pi^(1/2)/x^(1/2)*sin(x) 〔2〕微分方程组例3 求解 d f /d x =3f +4g ; d g /d x =-4f +3g 。
Matlab中的差分方程求解差分方程是微分方程的离散形式,常常在计算机科学、物理学、经济学等领域中广泛应用。
而Matlab作为一种数值计算软件,提供了强大的工具和函数用于差分方程的求解和分析。
本文将介绍Matlab中差分方程求解的基本方法和常见应用。
一、差分方程的基本概念差分方程是一种通过递归关系描述变量之间关系的数学表达式。
与微分方程不同,差分方程是以离散时间点为基础的,适用于描述离散系统的动态行为。
一般来说,差分方程可以分为线性差分方程和非线性差分方程两类。
线性差分方程的一般形式为:y[n] = a*y[n-1] + b*y[n-2] + ... + c*x[n],其中y[n]为方程的解,x[n]为给定的输入,a、b、c为系数。
而非线性差分方程则没有这种简单的表达形式,通常需要通过迭代或数值方法求解。
二、在Matlab中,可以利用函数和工具箱来求解差分方程。
下面将介绍几种常见的求解方法。
1. 符号计算方法Matlab的符号计算工具箱提供了一系列用于求解差分方程的函数,例如dsolve()函数。
这些函数可以根据给定的差分方程自动进行符号运算,得到方程的解析解。
符号计算方法适用于简单的线性差分方程,对于复杂的非线性差分方程则很难求解。
2. 数值迭代方法对于非线性差分方程,常常采用数值迭代的方法来求解。
Matlab提供了多种迭代函数,例如fsolve()函数和fminsearch()函数。
这些函数可以根据给定的差分方程和初始值,通过迭代计算得到方程的数值解。
数值迭代方法适用于各种类型的差分方程,但需要注意选择合适的初始值和迭代算法以确保收敛。
3. 差分方程求解函数除了符号计算和数值迭代方法,Matlab还提供了一些专门用于求解差分方程的函数,例如ode23()函数和ode45()函数。
这些函数可以根据给定的差分方程和初始条件,通过数值方法求解方程的数值解。
相比于数值迭代方法,差分方程求解函数更加高效和稳定,适用于大规模的复杂差分方程。
差分方程的解法分析及MATLAB实现差分方程是描述离散时序系统行为的数学工具。
在离散时间点上,系统的行为由差分方程给出,这是一个递归方程,其中当前时间点的状态取决于之前的状态和其他外部因素。
解差分方程的方法可以分为两类:直接解法和转化为代数方程的解法。
直接解法通过求解差分方程的递归形式来得到解析或数值解。
转化为代数方程的解法则将差分方程转化为代数方程进行求解。
一、直接解法的步骤如下:1.将差分方程表示为递归形式,即将当前时间点的状态表示为之前时间点的状态和其他外部因素的函数。
2.根据初始条件,确定初始时间点的状态。
3.根据递归形式,计算出后续时间点的状态。
以下是一个简单的差分方程的例子:y(n)=2y(n-1)+1,其中n为时间点。
按照上述步骤求解该差分方程:1.将差分方程表示为递归形式:y(n)=2y(n-1)+12.根据初始条件,假设y(0)=1,确定初始时间点的状态。
3.根据递归形式,计算出后续时间点的状态:y(1)=2y(0)+1=2*1+1=3y(2)=2y(1)+1=2*3+1=7y(3)=2y(2)+1=2*7+1=15...依此类推计算出所有时间点的状态。
二、转化为代数方程的解法的步骤如下:1.假设差分方程的解具有指数形式,即y=r^n,其中r为待定参数。
2.将差分方程代入上述假设中,得到r的方程。
3.解得r的值后,再根据初始条件求解出常数值。
4.得到差分方程的解析解。
以下是一个复杂一些的差分方程的例子:y(n)=2y(n-1)+3y(n-2),其中y(0)=1,y(1)=2按照上述步骤求解该差分方程:1.假设差分方程的解具有指数形式:y=r^n。
2.代入差分方程得到:r^n=2r^(n-1)+3r^(n-2)。
3.整理得到:r^2-2r-3=0。
4.解得r的值为:r1=-1,r2=35.根据初始条件求解出常数值:y(0)=c1+c2=1,y(1)=c1-c2=2、解得c1=1.5,c2=-0.56.得到差分方程的解析解:y(n)=1.5*(-1)^n+-0.5*3^n。
差分方程求解matlab代码
差分方程的matlab代码通常指用matlab解决差分方程组的计算
机程序。
差分方程是一类特殊的微分方程,其中某个或某些未知函数
不仅取决于变量的某个当前值,还取决于它之前某些时刻的值,因此
这类方程用来描述变化随时间而发生的动态系统,如振荡器、时变系
统等。
下面是matlab解差分方程的一般步骤:
首先,要确定变量的间隔,也就是时间间隔。
它是求解方程的基础,时间间隔的大小会影响结果的精确程度。
其次,要确定初始值,即微分方程的初值。
这些初值可能有助于
准确地描述变化系统的状态,以便在迭代过程中可以得到更准确的解。
然后,需要编写与差分方程相关的matlab代码。
matlab使用odefun函数来求解代数方程组,它可以用来快速求解差分方程中的未
知变量。
最后,使用ode45函数进行计算。
ode45函数是matlab自带的积
分函数,它可以根据设定的求解间隔将变量的连续变化转换成离散变
化形式,使得可以计算出结果。
以上就是matlab解差分方程的一般步骤。
为了求解更复杂的差分
方程,可以在matlab中编写更复杂的代码,以获得更准确的结果。
MATLAB中的差分方程建模与求解方法引言差分方程是数学中常见的一种方程类型,是一种离散形式的微分方程。
在实际问题中,差分方程能够提供对系统的离散描述,对于动态模型的建立和求解具有重要作用。
MATLAB作为一种功能强大的数值计算软件,其内置了丰富的工具箱和函数,为差分方程的建模和求解提供了便利。
一、差分方程的建模差分方程的建模是将实际问题转化为数学方程的过程。
在MATLAB中,差分方程的建模可以通过定义离散系统的状态和状态转移方程来实现。
下面以一个简单的例子说明差分方程的建模过程。
假设有一个人口增长模型,人口数在每年增加10%,则差分方程可以表示为:P(n+1) = P(n) + 0.1 * P(n),其中P(n)表示第n年的人口数,P(n+1)表示第n+1年的人口数。
在MATLAB中,可以通过定义一个函数来描述差分方程的状态转移方程,代码如下:```matlabfunction Pn = population_growth(Pn_minus_1)growth_rate = 0.1;Pn = Pn_minus_1 + growth_rate * Pn_minus_1;end```上述代码定义了一个名为"population_growth"的函数,该函数的输入参数为上一年的人口数"Pn_minus_1",输出为当前年的人口数"Pn"。
其中,growth_rate表示人口增长率,根据差分方程的定义,将上一年的人口数乘以增长率再加上本身,即可得到当前年的人口数。
二、差分方程的求解方法在MATLAB中,差分方程的求解可以通过多种方法实现。
下面介绍两种常用的差分方程求解方法:欧拉法和四阶龙格-库塔法。
1. 欧拉法(Euler's method)欧拉法是差分方程求解中最简单直观的一种方法。
其基本思想是通过离散化的方式逐步逼近连续函数的解。
具体步骤如下:1) 将时间段分割成若干个小区间;2) 根据差分方程的状态转移方程,在每个小区间内进行计算;3) 迭代计算直到达到指定的时间点。
一、概述在科学和工程领域,差分方程和离散时间系统模型的求解是非常常见和重要的问题。
差分方程是描述离散时间系统动态行为的数学模型,而z变换则是一种用于分析和求解差分方程的工具。
在matlab中,我们可以利用其强大的数值计算和符号计算功能来求解差分方程和进行z 变换分析,本文将介绍如何使用matlab来求解差分方程和进行z变换分析。
二、差分方程的matlab求解1. 差分方程的表示差分方程表示为:y(n) + a1*y(n-1) + a2*y(n-2) + ... + aN*y(n-N) = b0*x(n) +b1*x(n-1) + ... + bM*x(n-M)其中y(n)为系统的输出,x(n)为系统的输入,aN, aN-1, ..., a1, bM, bM-1, ..., b0为差分方程的系数。
2. 差分方程的matlab表示在matlab中,可以使用“filter”函数来求解差分方程。
该函数的用法为:y = filter(b, a, x)其中b为差分方程输出项的系数,a为差分方程输入项的系数,x为系统的输入。
该函数可以帮助我们求解差分方程,并得到系统的输出。
3. 示例假设有一个差分方程为:y(n) - 0.5*y(n-1) = x(n)其在matlab中的求解代码如下:输入信号x = randn(1, 100);系数b = 1;a = [1, -0.5];求解差分方程y = filter(b, a, x);通过以上代码,我们可以得到系统的输出y,从而求解了差分方程。
三、z变换和差分方程的关系1. z变换的定义z变换是一种用于分析和求解离散时间系统的工具,其定义为:Y(z) = Z{y(n)} = sum(y(n)*z^(-n), n=-inf to inf)其中Y(z)表示系统的z变换,y(n)表示系统的离散时间响应,z为复数变量。
2. z变换与差分方程的关系差分方程和z变换的关系可以表示为:Y(z) = H(z)X(z)其中Y(z)为系统的输出的z变换,H(z)为系统的传递函数的z变换,X(z)为系统的输入的z变换。
差分方程的解法分析及MATLAB 实现(程序)摘自:张登奇,彭仕玉.差分方程的解法分析及其MATLAB 实现[J]. 湖南理工学院学报.2014(03) 引言线性常系数差分方程是描述线性时不变离散时间系统的数学模型,求解差分方程是分析离散时间系统的重要内容.在《信号与系统》课程中介绍的求解方法主要有迭代法、时域经典法、双零法和变换域法[1].1 迭代法例1 已知离散系统的差分方程为)1(31)()2(81)1(43)(-+=-+--n x n x n y n y n y ,激励信号为)()43()(n u n x n =,初始状态为21)2(4)1(=-=-y y ,.求系统响应. 根据激励信号和初始状态,手工依次迭代可算出2459)1(,25)0(==y y . 利用MATLAB 中的filter 函数实现迭代过程的m 程序如下:clc;clear;format compact;a=[1,-3/4,1/8],b=[1,1/3,0], %输入差分方程系数向量,不足补0对齐n=0:10;xn=(3/4).^n, %输入激励信号zx=[0,0],zy=[4,12], %输入初始状态zi=filtic(b,a,zy,zx),%计算等效初始条件[yn,zf]=filter(b,a,xn,zi),%迭代计算输出和后段等效初始条件2 时域经典法用时域经典法求解差分方程:先求齐次解;再将激励信号代入方程右端化简得自由项,根据自由项形式求特解;然后根据边界条件求完全解[3].用时域经典法求解例1的基本步骤如下.(1)求齐次解.特征方程为081432=+-αα,可算出41 , 2121==αα.高阶特征根可用MATLAB 的roots 函数计算.齐次解为. 0 , )41()21()(21≥+=n C C n y n n h (2)求方程的特解.将)()43()(n u n x n =代入差分方程右端得自由项为 ⎪⎩⎪⎨⎧≥⋅==-⋅+-1,)43(9130 ,1)1()43(31)()43(1n n n u n u n n n 当1≥n 时,特解可设为n p D n y )43()(=,代入差分方程求得213=D . (3)利用边界条件求完全解.当n =0时迭代求出25)0(=y ,当n ≥1时,完全解的形式为 ,)43(213 )41()21()(21n n n C C n y ⋅++=选择求完全解系数的边界条件可参考文[4]选)1(),0(-y y .根据边界条件求得35,31721=-=C C .注意完全解的表达式只适于特解成立的n 取值范围,其他点要用)(n δ及其延迟表示,如果其值符合表达式则可合并处理.差分方程的完全解为)(])43(213 )41(35)21(317[)1(])43(213 )41(35)21(317[)(25)(n u n u n n y n n n n n n ⋅+⋅+⋅-=-⋅+⋅+⋅-+=δ MATLAB 没有专用的差分方程求解函数,但可调用maple 符号运算工具箱中的rsolve 函数实现[5],格式为y=maple('rsolve({equs, inis},y(n))'),其中:equs 为差分方程表达式, inis 为边界条件,y(n)为差分方程中的输出函数式.rsolve 的其他格式可通过mhelp rsolve 命令了解.在MATLAB 中用时域经典法求解例1中的全响应和单位样值响应的程序如下.clc;clear;format compact;yn=maple('rsolve({y(n)-3/4*y(n-1)+1/8*y(n-2)=(3/4)^n+1/3*(3/4)^(n-1),y(0)=5/2,y(-1)=4},y(n))'),hn=maple('rsolve({y(n)-3/4*y(n-1)+1/8*y(n-2)=0,y(0)=1,y(1)=13/12},y(n))'),3 双零法根据双零响应的定义,按时域经典法的求解步骤可分别求出零输入响应和零状态响应.理解了双零法的求解原理和步骤,实际计算可调用rsolve 函数实现.yzi=maple('rsolve({y(n)-3/4*y(n-1)+1/8*y(n-2)=0,y(-1)=4, y(-2)=12},y(n))'),yzs=maple('rsolve({y(n)-3/4*y(n-1)+1/8*y(n-2)=(3/4)^n+1/3*(3/4)^(n-1),y(0)=1,y(-1)=0},y(n))'),4 变换域法设差分方程的一般形式为)()(00r n x b k n y a r Mr k N k -=-∑∑==.对差分方程两边取单边z 变换,并利用z 变换的位移公式得])()([])()([1010m r m r r M r l k l k k N k z m x z X z b z l y z Y z a ---=-=---=-=∑∑∑∑+=+整理成)()()()()()(00z X z X z B z Y z Y z A +=+形式有. )(, )(110110M M N N z b z b b z B z a z a a z A ----+++=+++=. )()(, )()(110110∑∑∑∑=--=--=--=--==M r r m m r r N k k l l k k z m x b s X zl y a s Y可以看出,由差分方程可直接写出 )(z A 和 )(z B ,系统函数)(/)()(z A z B z H =,将系统函数进行逆z 变换可得单位样值响应.由差分方程的初始状态可算出 )(0z Y ,由激励信号的初始状态可算出 )(0z X ,将激励信号进行z 变换可得 )(z X ,求解z 域代数方程可得输出信号的象函数 , )()()()()()(00z A z Y z X z X z B z Y -+= 对输出象函数进行逆z 变换可得输出信号的原函数)(n y .利用z 变换求解差分方程各响应的步骤可归纳如下:(1)根据差分方程直接写出 )(z A 、 )(z B 和)(z H ,)(z H 的逆变换即为单位样值响应;(2)根据激励信号算出 )(z X ,如激励不是因果序列则还要算出前M 个初始状态值;(3)根据差分方程的初始状态 )(, ),2( ),1(N y y y -⋅⋅⋅--和激励信号的初始状态 )(, ),2( ),1(M x x x -⋅⋅⋅--算出 )(0z Y 和 )(0z X ;(4)在z 域求解代数方程)()()()()()(00z X z X z B z Y z Y z A +=+得输出象函数 )(z Y , )(z Y 的逆变换即为全响应;(5)分析响应象函数的极点来源及在z 平面中的位置,确定自由响应与强迫响应,或瞬态响应与稳态响应;(6)根据零输入响应和零状态响应的定义,在z 域求解双零响应的象函数,对双零响应的象函数进行逆z 变换,得零输入响应和零状态响应.用变换域法求解例1的基本过程如下. 根据差分方程直接写出2181431 )(--+-=z z z A ,1311 )(-+=z z B .系统函数的极点为41,21. 对激励信号进行z 变换得)43/( )(-=z z z X .激励象函数的极点为3/4. 根据差分方程的初始状态算出102123 )(-+-=z z Y .根据激励信号的初始状态算出 0)(0=z X . 对z 域代数方程求解,得全响应的象函数)323161123/()83243125( )(2323-+-+-=z z z z z z z Y . 进行逆z 变换得全响应为)(])43(213 )41(35)21(317[)(n u n y n n n ⋅+⋅+⋅-= 其中,与系统函数的极点对应的是自由响应;与激励象函数的极点对应的是强迫响应. )(z Y 的极点都在z 平面的单位圆内故都是瞬态响应.零输入响应和零状态响应可按定义参照求解.上述求解过程可借助MATLAB 的符号运算编程实现.实现变换域法求解差分方程的m 程序如下: clc;clear;format compact;syms z n %定义符号对象% 输入差分方程、初始状态和激励信号%a=[1,-3/4,1/8],b=[1,1/3], %输入差分方程系数向量y0=[4,12],x0=[0], %输入初始状态,长度分别比a 、b 短1,长度为0时用[]xn=(3/4)^n, %输入激励信号,自动单边处理,u(n)可用1^n 表示% 下面是变换域法求解差分方程的通用程序,极点为有理数时有解析式输出 %N=length(a)-1;M=length(b)-1;%计算长度Az=poly2sym(a,'z')/z^N;Bz=poly2sym(b,'z')/z^M;%计算A(z)和B(z)Hz=Bz/Az;disp('系统函数H(z):'),sys=filt(b,a),%计算并显示系统函数hn=iztrans(Hz);disp('单位样值响应h(n)='),pretty(hn),%计算并显示单位样值响应Hzp=roots(a);disp('系统极点:');Hzp,%计算并显示系统极点Xz=ztrans(xn);disp('激励象函数X(z)='),pretty(Xz),%激励信号的单边z 变换Y0z=0;%初始化Y0(z),求Y0(z)注意系数标号与变量下标的关系for k=1:N;for l=-k:-1;Y0z = Y0z+a(k+1)*y0(-l)*z^(-k-l);endenddisp('初始Y0(z)'),Y0z,%系统初始状态的z 变换X0z=0;%初始化X0(z),求X0(z)注意系数标号与变量下标的关系for r=1:M;for m=-r:-1;X0z = X0z+b(r+1)*x0(-m)*z^(-r-m);endenddisp('初始X0(z)'),X0z,%激励信号起始状态的z 变换Yz=(Bz*Xz+X0z-Y0z)/Az;disp('全响应的z 变换Y(z)'),pretty(simple(Yz)),yn=iztrans(Yz);disp('全响应y(n)='),pretty(yn),% 计算并显示全响应Yziz=-Y0z/Az;disp('零输入象函数Yzi(z)='),pretty(Yziz),%零激励响应的z 变换yzin=iztrans(Yziz);disp('零输入响应yzi(n)='),pretty(yzin),% 计算并显示零输入响应 Yzsz=(Bz*Xz+X0z)/Az;disp('零状态象函数Yzs(z)='),pretty(Yzsz),%零状态响应的z 变换yzsn=iztrans(Yzsz);disp('零状态响应yzs(n)='),pretty(yzsn),% 计算并显示零状态响应该程序的运行过程与手算过程对应,显示在命令窗的运行结果与手算结果相同.。