1

まず、差分方程式系 (過度に単純化された Solow-Romer 経済モデル) から始めます。

差分方程式のソロローマー システム

t付き文字は、次のように離散時間を示します。Y[t=0], Y[t=1], Y[t=2], ...

具体的には:

eq1: Y[t] = A[t]*K[t]^(1/3)*Ly[t]^(2/3);
eq2: K[t+1] - K[t] = s*Y[t] - d*K[t];
eq3: A[t+1] - A[t] = z*A[t]*La[t];
eq4: Ly[t] + La[t] = L;
eq5: La[t] = l*L;

Endogenous variables (unknowns), and their initial conditions:
    Y[t]          Y[0] = 9663.8253
    K[t]          K[0] = 100.0
    A[t]          A[0] = 100.0
    Ly[t]        Ly[0] = 95.0
    La[t]        La[0] = 5.0

Exogenous variables (givens):
    s: 0.15;
    d: 0.07;
    z: 0.02;
    l: 0.05;
    L: 100.0;

これは、5 つの未知数の 5 つの方程式です。システムを数値的に「解く」ことは、実際には些細なことです。t=0初期条件から始めて、差分方程式から計算K[1]A[1]、それから計算Y[1]するだけです。

その些細な性質にもかかわらず、私は実際にそうする方法を決定し、Maxima で結果の曲線をプロットすることができませんでした。

私は微分方程式アプローチ (実際には微分代数的) が Maxima の機能をより助長するのであれば、完全に満足しています。いずれにせよ、それは数値解法で同等である必要があります。

微分代数方程式のソロローマー系

あれは:

eq1: Y(t)=A(t)*K(t)^(1/3)*Ly(t)^(2/3);
eq2: diff(K(t),t) = s*Y(t)-d*K(t);
eq3: diff(A(t),t) = z*A(t)*La(t);
eq4: Ly(t)+La(t) = L;
eq5: La(t) = l*L;

しかし、繰り返しになりますが、ルンゲ・クッタやその他の組み込みソルバーを使用して、この系を数値的に解いてプロットする方法がわかりません (これは、上記の代数方程式が の形式で簡単に書き直せる場合でも当てはまります0=f(Y,A,K,Ly,La))。

この時点で、私は実際には何の進歩もしていません。微分方程式 ( ) に対して私が目にする唯一のツールはdiff_rec2、そのようなシステムの記号解のために設計されていますが、一般に、経済モデルは閉じた形式では表現できません。Runge-Kutta ( rk) は (私が見る限り) 代数方程式を受け入れません。次にどこを見ればよいかわかりません。

最終的には、このモデルや同様のモデルの直接時間計算の性質を考えると、これは非常に簡単だと思います。とはいえ、手動操作を実行したり、これを特別なケースにしたりすることは避けたいと思います。McKinnon (1997) のオープン エコノミーなど、将来的にはより複雑なモデルを実装する予定であるため、このような連立方程式の一般的な解法に特に関心があります。


編集:

Robert's (accepted) Answer のおかげで、上記の転送時間差分方程式の例の完全に機能するコピーと貼り付けのソリューションを次に示します。

Y[t] := A[t]*K[t]^(1/3)*Ly[t]^(2/3);
K[t] := K[t - 1] + s*Y[t - 1] - d*K[t - 1];
A[t] := A[t - 1] + z*A[t - 1]*La[t - 1];
Ly[t] := L - La[t];
La[t] := l*L;

s : 0.15;
d : 0.07;
z : 0.02;
l : 0.05;
L : 100.0;

A[0] : 100.0;
K[0] : 100.0;

sol : makelist ([Y[n], K[n], A[n], Ly[n], La[t]], n, 0, 30);
v : makelist ([p-1, sol[p][1]], p, 1, 30);

plot2d ([discrete,v,0,30], logy);
4

1 に答える 1

2

ええと、与えられた方程式の解を計算することが目的なら、いわゆるメモ化関数 (すなわち、結果を計算して記憶する関数) を使ってそれを行うことができると思います。Maxima では、そのような関数は(通常の非メモ化関数のf[k] := ...代わりに)によって定義されます。f(k) := ...この場合、次のようになると思います。

Y[t] := A[t]*K[t]^(1/3)*Ly[t]^(2/3);
K[t] := K[t - 1] + s*Y[t - 1] - d*K[t - 1];
A[t] := A[t - 1] + z*A[t - 1]*La[t - 1];
Ly[t] := L - La[t];
La[t] := l*L;

 Y[0] : 9663.8253;
 K[0] : 100;
 A[0] : 100;
Ly[0] : 95.0;
La[0] : 5.0;

s: 0.15;
d: 0.07;
z: 0.02;
l: 0.05;
L: 100.0;

そして、例えば計算することができますmakelist ([Y[n], K[n], A[n], Ly[n], La[t]], n, 1, 10);

方程式を自分で並べ替えることができれば、それはうまくいきます。この場合は簡単です。他の問題を解決する必要があり、そのアプローチが失敗する場合は、より強力なものが必要になります。何を提案すればよいかわかりません。私のアドバイスは、Maxima に関するほとんどの議論が行われている maxima-discuss@lists.sourceforge.net メーリング リストで質問することです。

于 2015-11-28T01:14:09.233 に答える