繁体   English   中英

如何求解给定微分方程的库兹涅茨曲线增长模型?

[英]How to solve Kuznets curve growth model for the given differential equation?

语境:

使用 Maddison 项目实际人均​​ GDP 数据集,我使用最小二乘法推导出以下等式:0.012406 + 0.005132 ln(g) - 0.006304 ln(g)**2

当我试图预测不同经济群体到 2050 年的人均 GDP 时,我参考了本文的方法“Tilman et al. 10.1073/pnas.1116437108”,以了解他们如何尝试求解微分方程:dG/dt = G(-0.6284 + 0.157lnG - 0.0093ln(G)^2

我以同样的方式转换了我的最小二乘:-0.012406 g + g 0.005132 math.log(g) - g 0.006304*math.log(g)**2

我正在尝试在 python 中解决 ODE 的几个初始值,以获得库兹涅茨曲线并估计 2050 年。我使用了下面的代码,但我无法解决相同的问题。

蟒蛇代码:

import numpy as np
import matplotlib.pyplot as plt
import scipy as sp
from scipy.integrate import odeint
from scipy.integrate import solve_ivp 
import math

def solveit(y0):
    def gdp(g, t):
        y = g
        dgdt = [-0.012406*g  + g*0.005132*math.log(g) - g*0.006304*math.log(g)**2]
        return dgdt

#initial conditions
    #y0 = [785.60] 
    t = np.linspace(0, 60000, 1000)
#call integrator
    sol = odeint(gdp, y0, t)
    m = sol[:]
    plt.plot(t,m)
    plt.show()


ys= [[785.60],[1860],[7800]]

fig = plt.figure()
for y_ in ys:
    solveit(y_)

plt.legend(loc='best')
plt.grid()
plt.show()

错误信息:

RuntimeError: The array return by func must be one-dimensional, but got ndim=2.

有关相同的指示会有所帮助。

odeint调用用户提供的func参数时,它会传入一个数组作为状态向量y 即使系统是单个标量方程, y也将作为长度为 1 的一维数组传入。在您的情况下,这意味着g将是长度为 1 的一维数组。您在gdp中有这个:

    dgdt = [-0.012406*g  + g*0.005132*math.log(g) - g*0.006304*math.log(g)**2]
    return dgdt

问题是dgdt表达式中的额外括号。 g已经是一维数组,因此-0.012406*g也是如此。 事实证明, math.log(g)实际上返回了一个标量,但是一个标量加上一个长度为 1 的一维 NumPy 可以满足您的预期,因此在这种情况下它不会导致问题。 所以完整表达式-0.012406*g + g*0.005132*math.log(g) - g*0.006304*math.log(g)**2的结果也是一个一维 NumPy 数组(长度为 1)。 当您将结果包装在括号中时,您会增加数据结构的“深度”。 实际上,您创建了一个二维数组(具有平凡的形状 (1, 1))。 例如,在下面, w是一个长度为 1 的一维数组:

In [23]: w = np.array([1.0])

In [24]: np.shape(w)
Out[24]: (1,)

In [25]: np.shape([w])
Out[25]: (1, 1)

请注意, [w]具有形状(1, 1) ,即它是一个二维数组。 odeint期望用户函数返回一个一维数组,但它从您的函数中获取一个二维数组并引发错误。

修复很简单:删除那些括号:

    def gdp(g, t):
        dgdt = -0.012406*g  + g*0.005132*math.log(g) - g*0.006304*math.log(g)**2
        return dgdt

(请注意,我删除了y = g行,这没有用。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM