Maxima中差分/微分代数方程组的数值解

时间:2015-11-26 18:10:59

标签: differential-equations maxima difference-equations

我从一个差分方程组(一个过度简化的Solow-Romer经济模型)开始:

Solow-Romer System of Difference Equations

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的能力,我对微分方程方法(真正的微分代数方法)非常满意。无论如何,这应该在数值解决方案中是等效的:

Solow-Romer System of Differential-Algebraic Equations

那是:

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;

但是,再一次,我没有看到用Runge-Kutta或其他内置求解器在数值上求解和绘制这个系统的方法(即使上面的代数方程可以很容易地重写在形式中也是如此) 0=f(Y,A,K,Ly,La))。

此时,我还没有取得任何进展。我看到的差分方程(diff_rec2)的唯一工具是为这类系统的符号解决方案而设计的,但总的来说,经济模型不能以封闭形式表达。 Runge-Kutta(rk)不接受代数方程(据我所知),我不知道下一步该在哪里看。

最终,考虑到这个和类似模型的直接前向时间计算性质,我认为这将是非常简单的。也就是说,我确实希望避免执行手动操作或将其转换为特殊情况。我对这种方程系统的通用求解方法特别感兴趣,因为我计划在未来实现更复杂的模型,例如McKinnon(1997)开放经济。

修改

感谢罗伯特(已接受)答案,这是针对上述前向时差方程示例的完全复制粘贴解决方案:

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);

1 个答案:

答案 0 :(得分: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-discuss@lists.sourceforge.net邮件列表上询问大多数关于Maxima的讨论。