码字总结不易,老铁们来个三连:点赞、关注、评论
作者:[左手の明天]
原创不易,转载请联系作者并注明出处
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
差分方程是描述离散时间系统的数学模型,求解差分方程是分析离散时间系统的重要内容。

目录
差分方程的一般形式

差分方程的平衡点 ~代数方程 x=ax+b 的根 x=b/(1-a)
差分方程的解


c= x0-b/(1-a)由初始值x0 和a、b确定

平衡点稳定的充要条件是 |a|<1

特征方程 
特征根
平衡点
差分方程的解

平衡点稳定的条件: 所有特征根的模小于1
Florida沙丘鹤属于濒危物种,它在较好自然环境下,年均增长率仅为1.94%,而在中等和较差环境下年均增长率分别为 -3.24% 和 -3.82%,如果在某自然保护区内开始有100只鹤,建立描述其数量变化规律的模,并作数值计算。
如果每年人工孵化5只鹤放入该保护区, 在中等自然环境下鹤的数量将如何变化?
记第k年沙丘鹤的数量为,年均增长率为r, 则第k+1年鹤的数量为

设每年人工孵化的数量为b

那么可以得到
已知X0=100,在较好,中等和较差的自然环境下r=0.0194 , -0.0324 和 -0.0382 利用Matlab编程,递推20年后观察沙丘鹤的数量变化情况
>>X0=100;
>> r=0.0194;
>> n=20;
>>Xn=(1+r)^n*X0
执行后得到: Xn =146.8563
通过函数形式实现如下:
function x=sqh(n,r)
x(1)=100;
for k=1:n
x(k+1)=(1+r)*x(k);
end
>>xn=sqh(20,0.0194)
xn =
Columns 1 through 6
100.0000 101.9400 103.9176 105.9336 107.9888 110.0837
Columns 7 through 12
112.2194 114.3964 116.6157 118.8780 121.1843 123.5353
Columns 13 through 18
125.9318 128.3749 130.8654 133.4042 135.9922 138.6305
Columns 19 through 21
141.3199 144.0615 146.8563
利用plot 绘图观察数量变化趋势
>>k=0:20;
>>y1= sqh(20,0.0194);
>>plot(k,y1)

在同一坐标系下画图
>> k=0:20; %一个行向量
>> y1= sqh(20, 0.0194);
>> y2= sqh(20, -0.0324);
>> y3= sqh(20, -0.0382);
>> plot(k,y1,k,y2,':',k,y3,'r')

最终结果如下:



一年生植物春季发芽,夏天开花,秋季产种。 没有腐烂、风干、被人为掠去的那些种子可以活过冬天,其中的一部分能在第二年春季发芽,然后开花、产种,其中的另一部分虽未能发芽,但如又能活过一个冬天,则其中一部分可在第三年春季发芽,然后开花、产种,如此继续。
一年生植物只能活一年,且近似地认为,种子最多可以活过两个冬天。
建立数学模型研究植物数量的变化规律, 及它能够一直繁殖下去的条件。
设一棵植物平均产种数为c,种子能够活过冬天的比例为b,活过冬天的那些种子在来年春季发芽的比例为,未能发芽的那些种子又活过一个冬天的比例仍为b, 在下一年春季发芽的比例为
。
~第k年的植物数量,设今年种下(并成活)的数量为

寻找形如的解
设c=10, a1=0.5,a2=0.25,b=0.18, 0.19, 0.20,x0=100
matlab建立如下函数:
function x=zwfz(x0,n,b)
c=10;a1=0.5;a2=0.25;
p=a1*b*c;q=a2*b*(1-a1)*b*c;
x(1)=x0;
x(2)=p*x(1);
for k=3:n
x(k)=p*x(k-1)+q*x(k-2);
end
>> k=0:20;
>> y1=zwfz(100,21,0.18);
>> y2=zwfz(100,21,0.19);
>> y3=zwfz(100,21,0.20);
>> plot(k,y1,k,y2,':',k,y3,'r')

差分方程
特征方程
特征根 
差分方程的解
常数c1, c2由x0, x1确定





植物能够一直繁殖下去的条件为b>0.191
汽车租赁公司在3个相邻的城市运营,在一个城市租赁的汽车可以在任意一个城市归还.
公司开业时将600辆汽车平均分配到3个城市, 建立运营中汽车数量在3个城市间转移的模型, 讨论时间充分长以后的变化趋势.

记第k个租赁期末公司在A, B, C市的汽车数量分别为x1(k),x2(k),x3(k)(也是第k+1个租赁期开始各个城市租出去的汽车数量),很容易写出第k+1个租赁期末公司在A, B, C市的汽车数量为(k=0,1,2,3···)

用矩阵表示




观察n年以后的3个城市的汽车数量变化情况
>> A=[0.6,0.2,0.1;0.3,0.7,0.3;0.1,0.1,0.6];
>> n=10;
>> for k=1:n
x(:,1)=[200,200,200]';
x(:,k+1)=A*x(:,k);
end
>> x(:,k+1)
ans =
179.9324
299.9895
120.0781

时间充分长后3个城市的汽车数量趋向稳定,稳定值与初始分配无关
建立M文件
function x=qczl(n)
A=[0.6,0.2,0.1;0.3,0.7,0.3;0.1,0.1,0.6];
x(:,1)=[200,200,200]';
for k=1:n
x(:,k+1)=A*x(:,k);
end
作图观察5年以后数量的变化趋势:
>> y1=qczl(5);
>> k=0:5;
>> plot(k,y1)

野生或饲养的动物因繁殖而增加,因自然死亡和人为屠杀而减少,不同年龄动物的繁殖率,死亡率有较大差别,因此在研究某一种群数量的变化时,需要考虑年龄分组的种群增长。
将种群按年龄等间隔的分成若干个年龄组,时间也离散化为时段,给定各年龄组种群的繁殖率和死亡率,建立按年龄分组的种群增长模型,预测未来各年龄组的种群数量,并讨论时间充分长以后的变化趋势。
xi(k)~时段k第i 年龄组的种群数量



设一种群分成 n=5个年龄组,繁殖率 b1~b5= 0, 0.2, 1.8, 0.8, 0.2,存活率s1~s4= 0.5, 0.8, 0.8, 0.1,各年龄组现有数量均为100 .

>> b=[0,0.2,1.8,0.8,0.2];
>> E=diag([0.5,0.8,0.8,0.1]);
>> L=[b;E,zeros(4,1)];
>> b=[0,0.2,1.8,0.8,0.2];
>> E=diag([0.5,0.8,0.8,0.1]);
>> L=[b;E,zeros(4,1)]; %分块矩阵
>> n=30;
>> for k=1:n
x(:,1)=[100,100,100,100,100]';
x(:,k+1)=A*x(:,k);
end
ans =
434.1877
211.4436
164.6266
128.9265
12.5635

差分方程本身就是一个递推方程,根据初始状态和激励信号依次迭代就可算出输出序列。迭代法是
解差分方程的基础方法, 如果所需输出序列个数较少(如计算边界条件)可手工直算,如需计算大量输出可利用计算机编程实现。

根据激励信号和初始状态,手工依次迭代可算出

利用 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),%迭代计算输出和后段等效初始条件
MATLAB提供的 filter函数是一个内建函数, 用 type命令看不到程序代码。为了理解迭代思想,下面根据图 所示的直接Ⅰ型结构, 重写实现迭代法的 m 程序。

clc;clear;format compact;
a=[1, -3/4, 1/8], b=[1, 1/3, 0], %输入差分方程系数向量, 不足补 0 对齐
n=0:10;x=(3/4).^n, %输入激励信号
zx=[0, 0], zy=[4, 12], %输入初始状态
% 下面是按直接Ⅰ型结构迭代的通用程序 %
N=length(a)-1, %计算数据存储长度
L=length(x), %计算激励信号长度
y=zeros(1, L);%输出信号初始化
for i=1:L; %逐个计算输出信号
for n=1:N;z(n)=b(n+1)*zx(n)-a(n+1)*zy(n);end %分算过去
zz=sum(z);%计算输出中的过去分量
y(i)=b(1)*x(i)+zz;% 计算当前输出 y(n)
for n=N:-1:2, zx(n)=zx(n-1);zy(n)=zy(n-1);end%过去数据下移
zx(1)=x(i);zy(1)=y(i);%当前的激励和输出变为过去, 以便算下一个输出
end
%理解 filter 函数中 zf 参数的意义
zf=zeros(1, N);%初始化 zf
for k=1:N; %逐个计算 zf 参数
for n=1:N;z(n)=b(n+1)*zx(n)-a(n+1)*zy(n);end %算 z(n)
zf(k)=sum(z);% 计算第 k 个 zf
for k=N:-1:2, zx(k)=zx(k-1);zy(k)=zy(k-1);end;%过去数据下移
zx(1)=0;zy(1)=0;% 没有当前的激励和输出变为过去, 算下一个 zf
end
y, zf, %显示输出和 zf 参数
用时域经典法求解差分方程与高等数学中求解微分方程的过程类似:先求齐次解;再将激励信号代
入方程右端化简得自由项,根据自由项形式求特解:然后根据边界条件求完全解。
用时域经典法求解例的基本步骤如下:
特征方程为
,可算出
。高阶特征根可用 MATLAB 的roots 函数计算。齐次解为

将
代入差分方程右端得自由项为

当 n = 0 时迭代求出y(0) = 5/2,当 n≥1 时 , 完全解的形式为
选择求完全解系数的边界条件y(0),y(-1)。根据边界条件求得
注意完全解的表达式只适于特解成立的n取值范围,其他点要用δ(n) 及其延迟表示,如果其值符合表达式则可合并处理。
差分方程的完全解为

MATLAB没有专用的差分方程求解函数,但可调用maple符号运算工具箱中的rsolve函数实现,格式为
y=maple('rsolve({equs, inis},y(n))')
其中
在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))'),
双零法是将完全解分解成物理意义明显的零输入响应和零状态响应分别计算。
根据双零响应的定义,按时域经典法的求解步骤可分别求出零输入响应和零状态响应。
理解了双零法的求解原理和步骤,实际计算可调用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))'),
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我希望将Favorite模型添加到我的User和Link模型。业务逻辑用户可以有多个链接(即可以添加多个链接)用户可以收藏多个链接(他们自己的或其他用户的)一个链接可以被多个用户收藏,但只有一个所有者我对如何为这种关联建模以及在模型就位后如何创建用户收藏夹感到困惑?classUser 最佳答案 下面的数据模型怎么样:classUser:destroyhas_many:favorite_links,:through=>:favorites,:source=>:linkendclassLink:destroyhas_many:favor
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢
我有一些非常大的模型,我必须将它们迁移到最新版本的Rails。这些模型有相当多的验证(User有大约50个验证)。是否可以将所有这些验证移动到另一个文件中?说app/models/validations/user_validations.rb。如果可以,有人可以提供示例吗? 最佳答案 您可以为此使用关注点:#app/models/validations/user_validations.rbrequire'active_support/concern'moduleUserValidationsextendActiveSupport:
对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs
我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案
ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序