[英]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.