目次
Matlab が微分方程式を解く
まずは解析解(つまり関数式)を求めてください、見つからない場合は数値解を求めてください(値がたくさん見つかったら、元の関数式のイメージを離散的に近似する絵を描くこともできます)値)
分析ソリューション
% 方法1
dsolve('y-Dy=2*x','y(0)=3','x')
% 解析解:y = 2*x + exp(x) + 2
% Dy表示一阶微分 dy/dx
% D2y表示二阶微分
% 方法2
syms y(x)
eqn = (y - diff(y,x) == 2*x); % 要用双等号!!
cond = (y(0) == 3); % 初始条件
dsolve(eqn,cond)
% diff(y,x) 即 dy/dx
% 方法1
dsolve('D2y+4*Dy+29*y=0','y(0)=0,Dy(0)=15','x')
% 3*sin(5*x)*exp(-2*x)
%%%%%%%% 画图:点乘!!!
x = -2:0.01:2;
y = 3*sin(5.*x)*exp(-2*x)
plot(x,y,'b-')
% 方法2
syms y(x)
eqn = (diff(y,x,2) + 4 *diff(y,x) + 29*y == 0);
Dy = diff(y,x); % 定义变量Dy为y的一阶导数!!!!!!!!!!!!!!!!!!!!
cond = [(y(0) == 0) ,(Dy(0) ==15)] ; % 有两个条件,可以写到一个向量中保存
dsolve(eqn,cond)
% 3*sin(5*x)*exp(-2*x)
% 方法1
[x,y,z] = dsolve('Dx=2*x-3*y+3*z+t','Dy=4*x-5*y+3*z+t','Dz=4*x-4*y+2*z+t','t')
A = dsolve('Dx=2*x-3*y+3*z+t','Dy=4*x-5*y+3*z+t','Dz=4*x-4*y+2*z+t','t')
A.x
% 方法2
syms x(t) y(t) z(t)
eqn1 = (diff(x,t) == 2*x-3*y+3*z+t);
eqn2 = (diff(y,t) == 4*x-5*y+3*z+t);
eqn3 = (diff(z,t) == 4*x-4*y+2*z+t);
eqns = [eqn1 eqn2 eqn3];
[x,y,z] = dsolve(eqns)
解析解を見つけたら、絵を描きます。解析解の加算、減算、乗算、除算をドット乗算とドット パワーに置き換えることを忘れないでください。!!
simplify(y) % simplify函数可以简化表达式
latex(y) % 转换成latex代码,复制到Axmath或者word自带的公式编辑器
数値解法
[x,y] = ode45('df1',[0,2],3);
% [x,y] = ode45(@df1,[0,2],3); % 解决非刚性问题,这个解不出就试一试ode15s
% [x,y] = ode23('df1',[0,2],3);
% [x,y] = ode113('df1',[0,2],3);
% [x,y] = ode15s('df1',[0,2],3); % 解决刚性问题
%% 设定相对误差reltol和绝对误差,这样可以提高微分方程数值解的精度
options = odeset('reltol',1e-4,'abstol',1e-8);
[x,y] = ode45('df1',[0,2],3,options);
%% 如果觉得x的间隔不够小,我们可以指定要求解的位置
[x,y] = ode45('df1',[0:0.001:2],3,options);
%%%%% 有参数的话只能用函数句柄传参
[t,x]=ode45(@(t,x) newfun2(t,x,GAMMA),[1:500],[N-i0 i0 0]);
一階微分方程式
まず解析的な解があるかどうかを確認し、ない場合は数値的な解を求めます。
微分方程式は .m ファイルに標準形式で記述する必要があることに注意してください (方程式の左側は 1 次微分、右側は剰余です)。
%% 先看有无解析解,如果没有解析解再考虑数值解
[y1 y2 y3] = dsolve('Dy1=y2*y3',
'Dy2=-y1*y3',
'Dy3=-0.51*y1*y2',
'y1(0)=0,y2(0)=1,y3(0)=1','x')
%% 调用ode45函数求解微分方程df2.m,
% 自变量x的范围为[0,4*pi] ;初始值: y1(0)=0,y2(0)=y3(0)=1
[x, y] = ode45('df2', [0 4*pi], [0 1 1]);
% 返回值y是一个有3列的矩阵,第一列是y1、以此类推
% x 是范围中的一些取值,y是x对应的函数值,画出图像后用离散的数值解近似解析解的图像
plot(x, y(:,1), 'o', x, y(:,2), '*', x, y(:,3), '+')
legend('y1','y2','y3') % 加上标注
axis([0, 4*pi, -inf, +inf]) % 设置横坐标范围为0-4pi,纵坐标范围不需要设置,写成-inf到+inf
%%% df2.m文件:
function dy = df2(x,y)
% x是自变量,y是因变量,由y1,y2,y3组成
dy = zeros(3,1);
% 初始化用来储存因变量一阶导数的列向量(不能写成行向量)
dy(1) = y(2) * y(3);
dy(2) = -y(1) * y(3);
dy(3) = -0.51 * y(1) * y(2);
% 上面四行可以写成一行: dy = [ y(2) * y(3); -y(1) * y(3); -0.51 * y(1) * y(2)]
end
高次の微分方程式
高次の微分方程式の数値解を求めるには、まずそれらを 1 階の微分方程式に変換する必要があります (高度な数学で学習した方法を使用して次数を削減します)。
% 先看这个微分方程有没有解析解
dsolve('D2y=1000*(1-y^2)*Dy-y','y(0)=2,Dy(0)=0','x') % 警告: Explicit solution could not be found.
% 下面计算数值解
% 如果使用ode45函数会发现计算的非常慢,matlab一直显示正忙(windows电脑在命令行窗口按Ctrl+C可以终止运行)
% [x,y]=ode45('df4',[0,3000],[2,0]); % 求出这个微分方程df4的数值解
% 所以我们可以使用刚性问题的函数ode15s对其求解
[x,y]=ode15s('df4',[0,3000],[2,0]); % 求出这个微分方程df4的数值解
plot(x,y(:,1),'*') % 注意,y变量有两列,第一列是y1(我们要求的y),第二列是y2(y的一阶导数)
%%%%%%%%%%%%%% df4.m
function dy=df4(x,y)
dy=zeros(2,1);
dy(1)=y(2);
dy(2)=1000*(1-y(1)^2)*y(2)-y(1);
end
人口予測モデル
マルサス マルサスモデル
モデルの仮定と導出: (結果は緑色のボックス)
問題点: r は定数ではなく、人口が増加するにつれて減少します。まず、それが線形減少関数であると仮定します (エンジニアの原理) - ロジスティック モデル
ロジスティック成長遅延モデル
f(t) = xm/(1+(xm/3.9-1)*exp(-r*(t-1790)))
matlab 曲線近似ツールボックス 曲線近似
カスタムフィッティング方程式:
詳細オプションのパラメータを変更して適合を改善します: (右下の r および xm の開始点、上限および下限を変更します)
捕食者獲物モデル
捕食者と被食者のペアのみを考慮します: (指数関数的成長のマルサスのモデルに基づく)
餌が単独で存在する場合の成長率(捕食者の数に影響される)、捕食者のみの死亡率(獲物の数に影響される)、餌の人為的捕獲の影響(獲物の成長率が低下し、死亡率が増加する)捕食者のもの)
食料増加率 dx/dt = rx は正の符号で、サメ死亡率 dx/dt = -rx は負の符号です。!!
被食者は捕食者の数に比例する捕食される影響(マイナスの影響)、つまり-λxを考慮し、捕食者は被食者の数に比例する捕食の影響(プラスの影響)を考慮し
、つまり、+λx。
パラメータ x1 と x2 の初期値、r、e、λ の値はすべて自分で決定します。
結果分析
位相軌跡図:
人口競争モデル
資源が限られている場合には競争が存在するため、ロジスティック モデルに基づいて人口の自然増加を考慮する必要があります。また、自分の食料を奪い合う競争者の能力も考慮する必要があります (敵の数 x/N に比例)
私たちが考慮するのは成長率だけです
ここでの乗算が 1 を超えると、描画された画像が不安定になります。!
人口依存モデル
自身の番号のブロック効果を考慮する(ロジスティックモデルに基づく)
感染症モデル
Susceptible S(感受性)
Latent E(暴露)
Infected I(感染)
回復 R(回復)
基本モデル:
総人数Nには感染症システムの総人数のみが含まれるが、SIRモデルでは回復して再感染しない人はNに含まれないため、SIRモデルではN' =S+I 人の数は変化しますが、SIR
モデルでは、SI および SIS モデルでは、N = S+I は一定ですが、
SISRS モデルでは、回復した人は再び病気になるため、N = S+I+ R.
一定のSEIRでは完全に回復する人もいる為、人数は変化する N'=S+ E+I
拡張モデル:
出生率、死亡率、病気による死亡率を考慮すると、人の総数は一定ではないため、SIR モデルの人数には依然として N'=S+I の変化があり、SI、 SIS モデル; SIRS では、病気による出生と死亡は
死亡 N'=S+I と見なされます;
R が完全回復 R1 (再び病気にならない)、再病気の可能性 R2 に分けられることを考慮すると、N'=S+I +R2
法:
- その状態には微分方程式がいくつかあります。ボックスが状態です: ボックス内の状態を dS、dI、dE、dR、dND を微分します。自然死、dID 病気による死。
- 状態遷移図では、入力線は式の + 記号に対応し、出力線は - 記号に対応します。
SIモデル
人口移動、出生、死亡を無視すると、総人口 N = S + I
微分方程式:人為的にβとNを与え、SとIの数値解を求めて画像を描く
パラメータβ(接触率)が減少した場合
function dx=fun2(t,x)
global TOTAL_N % 定义总人数为全局变量
beta = 0.1; % 易感染者与已感染者接触且被传染的强度
if t > 60
beta = beta/10; % 第60期后禁止大规模聚会,使得传染强度beta缩小为原来的10倍
end
% beta = 0.1 - 0.001*t
% if beta < 0
% beta = 0;
% end
dx = zeros(2,1);
% x(1)表示S x(2)表示I
dx(1) = - beta*x(1)*x(2)/TOTAL_N;
dx(2) = beta*x(1)*x(2)/TOTAL_N;
end
出生率と死亡率を考慮する
病気による死亡のみを考慮する
出生率、死亡率、病気による死亡率を考慮する
SISモデル
治った後にまた病気になった場合の治癒率はα
回復率の向上
医療機器の更新と病院の建設
出生率、死亡率、病気による死亡率
SIに似ている
SIRモデル
ここでいう回復とは抗体を産生して再感染を防ぐことを指しますが、先ほどのSISは抗体を産生せずに一時的に回復することを指します。
回復率が上昇する
ワクチンと医療機器のアップグレード
病気による死亡率
SIRSモデル
病気による死亡
完全な回復と不完全な回復
SEIRモデル
潜在的な人は伝染しない
潜在的な人々は伝染する
未感染者が潜伏感染する確率と感染者から感染する確率を分ける