DEtools[DEplot] - 微分方程式系の解をプロット
|
使い方
|
|
DEplot(deqns, vars, trange, options)
DEplot(deqns, vars, trange, inits, options)
DEplot(deqns, vars, trange, xrange, yrange, options)
DEplot(deqns, vars, trange, inits, xrange, yrange, options)
DEplot(dproc, vars, trange, number, xrange, yrange, options)
|
|
パラメータ
|
|
deqns
|
-
|
1 階常微分方程式からなるリストまたは集合、または任意階数の単独微分方程式
|
dproc
|
-
|
1 階常微分方程式または任意階数の単独微分方程式の Maple プロシージャ (関数) 表現
|
vars
|
-
|
従属変数。または従属変数のリストまたは集合
|
trange
|
-
|
独立変数の範囲
|
number
|
-
|
'number'=integer 形式の方程式。deqns を式ではなく関数 (dproc) として指定した場合に微分方程式の数を示す。
|
inits
|
-
|
リストの集合またはリスト; 解曲線の初期条件
|
xrange
|
-
|
1 番目の従属変数の範囲
|
yrange
|
-
|
2 番目の従属変数の範囲
|
options
|
-
|
(オプション) keyword=value 形式の方程式
|
|
|
|
|
説明
|
|
•
|
初期条件のセットまたはリスト (下記参照)、1 階微分方程式系または単独の高階微分方程式系を指定すると、DEplot は数値解法を使用して解曲線をプロットします。
|
|
注意 : これは、問題の初期条件を標準的な形式、つまり、同一点における関数値および微分方程式の階数より 1 少ない値までのすべての導関数を指定しなければならないことを意味しています。
|
•
|
2 つの 1 階微分方程式による系が自律系として求められるように指定した場合、この系によって方向場プロットが生成されます。また、単独 1 階微分方程式では、方向場 (常に 2 つの 1 階自律方程式の系にマッピング可能) が生成されます。微分以外のすべての項と係数に独立変数が含まれていない場合、その系は自律系として計算されます。詳細は DEtools[autonomous] を参照してください。これらの基準を満たさない系の場合、方向場は生成されません (このような場合、解曲線のみ生成可能です)。指定できる独立変数は 1 つのみです。
|
•
|
デフォルトの積分手法は method=rkf45 です。その他の手法はオプションの方程式で指定できます。数値解法を使用してプロットが生成されるため、使用する数値解法の特性に出力が影響されることに注意してください。特に、漸近線を処理する場合に通常でない出力となることがあります。
|
•
|
scene オプションで指定していない限り、デフォルトで 2 つの従属変数がプロットされます。
|
•
|
deqns パラメータをプロシージャとして指定できますが、dsolve/numeric での指定と一致している必要があります。また、初期条件の前に number オプションを指定する必要があります。この場合、deqns は以下の形式でなければなりません。
|
proc( N, ivar, Y, YP )
|
...
|
YP[1] := f1(ivar,Y);
|
YP[2] := f2(ivar,Y);
|
...
|
end proc
|
|
|
|
ここで、N は 1 階方程式の数を表し、ivar は独立変数、Y は長さ N のベクトル、YP は (同値な 1 階の系に対する) プロシージャによって更新される導関数の長さ N のベクトルです。1 階方程式の計算に関する詳細は、DEtools[convertsys] を参照してください。N は 4 番目のパラメータ number で指定します。
|
•
|
inits パラメータは次のように指定する必要があります。
|
|
上記の例のように、リストの代わりに集合を使用できます。また、
|
|
リストまたはリストの集合の場合、各サブリストが初期条件の 1 つのグループを指定します。
|
•
|
xrange および yrange パラメータは次のように指定する必要があります。
|
|
デフォルトでは、解曲線に沿った積分は指定した範囲を 1 メッシュ超えた後の点で止まります。これは obsrange オプションで変更できます。
|
•
|
その他の例題については、deplot を参照してください。
|
|
|
オプション
|
|
•
|
オプションの方程式 eqns では以下のほか、plot および dsolve/numeric オプションの一部を使用できます。
|
'animatecurves'
'animatefield'
'animate'
'arrows'
'color'
'dirfield'
'dirgrid'
'iterations'
'linecolor'
'number'
'numframes'
'numpoints'
'numsteps'
'obsrange'
'scene'
'size'
'stepsize'
•
|
animatecurves = true または false (デフォルト = false)
|
•
|
animatefield = true または false (デフォルト = false)
|
|
animatefield は、時間に基づく方向場のアニメーション (つまり、方向場の矢印が解の時間経過とともに移動) を作成します。アニメーションフレームのデフォルト値は 25 です。この値は numframes オプションで変更できます。それぞれの矢印の軌跡を計算するために dsolve/numeric/rkf45 が使用されます。
|
•
|
animate = true または false (デフォルト = false)
|
|
animate は、 animatefield (使用できる場合)と animatecurves (使用できる場合) の両方を指定するためのショートカットです。
|
|
arrowtype には、'small'、'smalltwo'、'medium'、'mediumfill'、'large'、'curve', 'comet'、'line'、または 'none' のいずれかを使用できます。
|
|
arrowtype は方向場で使用される矢印の種類を指定します。方向場を使用できる場合のデフォルトは 'small' です。arrowtype に 'none' を指定すると、方向場の計算と表示が抑制されます。
|
•
|
color、colour = arrowcolor
|
|
arrowcolor は、いろいろな形式で指定できます。
|
2.
|
COLOR('HUE', realcons);
|
3.
|
COLOR('RGB', realcons, realcons, realcons);
|
|
ケース 4) では、矢印の色がフィールドの大きさによって決まります。最も小さい値は青、最も大きい値は赤になります。ケース 5) はケース 4) と同じですが、最大値と最小値の色を大きさのインデックスとして指定します (たとえば、magnitude は、magnitude[blue,red] に相当します)。ケース 6) と 7) では、平面上の矢印の座標が式またはプロシージャに渡されます。結果の値は範囲 [0,1] で正規化され 'HUE' 値として使用されます。ケース 8) と 9) では、結果の値が [0,1] で正規化され、RGB 値として使用されます。ケース 6) と 8) の場合は、プロットされた変数の式を指定する必要があることに注意してください。この色処理の形式は方向場を識別する機能で役に立ちます。
|
•
|
dirfield = [posint,posint]、posint、または [[float,float],[float,float],...]
|
|
[posint,posint] を使用すると、矢印を配置するグリッドが指定されます。これは非推奨の dirgrid オプションと同じです。posint を使用すると、方向場に使用される、ランダムに配置された矢印の数が指定されます。[[float,float],[float,float],...] を使用すると、矢印が描画される点を各サブリストが表します。
|
•
|
dirgrid = [posint, posint]
|
|
dirgrid オプションは下位互換性のために維持されています。このオプションは dirfield = [posint, posint] オプションに相当します。
|
|
iterations は、格納する点の数は一定にしたままでステップサイズを減らす方法を指定します。たとえば、stepsize=0.05 および iterations=5 を指定すると、内部ではステップサイズ を使用した計算が行われますが、結果は 5 つおきにしか格納されません。このオプションは numpoints に置き換わりました。また、classical 以外の手法では無視されます。
|
|
line_info は次の 5 つの形式のいずれかで指定できます。
|
2.
|
COLOR('HUE', realcons);
|
3.
|
COLOR('RGB', realcons, realcons, realcons);
|
|
ケース 4) と 5) では、独立変数の値が式またはプロシージャに渡されます。結果の値は [0,1] で正規化され、'HUE' 値として適用されます。この機能は、独立変数による解曲線の変化を表示する際に役に立ちます。
|
|
また、1) ~ 5) をリストとして組み合わせることもできます。この場合、解曲線ごとに 1 つの要素が考慮されます。各リスト要素が対応する解曲線に適用されます。
|
|
number は、dproc のプロシージャ形式の 1 階系の方程式数を指定します (上記の「使い方」を参照)。
|
|
numframes は、animate、animatefield、または animatecurves オプションを使用したアニメーションで使用されるフレーム数を指定します。
|
|
numpoints は、指定した時間範囲で曲線をプロットするための点の数を指定します。デフォルトの点の数は 49 です。アニメーションの場合、 は の整数倍でなければなりません。
|
|
numsteps を使用すると、stepsize パラメータをより便利な方法で指定することができます。trange=a..b の場合、numsteps=n を指定するとステップサイズ で計算が行われます。このオプションは numpoints とは無関係です。
|
|
注意 : このオプションは classical 固定ステップサイズ法にのみ適用されます。この方法はデフォルトではありません。
|
|
obsrange は、解曲線が指定した範囲を超えたら積分器を停止するかどうかを指定します。また、完全に表示領域外にある矢印を削除するかどうかも指定します (矢印ベースのアニメーションの場合)。この指定は、漸近的な挙動を持つ関数をプロットするときに有用です。デフォルトは true です。
|
|
scene は表示するプロットの座標軸を指定します。たとえば、scene=[x, y] を指定すると、t を隠して x 対 y (x は横軸) のプロットを表示します。一方、scene=[t, y] は t 対 y を明示的に t を使用してプロットします。このオプションを使用して、変数をプロットする順序を変更することもできます。vars を集合として指定した場合、デフォルトの順序はありません。vars をリストとして指定した場合、指定した順序が使用されます。
|
•
|
size = float または magnitude
|
|
size=magnitude を指定した場合、矢印のサイズは方向場の大きさに比例します。size を正の浮動小数点として指定した場合、方向場のすべての矢印のサイズがこの値に変更されます。デフォルト値は size=1.0 です。
|
|
stepsize は、classical 手法を使用して曲線を計算する場合に dsolve で使用されるステップサイズを指定します。trange=a..b の場合、デフォルト値は です。
|
|
|
例
|
|
最初の例は 1 階方程式です。これはニュートンの冷却の法則で、微分方程式は次のようになります。
>
|
NLC := diff(y(t),t) = k*(Am-y(t)); Am := 20; k := 0.1;
|
ここで、 は時間 のときの温度で、雰囲気温度 を 20 度、冷却速度定数 を 0.1 に設定しています。初期温度 10、30、50 度に対する解をプロットします。2 番目のプロットでは、時間範囲 と温度 を変更します。
>
|
ivs := [y(0)=10,y(0)=30,y(0)=50];
|
>
|
DEplot( NLC, y(t), t=0..20, ivs );
|
>
|
DEplot(NLC,y(t),t=0..40,y=0..60,ivs,arrows=medium,linecolor=black);
|
2 番目の例は および の 1 階系です。これは SIR モデルで、 は感受性集団、 は感染集団です。微分方程式は次のようになります。
>
|
deS := diff(x(t),t)=-0.5*x(t)*y(t);
|
>
|
deI := diff(y(t),t)=+0.5*x(t)*y(t)-0.15*y(t);
|
最初のプロットは 1 つの初期値 および を表示し、時間 で人口の 1% が感染していることを示します。
>
|
DEplot( [deS,deI], [x(t),y(t)], t=0..40, x=0..1, y=0..0.6,
[[x(0)=0.99,y(0)=0.01]], arrows=medium);
|
2 番目は解曲線の時間変化のアニメーションをプロットします。アニメーションを実行するには、プロットをクリックしてから、再生ボタンを押します。
>
|
DEplot( [deS,deI], [x(t),y(t)], t=0..40, x=0..1, y=0..0.6,
[[x(0)=0.99,y(0)=0.01]], arrows=medium, animatecurves=true);
|
3 番目の例は 2 階微分方程式です。これは減衰調和振動子 で、 は時間 における物体の位置、 はその質量、 はバネ定数、 は減衰定数です。
>
|
de := diff(x(t),t,t) = -x(t)-1/2*diff(x(t),t);
|
>
|
DEplot( de, x(t), t=0..15, x=-1..1, [[x(0)=1,D(x)(0)=0]] );
|
4 番目の例は上記と同じ減衰調和振動子を 2 つの 1 階方程式の系として入力したものです。ここで、 は速度です。デフォルトでは、プロットは 対 のプロットになります。2 番目のプロットでは、scene オプションを使用して 対 のプロットを取得します。3 番目のプロットでは、解曲線の品質を挙げるためにいくつかのオプションを指定します。
>
|
sys := {diff(x(t),t) = y(t), diff(y(t),t) = -x(t)-1/2*y(t)};
|
>
|
DEplot(sys,[x(t),y(t)],t=0..15,[[x(0)=1,y(0)=0]]);
|
>
|
DEplot(sys,[x(t),y(t)],t=0..15,[[x(0)=1,y(0)=0]],scene=[t,x(t)]);
|
>
|
DEplot(sys,[x(t),y(t)],t=0..15,[[x(0)=1,y(0)=0]],x=-1..1,y=-1..1,
numpoints=200, linecolor=black, axes=boxed);
|
次は上記と同じプロットですが、プロシージャ入力形式を使用しています。
>
|
F1 := proc(N,x,Y,YP) # First order system
YP[1] := Y[2];
YP[2] := -Y[1]-1/2*Y[2];
end proc;
|
>
|
DEplot(F1, [x(t),y(t)], t=0..15, number=2, [[y(0)=1,y(0)=0]],
x=-1..1,y=-1..1,numpoints=200,linecolor=black,axes=boxed);
|
5 番目の例は Lotka-Volterra の捕食者 - 被食者系のプロットです。 は被食者数、 は捕食者数です。最初のプロットは速度を色で示した方向場のプロットです。2 番目のプロットは方向場をランダムに配置された 300 個の "comets" として表示します。3 番目のプロットでは、方向場のアニメーションを生成し、4 番目のプロットでは解曲線のプロットを生成します。2 番目のアニメーションは、計算に 1 ~ 2 分間かかることがあります。
>
|
LVS := [diff(x(t),t)=x(t)*(1-y(t)),diff(y(t),t)=.3*y(t)*(x(t)-1)];
|
>
|
DEplot( LVS, [x(t),y(t)], t=0..10, x=-1..2, y=-1..2, arrows=large,
title=`Lotka-Volterra model`,color=magnitude);
|
>
|
DEplot( LVS, [x(t),y(t)], t=0..10, x=0..3, y=0..2, arrows=comet,
[[x(0)=1,y(0)=0.5]],title=`Lotka-Volterra model`,dirfield=500);
|
>
|
DEplot( LVS, [x(t),y(t)], t=0..12, x=0..3, y=0..2, arrows=comet,
[[x(0)=1,y(0)=0.5]],animatecurves=true,dirfield=300);
|
>
|
DEplot( LVS, [x(t),y(t)], t=0..12, x=0..3, y=0..2, arrows=comet,
animatefield=true,numframes=50,dirfield=300);
|
6 番目の例は の 3 つの微分方程式の系で、 対 の解のプロット方法を示しています。 対 対 のプロットを 3 次元でプロットするには、DEtools[DEplot3d] を使用してください。
>
|
sys := D(x)(t)=y(t)-z(t),D(y)(t)=z(t)-x(t),D(z)(t)=x(t)-y(t)*2;
|
>
|
DEplot([sys],[x(t),y(t),z(t)],t=-2..2,[[x(0)=1,y(0)=0,z(0)=2]],
scene=[z(t),x(t)],method=classical[foreuler],stepsize=0.05);
|
7 番目の例は 3 階方程式で、高階導関数と初期値の入力方法を説明しています。
>
|
de := cos(x)*diff(y(x),x$3)-diff(y(x),x$2)+Pi*diff(y(x),x)=y(x)-x;
|
>
|
DEplot(de,y(x),x=-2.5..1.4,[[y(0)=1,D(y)(0)=2,(D@@2)(y)(0)=1]],y=-4..5);
|
次の例は、矢印と色のさまざまなオプションと、系の固定点に対して直接解くことのできる系の代替入力方法を説明しています。この系は Lotka-Volterra 系を変更したものです。ここで使用されているプロット作成コマンドの詳細は『プロットガイド』を参照してください。
>
|
f := (x,y) -> x*(1-y-0.1*x): g := (x,y) -> 0.3*y*(x-1):
|
>
|
MLV:=[diff(x(t),t)=f(x(t),y(t)), diff(y(t),t) = g(x(t),y(t))];
|
>
|
solve({f(x,y)=0,g(x,y)=0},{x,y}); # the fixed points
|
>
|
ivs:=[[x(0)=1,y(0)=0.5],[x(0)=1,y(0)=1.5]];
|
>
|
DEplot(MLV,[x(t),y(t)],t=0..10,ivs,arrows=smalltwo,
dirfield=[12,12],color=magnitude[green,red]);
|
>
|
DEplot(MLV,[x(t),y(t)],t=-8..8,ivs,arrows=mediumfill,
color=[f(x(t),y(t)),g(x(t),y(t)),0.5],linecolor=t/2);
|
>
|
DEplot(MLV,[x(t),y(t)],t=0..10,ivs,arrows=comet,dirfield=200,
color=magnitude,linecolor=black);
|
>
|
DEplot(MLV,[x(t),y(t)],t=0..10,ivs,arrows=comet,dirfield=200,
size=magnitude,linecolor=[cyan,yellow],thickness=5);
|
次の例は、方向場が実数値の領域にのみ矢印をプロットします。
>
|
DEplot(diff(y(x),x)=1/2*(-x-(x^2+4*y(x))^(1/2)),y(x),x=-3..3,y=-3..2,
title=`Restricted domain`,color=1/2*(-x-(x^2+4*y)));
|
最後の例は、アニメーションを使用した微分方程式のさまざまなパターンを説明しています。アニメーションを実行するには、プロットをクリックしてから、再生ボタンを押します。
>
|
vdP := [diff(x(t),t)=10*(y(t)-x(t)^3/3+x(t)),diff(y(t),t)=-1/10*x(t)];
|
>
|
DEplot(vdP,[x(t),y(t)],t=0..20,x=-3..3,y=-2..2,[[x(0)=0.2,y(0)=0.2]],
title=`van der Pol oscillator`,dirfield=400,arrows=comet,
size=magnitude,numpoints=505,linecolor=blue,animatecurves=true);
|
>
|
DEplot(vdP,[x(t),y(t)],t=0..20,x=-2..2,y=-1..1,
title=`van der Pol oscillator`,dirfield=[[0.2,0.2],[-0.2,-0.2]],
arrows=comet,color=blue,animatefield=true,numframes=100);
|
>
|
DEplot([diff(x(t),t)=y(t),diff(y(t),t)=-sin(x(t))],[x(t),y(t)],
t=0..10,[[x(0)=0,y(0)=.5],[x(0)=0,y(0)=1],[x(0)=0,y(0)=1.8],
[x(0)=-2*Pi,y(0)=1],[x(0)=2*Pi,y(0)=.5],[x(0)=-2*Pi,y(0)=2.1],
[x(0)=2*Pi,y(0)=-2.1]],title=`Pendulum Vibrations`,dirfield=300,
arrows=comet,color=magnitude,linecolor=blue,animate=true);
|
>
|
r:=0.7*sqrt(x(t)^2+y(t)^2):
|
>
|
des:=[diff(x(t),t)=sin(r)*x(t)-y(t), diff(y(t),t)=sin(r)*y(t)+x(t)];
|
>
|
DEplot(des,[x(t),y(t)],t=0..2,x=-15..15,y=-15..15,color=magnitude,
title=`Stable Limit Cycles`,arrows=curve,dirfield=800,axes=none);
|
>
|
DEplot(des,[x(t),y(t)],t=0..2,x=-15..15,y=-15..15,
title=`Stable Limit Cycles`,arrows=comet,dirfield=300,animate=true);
|
|
|