Модель Гудвина: эмпирический анализ в Julia

Автор
avatar-alexsaralexsar
Notebook

Julia как инструмент эмпирического анализа моделей Гудвина и Самуэльсона

Вводные соображения

Предворяя свой эмпирический анализ классических моделей эномических циклов, приведу дословно соображения авторов из статьи "Simulation of business and financial cycles: self-oscillation and synchronization"[1].

"Основной интерес при изучении большинства процессов и явлений, рассматриваемых современной наукой, связан с динамическими закономерностями. Динамика современных технических, биологических, социо-экономических систем и процессов обладает исключительной сложностью.Однако, несмотря на сложность, поведение этих систем на достаточно больших отрезках времени определяют сравнительно простые динамические модели и закономерности, такие, в частности, как предельные циклы, торы, странные хаотические аттракторы, метастабильные со- стояния. ....... Изучению колебательных экономических и социальных явлений посвящено огромное число публикаций, однако, надо признать, что среди них сравнительно мало публикаций, связанных с разработкой и анализом адекватных математических моделей нелинейной динамики социо-экономических систем. Это можно объяснить рядом причин, в частности, сложностью формального описания социально-экономических явлений, трудностью, а, иногда, невозможностью измерения параметров моделей, трудностями экспериментальной проверки моделей, обуслов- ленными экстремально большими периодами колебаний и др."

Если с первым тезисом авторов я могу полностью согласится, то второй требует привести собственные соображения, которые и вызвали к жизни эту работу. Моделей, связанных с математическим описанием экономических циклов, известно достаточно много и многие из них появились довольно давно. При этом теоретический анализ для получения практически значимых выводов часто затруднен по целому ряду причин. Появление в последнее время мощного программно-технического инструментария открывает большие возможности для эмпирического исследования и модификации классических динамических моделей экономических циклов.Большая наглядность, возможность варьирования значительного числа параметров, стохастическая иммитация позволяют эмпирически получать важные теоретические и практические результаты.

В данный небольшой работе я хотел показать на известных моделех Гудвина и Самуэльсона, как в принципе можно осуществлять их модификацию и эмпирический анализ, получая при этом очень наглядные результаты.

Модель Гудвина.

Экономические основания модели и ее базовое математическое представление [2]

В основе модели лежат переменные, описывающие производство — Y и потребление — C, связанные между собой соотношением:

                 C=αY +β                     (1)

Константа α характеризует пропорциональность между производством и потреблением (α < 1), а константа β — потребление в отсутствие производства (охота, собирательство и т. д.). Еще одна переменная K описывает основной капитал, который включает заводы, оборудование и т. д. Капитал пополняется в процессе производства, что может быть описано уравнением:

                      Y = C + I             (2)

Здесь переменная I, называемая инвестициями, является производной по времени от величины K (далее мы используем стандартное обозначение для производной по времени) :

                  dK/dt = I.                (3)

Исключая переменную C из уравнений (1) и (2), приходим к уравнению:

                  Y =I +β/1−α               (4)

Два уравнения (3) и (4) связывают три переменные: K,Y и I. Третье уравнение может быть получено тем или иным способом из основной идеи модели Гудвина о том, что владельцы капитала через посредство изменения инвестиций стремятся управлять капиталом так, чтобы капитал был адекватен производству. Эта адекватность на математическом языке описывается уравнением:

                  K = γY ,                  (5)

где γ — некоторая константа. В общем случае это означает, что инвестиции следует уменьшать при K > Y и увеличивать в случае противоположного неравенства. Кроме того, следует учитывать определенную ограниченность в стремлении управлять капиталом. Даже если ничего не вкладывать в добавление капитала, он уменьшается вследствие амортизации оборудования. Это означает, что величина I ограничена снизу некоторым отрицательным значением Imin. Из общих соображений можно понять, что эта величина также ограничена сверху некоторым значением Imax. Всё это можно написать в виде математического соотношения:

                   I = f (K −γY ),            (6)

где f — некоторая функция, которая удовлетворяет вышеописанным свойствам, то есть уменьшается с увеличением аргумента и ограничена снизу и сверху. Разные виды моделей, возникающие при том или ином способе моделирования функции f , описаны в книге [7]. Для аналитического исследования уравнений, например, удобно моделировать эту функцию в виде скачкообразного изменения в диапазоне от Imin до Imax, так чтобы между скачками значение I было постоянным. Для численных расчетов, когда решается система дифференциальных уравнений, удобны модели с гладкими функциями, конкретный вид которых будет приведен далее. Из уравнений (3), (4) и (6) следует, что существуют некоторые стационарные значения K0 и Y0, при которых с течением времени все переменные остаются постоянными, причем I0 = 0. Несложные вычисления дают значения:

            Y0 =β/1−α , K0 =γβ/1−α             (7)

Однако, как показывает анализ модели, стационарное состояние является неустойчивым. Если начальное состояние системы характеризуется некоторой точкой вблизи точки стационарного состояния, то с течением времени система отдаляется от стационарного состояния, и начинаются колебания.

Разные виды моделей, возникающие при том или ином способе моделирования функции f , описаны в книге [ ] . Для аналитического исследования уравнений, например, удобно моделировать эту функцию в виде скачкообразного изменения в диапазоне от Imin до Imax так, чтобы между скачками значение I было постоянным. То есть функция f (K −γY ) выбирается в виде:

$$ f\left( {K - \gamma Y} \right) = \left\{ {\begin{array}{*{20}c} {{\mathop{\rm I}\nolimits} _{\min } ,K > \gamma Y} \\ {I_0 ,K = \gamma Y} \\ {{\mathop{\rm I}\nolimits} _{\max } ,K < \gamma Y} \\ \end{array}} \right. $$ Для численных расчетов, когда решается система дифференциальных уравнений удобны модели с гладкими функциями f (K − γY ), конкретный вид которых будет приведен далее. Перед проведением численных расчетов следует еще несколько усложнить модель. Из уравнения (4) следует, что изменения инвестиций мгновенно приводят к изменению производства. В реальности изменения производства несколько запаздывают по сравнению с изменениями инвестиций (см. [7]), так что, вместо соотношения (4), получим:

             Y (t +∆t) = I(t)+β/1−α ,

где ∆t — некоторый малый параметр. Предполагая, что ∆t — малая величина, можно разложить левую часть равенства по степеням ∆t и ограничиться первым членом разложения. В результате получаем уравнение:

        dY(t)/dt ∆t +Y (t) = I(t)+β/1−α     (8)

Аналогично из формулы (6) следует, что изменения величин K и Y мгновенно сказываются на изменении величины I. Однако владельцу капитала необходимо некоторое время ∆t1 для принятия решения об изменении инвестиций. Повторяя аналогичные действия, переходим от уравнения (6) к уравнению:

     dI(t)/dt ∆t1 + I(t) = f(K(t)−γY (t))  , (9)

где ∆t1 — малый параметр. Уравнения (3), (8) и (9) при заданной каким-либо соотношением функции f образуют систему дифференциальных уравнений 1-го порядка, которую можно записать в традиционном виде:

$$ \left\{ {\begin{array}{*{20}c} {\frac{{dK}}{{dt}} = I} \\ {\frac{{dY}}{{dt}} = \frac{1}{{\Delta t}} \cdot \left( {\frac{{I + \beta }}{{1 - \alpha }} - Y} \right)} \\ {\frac{{dI}}{{dt}} = \frac{1}{{\Delta t_1 }} \cdot \left( {f\left( {K - \gamma \cdot Y} \right) - I} \right)} \\ \end{array}} \right. \;\;\;\;(10) $$

Численное исследование этой системы уравнений затруднено слишком большим числом параметров, которые так или иначе нужно задавать при численном моделировании. Уменьшение числа параметров достигается сдвигом и масштабированием переменных.

После целого ряда преобразований можно получить модель Гудвина в виде следующей системы ОДУ:

$$ \left\{ {\begin{array}{*{20}c} {\frac{{dK}}{{dt}} = I} \\ {\frac{{dY}}{{dt}} = \frac{1}{\tau } \cdot \left( {I - Y} \right)} \\ {\frac{{dI}}{{dt}} = \frac{1}{\theta } \cdot \left( {f\left( {K - Y} \right) - I} \right)} \\ \end{array}} \right. \;\;\;\;(11) $$

Здесь $\tau$ и $\theta$ параметры запаздывания влияния I и K. Для дальнейших расчетов нужно выбрать модель для функции f (K −Y ). Она должна убывать с ростом (K − Y) и обращаться в ноль при нулевом значении этой величины. Кроме того, эта функция должна быть ограничена снизу отрицательным значением −µ/(1+µ) и сверху положительным значением 1/(1 + µ). В качестве f можно использовать функция, за основу которой взята функция arctg(x). Подобная функция содержит два параметра, в качестве которых можно выбрать вышеопределенный параметр µ и параметр λ — модуль тангенса наклона кривой в начале координат. При такой параметризации функция f (K −Y ) принимает вид:

$$f\left( {K - Y} \right) = \frac{1}{\pi }\left( {arctg\left( \rho \right) - arctg\left( {\lambda \cdot \pi \left( {1 + \rho ^2 } \right) \cdot \left( {K - Y} \right) + \rho } \right)} \right)\;\;\;\;(12)$$

где $\rho = tg\left( {\frac{\pi }{2} \cdot \frac{{1 - \mu }}{{1 + \mu }}} \right)$.

Численное исследование модели (11)

Четыре параметра модели τ,θ,λ и µ имеет довольно ясный смысл. Параметр τ определяет сдвиг по времени между изменением инвестиций и изменением производства.Параметр θ — сдвиг по времени перед принятием решения об изменении инвестиций после анализа состояния системы. Параметр λ — стремление управлять капиталом. Параметр µ — отношение возможной убыли капитала вследствие амортизации оборудования к восстановлению капитала вследствие максимально возможных инвестиций. В соответствии с идеей модели Гудвина, это отношение меньше единицы [7]. Небольшое число параметров позволяет провести некоторое исследование модели на основе численного эксперимента.

В подобных моделях, когда отсутствуют какие-либо соображения по приблизительным величинам параметров и переменных, целесообразно выделить малые параметры, которые положить принимающими значения от 0.1 до 0.9, а остальные параметры положить равными нескольким единицам, или, если параметр по смыслу меньше единицы, — нескольким десятым. Примем простейший набор параметров τ = θ = 0.7, λ = 3.0, µ = 0.35 и при значениях начальных условий в близи нулевой стационарной точки: K0=Y0=I0=0.01. Разработанный Julia скрипт показал, что, в соотвествии с теорией,исследуемые переменные быстро ререходят в колебательнай режим и их атрактор переходит из начальной точки замкнутый ценр.

In [ ]:
#using Pkg
#Pkg.instantiate()
using DifferentialEquations, Plots, PlotThemes
function Gudvin0!(du, u, p, t)
    τ, θ, λ, μ  = p
    ρ =tan(0.5*π*(1-μ)/(1+μ)) 
    du[3] = u[2]
    du[1] = (1/τ)* (u[2] -u[1]) 
    du[2] = (1/θ)*((1/π)*(atan(ρ)-atan(λ*π*(1+ρ^2)*(u[3]-u[1])+ρ))-u[1])   
    
end
Out[0]:
Gudvin0! (generic function with 1 method)
In [ ]:
#параметры модели
τ = 0.7;
θ = 0.7;
λ = 3.0;
μ = 0.35

u0 = [0.01, 0.01, 0.01]
tspan = (0.0, 30.0)
p = (τ,θ,λ,μ)

prob0 = ODEProblem(Gudvin0!, u0, tspan, p)
sol0 = solve(prob0, abstol=1e-8, reltol=1e-8)
plotly()
theme(:dao)
p1=plot(sol0.t, sol0[1, :], title="Y,I,K", xlabel="t",label="Инвестиции-I", lw=2)
plot!(sol0.t, sol0[2, :],label="Капитал-K", lw=2)
plot!(sol0.t, sol0[3, :],label="Доход-Y", lw=2)
p2=plot(sol0[1, :],sol0[2, :],sol0[3, :],title="Фазовый портрет",label="Атрактор",lw=3)
plot(p1,p2,layout=(1, 2), wsize=(980, 400),legend=:outertopright)
Out[0]:

Углубленный анализ модели Гудвина.

Рассмотрим модель экономической динамики Гудвина как модель нелинейного акселератора-мультипликатора, которая может быть записана в виде [3]:

$$\tau \cdot \theta \cdot \frac{{\partial ^2 x}}{{\partial t^2 }} + (\tau + \left( {1 - a} \right) \cdot \theta ) \cdot \frac{{dx}}{{dt}} - \varphi \left( {\frac{{dx}}{{dt}}} \right) + \left( {1 - a} \right) \cdot x\left( t \right) = Q\left( t \right)$$

где $x$ означает доход, $a$ предельный уровень потребления, $τ$ константа представляющая запаздывание в динамике коэффициента развития, $θ$ запаздывание между решением об инвестировании и соответствующими расходами, инвестиции индуцированные изменениями дохода и Q(t) размер независимых издержек по времени. Обобщенная форма этого уравнения была дана Лоренцем:

$$\frac{{\partial ^2 x}}{{\partial t^2 }} + A\left( {x\left( t \right)} \right) \cdot \frac{{dx}}{{dt}} + B\left( {x\left( t \right)} \right) = Q\left( t \right)$$

здесь $x$ – отклонение дохода от равновесия, $A(x)$ – четная функция с условиями $A(0) < 0$; $A′′(0) > 0, B(x)$ – нечетная функция с условием $B(0) = 0$, $Q(t)$ – функция издержек. В своих исследованиях Лоренца и Нуссэ [4] предложили конкретный вид функций $A(x)$ и $B(x)$ :

$$\frac{{\partial ^2 x}}{{\partial t^2 }} + a \cdot \frac{{dx}}{{dt}} \cdot \frac{{\left( {x^2 - 1} \right)}}{{\left( {x^2 + 1} \right)}} - b \cdot x + c \cdot x^3 = Q(t)$$

Функцию $Q(t)$ можно трактовать как некоторое внешнее воздействие. Рассмотрим три случая: $Q(t) = 0$ ; $Q(t)$ -некоторая детерминированная переодическая функция; $Q(t)$ - некоторая стохастическая переодическая функция.

1. Случай $Q(t) = 0$

В этом случае модель Гудвина (дифференциальное уравнение второго порядка) можно привести к системе дифуров 1-го порядка:

$${\frac{{dx}}{{dt}} = y}$$ $$\frac{{dy}}{{dt}} = - a \cdot y \cdot {\textstyle{{\left( {x^2 - 1} \right)} \over {\left( {x^2 + 1} \right)}}} + b \cdot x - c \cdot x^3$$

В этой системе существуют три равновесия $M_0(0,0)$ , $M_1 = \left( {\sqrt {\frac{b}{c}} ,0} \right)$, $M_2 = \left( {-\sqrt {\frac{b}{c}} ,0} \right)$.

Равновесие $M_0$ зависит от всех трех параметров. Исследуем эту зависимость. Исходя из экономического смысла параметров: $a$ определяет предельный уровень потребления при соотвествующих значениях $b$ и $c$ ; $0.0< b <1.0$ - норма потребления; $с$-коэффициент снижения дохода, чем он меньше тем больше доход. Зададим следующие значения:$a=[2.0, 2.8]$ ; $b=[0.25, 0.60]$ ; $c=[0.15, 0.2]$. Проведем соответствующие расчеты с помощью разработанного нами скрипта Julia (см. ниже).

In [ ]:
using DifferentialEquations, Plots, PlotThemes
function Gudvin1!(du, u, p, t)
    a, b, c = p
    du[2] = u[1]
    du[1] = -a * u[1] * ((u[2]^2 - 1) / (u[2]^2 + 1)) + b * u[2] - c * u[2]^3
end
Out[0]:
Gudvin1! (generic function with 1 method)
In [ ]:
using Plots, PlotThemes
#plotly()
#параметры модели
A = [2.0, 2.8]
B = [0.25, 0.60]
C = [0.15, 0.2]
u0 = [0.0001, 0.0]
tspan = (0.0, 40.0)
theme(:dao)


a = A[1]
k = 0
for j in (1:2)
    c = C[j]
    for i in (1:2)
        b = B[i]
        p = (a, b, c)
        prob = ODEProblem(Gudvin1!, u0, tspan, p)
        sol = solve(prob, abstol=1e-8, reltol=1e-8)
        k = k + 1
        if (k == 1)
            global p1 = plot(sol.t, sol[2, :], title="x(t) a= $a b= $b c= $c", ylabel="x(t)", lw=2)
            global p2 = plot(sol[1, :], sol[2, :], title="Фазовый портрет", ylabel="x", xlabel="y", lw=1)
        elseif (k == 2)
            global p3 = plot(sol.t, sol[2, :], title="x(t) a= $a b= $b c= $c", ylabel="x(t)", lw=2)
            global p4 = plot(sol[1, :], sol[2, :], title="Фазовый портрет", ylabel="x", xlabel="y", lw=1)
        elseif (k == 3)
            global p5 = plot(sol.t, sol[2, :], title="x(t) a= $a b= $b c= $c", ylabel="x(t)", lw=2)
            global p6 = plot(sol[1, :], sol[2, :], title="Фазовый портрет", ylabel="x", xlabel="y", lw=1)
        else
            global p7 = plot(sol.t, sol[2, :], title="x(t) a= $a b= $b c= $c", ylabel="x(t)", lw=2)
            global p8 = plot(sol[1, :], sol[2, :], title="Фазовый портрет", ylabel="x", xlabel="y", lw=1)
        end
    end
end


plot(p1, p2, p3, p4, p5, p6, p7, p8, layout=(4, 2), wsize=(900, 900), legend=false)
Out[0]:
In [ ]:
a = A[2]
k = 0
for j in (1:2)
    c = C[j]
    for i in (1:2)
        b = B[i]
        p = (a, b, c)
        prob = ODEProblem(Gudvin1!, u0, tspan, p)
        sol = solve(prob, abstol=1e-8, reltol=1e-8)
        k = k + 1
        if (k == 1)
            global p1 = plot(sol.t, sol[2, :], title="x(t) a= $a b= $b c= $c", ylabel="x(t)", lw=2)
            global p2 = plot(sol[1, :], sol[2, :], title="Фазовый портрет", ylabel="x", xlabel="y", lw=1)
        elseif (k == 2)
            global p3 = plot(sol.t, sol[2, :], title="x(t) a= $a b= $b c= $c", ylabel="x(t)", lw=2)
            global p4 = plot(sol[1, :], sol[2, :], title="Фазовый портрет", ylabel="x", xlabel="y", lw=1)
        elseif (k == 3)
            global p5 = plot(sol.t, sol[2, :], title="x(t) a= $a b= $b c= $c", ylabel="x(t)", lw=2)
            global p6 = plot(sol[1, :], sol[2, :], title="Фазовый портрет", ylabel="x", xlabel="y", lw=1)
        else
            global p7 = plot(sol.t, sol[2, :], title="x(t) a= $a b= $b c= $c", ylabel="x(t)", lw=2)
            global p8 = plot(sol[1, :], sol[2, :], title="Фазовый портрет", ylabel="x", xlabel="y", lw=1)
        end
    end
end


plot(p1, p2, p3, p4, p5, p6, p7, p8, layout=(4, 2), wsize=(900, 900), legend=false)
Out[0]:

Как видно из графиков, в восьми исследованных точках пространства параметров a,b,c мы нашли две точки (2.0,0.25,0.2) и (2.8,0.25,0.20), в которых система из $M_0$ переходит в колебательный режим (аттрактор седло). В остальных исследуемых точках система переходит в устойчивое состояние (аттрактор устойчивый фокус).Если детально исследовать пространство параметров (задать небольшой шаг по каждому параметру,то можно найти точки биффуркации,где система переходит из одного состояния в другое). Например, если в найденных точках параметров, где система находится в колебательном режиме, мы начнем увеличивать значение параметра $а$,то $при a= 3.1839$ система перейдет в устойчивое состояние (точка биффуркации)

In [ ]:
#параметры модели
a = 3.1839;# точка биффуркации по параметру a
b = 0.25;
c = 0.2;
u0 = [0.0001, 0.0]
tspan = (0.0, 50.0)
p = (a, b, c)

prob = ODEProblem(Gudvin1!, u0, tspan, p)
sol = solve(prob, abstol=1e-8, reltol=1e-8)
theme(:dao)
p1 = plot(sol.t, sol[2, :], title="x(t) a= $a b= $b c= $c", ylabel="x(t)", xlabel="t", lw=2)
p2 = plot(sol.t, sol[1, :], title="y(t)", ylabel="y(t)", xlabel="t", lw=2)
p3 = plot(sol[1, :], sol[2, :], title="Фазовый портрет", ylabel="x", xlabel="y", lw=1)
plot(p1, p2, p3, layout=(3, 1), wsize=(750, 900), legend=false)
Out[0]:

Перейдем к анализу устойчивости модели Гудвина в точке $M_1 = \left( {\sqrt {\frac{b}{c}} ,0} \right)$. Зададим $a=2.0$ и посмотрим как изменяется поведение системы в пространстве параметров $b,c$. При этом, из экономических сображений набор значений параметра представим как вектор $B=[0.5,0.4,0.3,0.2]$,а значения параметра $с$ будем определять эксперементально двигаясь от значения параметра $с = 0.28$ вниз с шагом 0.01 с тем, чтобы обнаружить точку бифуркации, где система переходит из одного состояния в другое. Ниже с помощью разработанных нами скриптов, мы получили для каждого значения параметра $b$ серии из 4-х графиков, демонстриющих переход системы из устойчивого состояния в колебательный режим.Полученные результаты можно представить в виде графика(рис. 1). На графике видны точки бифуркации (желтые квадраты),соединяя которые можно получить линию бифуркации.Она делит пространство значений параметров $b,c$ на области устойчивых и неустойчевых состояний.

zonaust.jpg

In [ ]:
#параметры модели
a = 2.0;
B = [0.5,0.4,0.3,0.2];
C=[0.25,0.26,0.27,0.28];
tspan = (0.0, 50.0)

b=B[1]
k=0
theme(:dao)
for i in (1:4)
    c = C[i]
    p = (a, b, c)
    u01 = sqrt(b / c)
    u0 = [u01, 0.0]
    prob = ODEProblem(Gudvin1!, u0, tspan, p)
    sol = solve(prob, abstol=1e-8, reltol=1e-8)
    k = k + 1
    if (k == 1)
    global p1 = plot(sol.t, sol[2, :], title="x(t) a= $a b= $b c= $c", ylabel="x(t)", lw=2)
    global p2 = plot(sol[1, :], sol[2, :], title="Фазовый портрет", ylabel="x", xlabel="y", lw=1)
    elseif (k == 2)
    global p3 = plot(sol.t, sol[2, :], title="x(t) a= $a b= $b c= $c", ylabel="x(t)", lw=2)
    global p4 = plot(sol[1, :], sol[2, :], title="Фазовый портрет", ylabel="x", xlabel="y", lw=1)
    elseif (k == 3)
    global p5 = plot(sol.t, sol[2, :], title="x(t) a= $a b= $b c= $c", ylabel="x(t)", lw=2)
    global p6 = plot(sol[1, :], sol[2, :], title="Фазовый портрет", ylabel="x", xlabel="y", lw=1)
    else
    global p7 = plot(sol.t, sol[2, :], title="x(t) a= $a b= $b c= $c", ylabel="x(t)", lw=2)
    global p8 = plot(sol[1, :], sol[2, :], title="Фазовый портрет", ylabel="x", xlabel="y", lw=1)
    end
end
plot(p1, p2, p3, p4, p5, p6, p7, p8, layout=(4, 2), wsize=(900, 900), legend=false)
Out[0]:
In [ ]:
#параметры модели
a = 2.0;
B = [0.5, 0.4, 0.3, 0.2];
C = [0.20, 0.21, 0.22, 0.23];
tspan = (0.0, 50.0)

b = B[2]
k = 0
for i in (1:4)
    c = C[i]
    p = (a, b, c)
    u01 = sqrt(b / c)
    u0 = [u01, 0.0]
    prob = ODEProblem(Gudvin1!, u0, tspan, p)
    sol = solve(prob, abstol=1e-8, reltol=1e-8)
    k = k + 1
    if (k == 1)
        global p1 = plot(sol.t, sol[2, :], title="x(t) a= $a b= $b c= $c", ylabel="x(t)", lw=2)
        global p2 = plot(sol[1, :], sol[2, :], title="Фазовый портрет", ylabel="x", xlabel="y", lw=1)
    elseif (k == 2)
        global p3 = plot(sol.t, sol[2, :], title="x(t) a= $a b= $b c= $c", ylabel="x(t)", lw=2)
        global p4 = plot(sol[1, :], sol[2, :], title="Фазовый портрет", ylabel="x", xlabel="y", lw=1)
    elseif (k == 3)
        global p5 = plot(sol.t, sol[2, :], title="x(t) a= $a b= $b c= $c", ylabel="x(t)", lw=2)
        global p6 = plot(sol[1, :], sol[2, :], title="Фазовый портрет", ylabel="x", xlabel="y", lw=1)
    else
        global p7 = plot(sol.t, sol[2, :], title="x(t) a= $a b= $b c= $c", ylabel="x(t)", lw=2)
        global p8 = plot(sol[1, :], sol[2, :], title="Фазовый портрет", ylabel="x", xlabel="y", lw=1)
    end
end
plot(p1, p2, p3, p4, p5, p6, p7, p8, layout=(4, 2), wsize=(900, 900), legend=false)
Out[0]:
In [ ]:
#параметры модели
a = 2.0;
B = [0.5, 0.4, 0.3, 0.2];
C = [0.16, 0.17, 0.18, 0.19];
tspan = (0.0, 50.0)

b = B[3]
k = 0
for i in (1:4)
    c = C[i]
    p = (a, b, c)
    u01 = sqrt(b / c)
    u0 = [u01, 0.0]
    prob = ODEProblem(Gudvin1!, u0, tspan, p)
    sol = solve(prob, abstol=1e-8, reltol=1e-8)
    k = k + 1
    if (k == 1)
        global p1 = plot(sol.t, sol[2, :], title="x(t) a= $a b= $b c= $c", ylabel="x(t)", lw=2)
        global p2 = plot(sol[1, :], sol[2, :], title="Фазовый портрет", ylabel="x", xlabel="y", lw=1)
    elseif (k == 2)
        global p3 = plot(sol.t, sol[2, :], title="x(t) a= $a b= $b c= $c", ylabel="x(t)", lw=2)
        global p4 = plot(sol[1, :], sol[2, :], title="Фазовый портрет", ylabel="x", xlabel="y", lw=1)
    elseif (k == 3)
        global p5 = plot(sol.t, sol[2, :], title="x(t) a= $a b= $b c= $c", ylabel="x(t)", lw=2)
        global p6 = plot(sol[1, :], sol[2, :], title="Фазовый портрет", ylabel="x", xlabel="y", lw=1)
    else
        global p7 = plot(sol.t, sol[2, :], title="x(t) a= $a b= $b c= $c", ylabel="x(t)", lw=2)
        global p8 = plot(sol[1, :], sol[2, :], title="Фазовый портрет", ylabel="x", xlabel="y", lw=1)
    end
end
plot(p1, p2, p3, p4, p5, p6, p7, p8, layout=(4, 2), wsize=(900, 900), legend=false)
Out[0]:
In [ ]:
#параметры модели
a = 2.0;
B = [0.5, 0.4, 0.3, 0.2];
C = [0.11, 0.12, 0.13, 0.14];
tspan = (0.0, 50.0)

b = B[4]
k = 0
for i in (1:4)
    c = C[i]
    p = (a, b, c)
    u01 = sqrt(b / c)
    u0 = [u01, 0.0]
    prob = ODEProblem(Gudvin1!, u0, tspan, p)
    sol = solve(prob, abstol=1e-8, reltol=1e-8)
    k = k + 1
    if (k == 1)
        global p1 = plot(sol.t, sol[2, :], title="x(t) a= $a b= $b c= $c", ylabel="x(t)", lw=2)
        global p2 = plot(sol[1, :], sol[2, :], title="Фазовый портрет", ylabel="x", xlabel="y", lw=1)
    elseif (k == 2)
        global p3 = plot(sol.t, sol[2, :], title="x(t) a= $a b= $b c= $c", ylabel="x(t)", lw=2)
        global p4 = plot(sol[1, :], sol[2, :], title="Фазовый портрет", ylabel="x", xlabel="y", lw=1)
    elseif (k == 3)
        global p5 = plot(sol.t, sol[2, :], title="x(t) a= $a b= $b c= $c", ylabel="x(t)", lw=2)
        global p6 = plot(sol[1, :], sol[2, :], title="Фазовый портрет", ylabel="x", xlabel="y", lw=1)
    else
        global p7 = plot(sol.t, sol[2, :], title="x(t) a= $a b= $b c= $c", ylabel="x(t)", lw=2)
        global p8 = plot(sol[1, :], sol[2, :], title="Фазовый портрет", ylabel="x", xlabel="y", lw=1)
    end
end
plot(p1, p2, p3, p4, p5, p6, p7, p8, layout=(4, 2), wsize=(900, 900), legend=false)
Out[0]:

2. Случай $Q(t)$ детерминированная переодическая функция

Пусть внешнее воздействие Q(t) это переодическая функция вида:

$$Q(t) = A_0 \cdot \cos \left( {fr \cdot t + faz} \right) + A_1$$

где $fr$-частота; $faz$-фаза; $A_0$ - амплитуда; $A_1$ - уровень относительно которого происходят колебания.

In [ ]:
using DifferentialEquations, Plots, PlotThemes
function Gudvin2!(du, u, p, t)
    a, b, c, A1, fr, faz, A0 = p
    du[2] = u[1]
    du[1] = -a * u[1] * ((u[2]^2 - 1) / (u[2]^2 + 1)) + b * u[2] - c * u[2]^3 + A1 * cos(fr * t + faz) + A0
end
Out[0]:
Gudvin2! (generic function with 1 method)
  1. Зададим такие параметры Q(t),при которых она на соотвествующем диапозоне t будет возрастающей функцией. Обеспечить $dQ(t)/dt > 0$ (возрастание функции) можно задав fr=0.02 и faz=10.0. Обеспечить условие Q(t)>0 (экономически это означает наличие внешнего притока средств в экономику) можно выбрав определенное значения $A_1$ и $A_0$ и соотношение между ними.

Пусть множество значений параметра A1 представляет собой вектор [5.0,10.0,20.0,30.0,40.0,50.0,60.0,70.0] (отношение $A_1/A_0$ изменяется от 0.1 до 1.4). Ниже представлен скрипт, который строит серию графиков для каждого значения $A_1$

Из графиков видно, что угол наклона Q(t) увеличивается от arctg(2/30)=3.81 град. до arctg(25/30)=39.81 град. То есть, скорость роста Q(t) увеличивается на интервале исследования более чем в 10 раз. Функция $x(t)$ сначала стабилизируется на определенном уровне, а затем переходит в режим практически линейного устойчивого роста, при этом переходная фаза к усточивому состоянию становиться все менее выраженной (уменьшается число колебаний и их амплитуда). Грубо по графикам оценим скрость роста $x(t)$. При $A_1/A_0=0.1$ $\Delta x \approx 0.0$ ; $A_1/A_0=0.2$ $\Delta x \approx 0.2$; $A_1/A_0=0.4$ $\Delta x \approx 0.4$; $A_1/A_0=0.6$ $\Delta x \approx 0.8$; $A_1/A_0=0.8$ $\Delta x \approx 1.6$; $A_1/A_0=1.0$ $\Delta x \approx 3.0$; $A_1/A_0=1.2$ $\Delta x \approx 4.6$. В точке, где $A_1/A_0=1.2$ кривая роста стновитья явно выпуклой и это последняя точка, где на всем диапозоне исследования $x(t)>0$ ($x(0)\approx 0.0$). В точке $A_1/A_0=1.4$ $x(t)$ и $Q(t)$ уходят в отрицательную зону и движение $x(t)$ становиться хаотичным. Точкой бифуркации является точка расположенная между $A_1/A_0=1.0$ и $A_1/A_0=1.2$. Это хорошо видно по фазовым портретам последних двух точек исследования.

In [ ]:
#параметры модели
a = 2.0;
b = 0.2;
c = 0.11;
AA1 = [5.0,10.0,20.0,30.0,40.0,50.0,60.0,70.0]
A0 = 50.0
fr = 0.02;
faz = 10.0
u01 = sqrt(b / c)
u0 = [u01, 0.0]
tspan = (0.0, 30.0)
theme(:dao)
k=0
for i in (1:8)
    A1=AA1[i]
    p = (a, b, c, A1, fr, faz, A0)
    tQ = 0.0:0.05:30.0
    B = @.A1 * cos.(fr * tQ + faz) + A0
    k=k+1
    prob = ODEProblem(Gudvin2!, u0, tspan, p)
    sol = solve(prob, abstol=1e-8, reltol=1e-8)
    if (k == 1)
        global p1 = plot(sol.t, sol[2, :], title="x(t) A0 = $A0   A1 = $A1", ylabel="x(t)", lw=2)
        global p2 = plot(sol[1, :], sol[2, :], title="Фазовый портрет", ylabel="x", xlabel="y", lw=1)
        global p3 = plot(tQ, B, title="Q(t)", ylabel="Q(t)", xlabel="t", lw=1)
    elseif (k == 2)
        global p4 = plot(sol.t, sol[2, :], title="x(t) A0 = $A0  A1 = $A1", ylabel="x(t)", lw=2)
        global p5 = plot(sol[1, :], sol[2, :], title="Фазовый портрет", ylabel="x", xlabel="y", lw=1)
        global p6 = plot(tQ, B, title="Q(t)", ylabel="Q(t)", xlabel="t", lw=1)
    elseif (k == 3)
        global p7 = plot(sol.t, sol[2, :], title="x(t) A0 = $A0 A1 = $A1", ylabel="x(t)", lw=2)
        global p8 = plot(sol[1, :], sol[2, :], title="Фазовый портрет", ylabel="x", xlabel="y", lw=1)
        global p9 = plot(tQ, B, title="Q(t)", ylabel="Q(t)", xlabel="t", lw=1)
    elseif (k == 4)
        global p10 = plot(sol.t, sol[2, :], title="x(t) A0 = $A0 A1 = $A1", ylabel="x(t)", lw=2)
        global p11 = plot(sol[1, :], sol[2, :], title="Фазовый портрет", ylabel="x", xlabel="y", lw=1)
        global p12 = plot(tQ, B, title="Q(t)", ylabel="Q(t)", xlabel="t", lw=1)
    elseif (k == 5)
        global p13 = plot(sol.t, sol[2, :], title="x(t) A0 = $A0 A1 = $A1", ylabel="x(t)", lw=2)
        global p14 = plot(sol[1, :], sol[2, :], title="Фазовый портрет", ylabel="x", xlabel="y", lw=1)
        global p15 = plot(tQ, B, title="Q(t)", ylabel="Q(t)", xlabel="t", lw=1)
    elseif (k == 6)
        global p16 = plot(sol.t, sol[2, :], title="x(t) A0 = $A0 A1 = $A1", ylabel="x(t)", lw=2)
        global p17 = plot(sol[1, :], sol[2, :], title="Фазовый портрет", ylabel="x", xlabel="y", lw=1)
        global p18 = plot(tQ, B, title="Q(t)", ylabel="Q(t)", xlabel="t", lw=1)
    elseif (k == 7)
        global p19 = plot(sol.t, sol[2, :], title="x(t) A0 = $A0 A1 = $A1", ylabel="x(t)", lw=2)
        global p20 = plot(sol[1, :], sol[2, :], title="Фазовый портрет", ylabel="x", xlabel="y", lw=1)
        global p21 = plot(tQ, B, title="Q(t)", ylabel="Q(t)", xlabel="t", lw=1)

    else
        global p22 = plot(sol.t, sol[2, :], title="x(t) A0 = $A0 A1 = $A1", ylabel="x(t)", lw=2)
        global p23 = plot(sol[1, :], sol[2, :], title="Фазовый портрет", ylabel="x", xlabel="y", lw=1)
        global p24 = plot(tQ, B, title="Q(t)", ylabel="Q(t)", xlabel="t", lw=1)
    end
end     

plot(p1, p2, p3, p4, p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24, layout=(8, 3), wsize=(950, 1600), legend=false)
Out[0]:
  1. Зададим такие параметры Q(t),при которых она на соотвествующем диапозоне t [0,100] будет убывающей функцией. Обеспечить $dQ(t)/dt < 0$ (убывание функции) можно задав fr=0.02 и faz=0.0. При этом на исследуемом инттервале времени функция может $Q(t)>0$ и $Q(t)<0$ (экономически это означает наличие убывающего притока средств в экономику, переходящего в отток ресурсов из экономики ).Данное поведение $Q(t)$ можно обеспечить, выбрав определенное значения $A_1$ и $A_0$ и соотношение между ними.

Пусть множество значений параметра A0 представляет собой вектор [100.0, 50.0, 40.0,35.0] (отношение $A_1/A_0$ изменяется от 1.0 до 0.35). Ниже представлен скрипт, который строит серию графиков для каждого значения $A_0$

Из графиков видно, что по мере движения от значения отношения $A_1/A_0 =1.0$ до $A_1/A_0 =0.4$ система деградирует (x(t) падает) со все увеличивающейся скоростью, а между точками 0.4 и 0.35 она коллапсирует и разрушается

In [ ]:
#параметры модели
a = 2.5;
b = 0.5;
c = 0.25;

AA0 = [100.0, 50.0, 40.0,35.0]
A1 = 100.0;
A0 = 40.0
fr = 0.02;
faz = 0.0
u01 = sqrt(b / c)
u0 = [u01, 0.0]
tspan = (0.0, 100.0)
theme(:dao)
k=0
for i in (1:4)
    A0=AA0[i]
    p = (a, b, c, A1, fr, faz, A0)
    tQ = 0.0:0.05:100.0
    B = @.A1 * cos.(fr * tQ + faz) + A0
    k=k+1
    prob = ODEProblem(Gudvin2!, u0, tspan, p)
    sol = solve(prob, abstol=1e-8, reltol=1e-8)
    if (k == 1)
        global p1 = plot(sol.t, sol[2, :], title="x(t) A0 = $A0   A1 = $A1", ylabel="x(t)", lw=2)
        global p2 = plot(sol[1, :], sol[2, :], title="Фазовый портрет", ylabel="x", xlabel="y", lw=1)
        global p3 = plot(tQ, B, title="Q(t)", ylabel="Q(t)", xlabel="t", lw=1)
    elseif (k == 2)
        global p4 = plot(sol.t, sol[2, :], title="x(t) A0 = $A0  A1 = $A1", ylabel="x(t)", lw=2)
        global p5 = plot(sol[1, :], sol[2, :], title="Фазовый портрет", ylabel="x", xlabel="y", lw=1)
        global p6 = plot(tQ, B, title="Q(t)", ylabel="Q(t)", xlabel="t", lw=1)
    elseif (k == 3)
        global p7 = plot(sol.t, sol[2, :], title="x(t) A0 = $A0 A1 = $A1", ylabel="x(t)", lw=2)
        global p8 = plot(sol[1, :], sol[2, :], title="Фазовый портрет", ylabel="x", xlabel="y", lw=1)
        global p9 = plot(tQ, B, title="Q(t)", ylabel="Q(t)", xlabel="t", lw=1)
    else
        global p10 = plot(sol.t, sol[2, :], title="x(t) A0 = $A0 A1 = $A1", ylabel="x(t)", lw=2)
        global p11 = plot(sol[1, :], sol[2, :], title="Фазовый портрет", ylabel="x", xlabel="y", lw=1)
        global p12 = plot(tQ, B, title="Q(t)", ylabel="Q(t)", xlabel="t", lw=1)
    end
end    
    
plot(p1, p2, p3, p4,p5,p6,p7,p8,p9,p10,p11,p12, layout=(4, 3), wsize=(950, 1000), legend=false)
Out[0]:
  1. Зададим такие параметры $Q(t)$,при которых она на соотвествующем диапозоне t [0,100] будет переодической функцией ($fr=0.2 , faz=0.0$). При этом на исследуемом инттервале времени функция может $Q(t)>0$ и $Q(t)<0$ (экономически это означает наличие переодически увеливающегося и убывающего притока средств в экономику, переходящего в определенные моменты t в отток ресурсов из экономики).Данное поведение $Q(t)$ можно обеспечить, выбрав определенное значения $A_1$ и $A_0$ и соотношение между ними.

Пусть множество значений параметра A0 представляет собой вектор [200.0, 10.0, 2.0] (отношение $A_1/A_0$ изменяется от 0.025 до 2.5). Ниже представлен скрипт, который строит серию графиков для каждого значения $A_0$

Из графиков видно, что при значении отношения $A_1/A_0 =0.025$ система сохраняет устойчивое состояние(x(t)≈ 9.2 ).При $A_1/A_0=1.0$ находится в колебательном режиме $1.8 ≤ x(t) ≤ 4.2$ с частотой близкой к частоте $Q(t).При $A_1/A_0 =2.5$ система переходит в сложное состояние с переодической составляющей с постоянным переходом в отрицательную зону,с экономической точки зрения это соотвествует коллапсу и разрушению системы (фазовый портрет седло с петлями).

In [ ]:
#параметры модели
a = 2.5;
b = 0.5;
c = 0.25;

AA0 = [200.0, 5.0, 2.0]
A1 = 5.0;
fr = 0.2;
faz = 0.0
u01 = sqrt(b / c)
u0 = [u01, 0.0]
tspan = (0.0, 100.0)
theme(:dao)
k = 0
for i in (1:3)
    A0=AA0[i]
    p = (a, b, c, A1, fr, faz, A0)
    tQ = 0.0:0.05:100.0
    B = @.A1 * cos.(fr * tQ + faz) + A0
    k=k+1
    prob = ODEProblem(Gudvin2!, u0, tspan, p)
    sol = solve(prob, abstol=1e-8, reltol=1e-8)
    if (k == 1)
        global p1 = plot(sol.t, sol[2, :], title="x(t) A0 = $A0   A1 = $A1", ylabel="x(t)", lw=2)
        global p2 = plot(sol[1, :], sol[2, :], title="Фазовый портрет", ylabel="x", xlabel="y", lw=1)
        global p3 = plot(tQ, B, title="Q(t)", ylabel="Q(t)", xlabel="t", lw=1)
    elseif (k == 2)
        global p4 = plot(sol.t, sol[2, :], title="x(t) A0 = $A0   A1 = $A1", ylabel="x(t)", lw=2)
        global p5 = plot(sol[1, :], sol[2, :], title="Фазовый портрет", ylabel="x", xlabel="y", lw=1)
        global p6 = plot(tQ, B, title="Q(t)", ylabel="Q(t)", xlabel="t", lw=1)
    else
        global p7 = plot(sol.t, sol[2, :], title="x(t) A0 = $A0 A1 = $A1", ylabel="x(t)", lw=2)
        global p8 = plot(sol[1, :], sol[2, :], title="Фазовый портрет", ylabel="x", xlabel="y", lw=1)
        global p9 = plot(tQ, B, title="Q(t)", ylabel="Q(t)", xlabel="t", lw=1)
    end
end
plot(p1, p2, p3, p4, p5, p6, p7, p8, p9, layout=(3, 3), wsize=(950, 800), legend=false)
Out[0]:

Q(t) стохастическая функция

Используем в качестве Q(t) переодическую функцию, в которой вносятся случайеые положительные возмущения в частоту и aмплитуду. Ниже представлен скрипт, который генерирует $N$ реализаций подобной функции

Статистический анализ Q(t)

На множестве,состоящем из $N$ реализаций $Q(t)$, в каждом временном сечении сформирована случайная величина, то есть имеется система из T случайных велечин (в нашем случае T=20). В скрипте определяются среднее (mean),среднеквадратичное отклонение (std) и коэффициет вариации (Cv) для каждой случайной величины q(t),t=1:20. На этой основе строятся графики:mean(t),mean(t)+3std(t),mean(t)-3std(t) и Cv(t). Из графиков видно, что в 99% реализаций Q(t) находятся в интервале [0.0,105.0]. Минимум коэффициета вариации min Cv = 18.32 %, а максимум max Cv=32.55. Посмотрем как Q(t) c такими статистическими характеристиеами влияет на x(t) и каков при этом фазовый портрет, порождаемый моделью Гудвина

In [ ]:
using DifferentialEquations, Plots, PlotThemes
using Random
using Statistics

Random.seed!(123)
N = 100
q = zeros(20)
QB = zeros(100, 20)
Amp = 20.0
A0 = 50
theme(:dao)
pp2 = plot(1:1:20, q, ylabel="Q(t)", xlabel="t", lw=2)
for i in (1:N)
    w = abs(randn())
    amp = Amp * abs(randn())
    tQ = 0.0:0.5:20.0
    B = @.(amp * cos.(w * tQ) + A0)
    for j in (1:20)
        global QB[i, j] = B[j]
    end
    pp2 = plot!(tQ, B)
end
P1 = plot!(pp2, legend=false, title="Q(t)")

#расчет описатальных статистик

m = zeros(20)
St = zeros(20)
Cv = zeros(20)
ttQ = 1:20

for i in 1:20
    m[i] = mean(QB[:, i])
    St[i] = std(QB[:, i])
    Cv[i] = (St[i] / m[i]) * 100
end

@show extrema(Cv)

P2 = plot(ttQ, m, lw=3, label="mean", title="Описательные статистики")
plot!(ttQ, m + 3 * St, lw=2, label="mean+3std")
plot!(ttQ, m - 3 * St, lw=2, label="mean-3std")
P3 = plot(ttQ, Cv, lw=3, title="Коэффициент вариации %", legend=false)
plot(P1, P2, P3, layout=(3, 1), wsize=(700, 900))
extrema(Cv) = (18.325258535141966, 32.55111538505472)
Out[0]:

Гистограммы

In [ ]:
using DataFrames
using StatsPlots 
#df=DataFrame(QB, :auto); 
p1 = histogram(QB[:, 4], bins=25, title="t=4", legend=false)
p2 = histogram(QB[:, 10], bins=25, title="t=10", legend=false)
p3 = histogram(QB[:, 15], bins=25, title="t=15", legend=false)
plot(p1, p2, p3, layout=(1, 3), wsize=(900, 300))
Out[0]:
In [ ]:
using DifferentialEquations, Plots, PlotThemes
using Random

function Gudvin3!(du, u, p, t)
    a, b, c, Amp, amp, w, A0 = p
    du[2] = u[1]
    du[1] = -a * u[1] * ((u[2]^2 - 1) / (u[2]^2 + 1)) + b * u[2] - c * u[2]^3 + amp * cos(w * t) + A0
    du = [du[1], du[2]]
end
Out[0]:
Gudvin3! (generic function with 1 method)
Статистический анализ x(t)

Ниже представлен скрипт, который генерирует N (N=100) реализаций x(t) для t ∈ [0.0,20.0].Каждая реализация - это решение системы дифференциальных уравнений, являющихся математической формой модели Гудвина. На первом графике изображено это множество решений. Для статистического анализа полученного множества решений в скрипте реализована процедура разрезания множества решений в дискретных точках t =[1.0 , 2.0,3.0,...20.0].

В результате формируется система случайных величин $Xt = || xt_{ij} ||$ ,где $i=1,N;j=1,20$. В матрице $Xt$ каждый столбец представляет собой соотвествующую дикретнную случайную величину, для которой определяются $mean,std$ и коэффициент вариации $Cv =std/mean$.

Полученные статистические характеристики используются для построения графиков: $mean(t), mean(t)+3std(t), mean(t)-3std(t),Cv(t)$. При построении графиков пропускаются две начальные точки,в которых происходит переходный процесс.

Если сравнить результаты статистического анализа $Q(t)$ и $x(t)$, то можно сделать следующие выводы:

  • при выбранных параметрах модели при стохастическом воздействии Q(t) в среднем сохраняется ее устойчивость ($mean(xt)≈6.0$);

  • уровень вариотивности $x(t)$ существенно ниже чем у $Q(t), что подтверждается следующим $CvQ_{ср} = 18.33 + 32.55/2 =25.44 >> Cvx_{ср} =5.0+20.94=12.97$;

  • с 0.99 уверенности $x(t)∈[1.8,9.2]$ , если с 0,99 уверенностью $Q(t) ∈[10.0,105.0]$

  • статистические закономерности $Q(t)$ по всей видимости в основном сохраняются в $x(t)$ о чём говорит внешний вид гистограмм соотвествующих случайных величин.

Конечно последнее утверждение требует более глубокого статистического анализа:оценки законов распреления, оценка наличия корреляций между случайными величинами,определение гомоскедастичности (гетероскедастичности) и.т.д.Но эти вопросы мы оставляем за скобками данной работы.

In [ ]:
#параметры модели
using Statistics
Random.seed!(123)
N = 100
a = 2.5;
b = 0.5;
c = 0.25;
Amp = 20.0
A0 = 50
u0 = [0.01, 0.01]
u0x = u0[2]
tspan = (0.0, 20.0)

x = zeros(20)
xt=zeros(100,20)
ts=[1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0,16.0,17.0,18.0,18.0,20.0]
ind=Int.(zeros(20))
pp1 = plot(1:1:20, x, ylabel="x(t)", xlabel="t", lw=0)

for l in (1:N)
    w = abs(randn())
    amp = Amp * abs(randn())
    p = (a, b, c, Amp, amp, w, A0)
    prob1 = ODEProblem(Gudvin3!, u0, tspan, p)
    global sol1 = solve(prob1, abstol=1e-8, reltol=1e-8)
    w = round(w, sigdigits=2)
    amp = round(amp, sigdigits=2)
    global px = plot!(sol1.t, sol1[2, :], lw=1, legend=false)
        
    for j  in 1:20
      sd = 10000
      for i in 1:length(sol1.t)
         tt=round(sol1.t[i], sigdigits=2)
         if (tt == ts[j])
             if (ind[j] < sd)
               ind[j] = i
               sd=ind[j]
             end 
         end
      end
    end 
    for i  in 1:20
        xt[l,i] = sol1[2,ind[i]]
    end 
end
P1 = plot!(px,title="a= $a c= $c b= $b u0x= $u0x")

mx = zeros(20)
Stx = zeros(20)
Cvx = zeros(20)
ttQ = 1:20
for i in 1:20
  mx[i] = mean(xt[:, i])
  Stx[i] = std(xt[:, i])
  Cvx[i] = (Stx[i] /mx[i]) * 100
end
@show extrema(Cvx);
theme(:dao)
P2 = plot(ttQ[3:20], mx[3:20], lw=3, label="mean", title="Описательные статистики")
plot!(ttQ[3:20], mx[3:20] + 3 * Stx[3:20], lw=2, label="mean+3std")
plot!(ttQ[3:20], mx[3:20] - 3 * Stx[3:20], lw=2, label="mean-3std")
P3 = plot(ttQ[3:20], Cvx[3:20], lw=3, title="Коэффициент вариации %", legend=false)
plot(P1, P2, P3, layout=(3, 1), wsize=(600, 900))
extrema(Cvx) = (5.011101695305186, 20.96083174719719)
Out[0]:
In [ ]:
using StatsPlots
#df = DataFrame(QB, :auto);
Bn =[15,25,30]
bi = [4,5,6,7,8,9,10,11,12,13,14,15,16,17,20]
gst1 =bi[1]
gst2 = bi[7]
gst3 = bi[12]
p1 = histogram(xt[:, 5], bins=Bn[2], title="t= $gst1", legend=false)
p2 = histogram(xt[:, 10], bins=Bn[2], title="t= $gst2", legend=false)
p3 = histogram(xt[:, 17], bins=Bn[2], title="t= $gst3", legend=false)
plot(p1, p2, p3, layout=(1, 3), wsize=(900, 300))
Out[0]:

Стохастический аттрактор

In [ ]:
Random.seed!(123)
N = 100
a = 2.5;
b = 0.5;
c = 0.25;
Amp = 20.0
A0 = 50
u0 = [0.01, 0.01]
u0x = u0[2]
tspan = (0.0, 20.0)
pp3 = plot(ylabel="x(t)", xlabel="y(t)")

for i in (1:N)
    w = abs(randn())
    amp = Amp * abs(randn())
    p = (a, b, c, Amp, amp, w, A0)
    prob1 = ODEProblem(Gudvin3!, u0, tspan, p)
    sol1 = solve(prob1, abstol=1e-8, reltol=1e-8)
    w = round(w, sigdigits=2)
    amp = round(amp, sigdigits=2)
    pp2 = plot!(sol1[1, :], sol1[2, :], lw=1, label="c= $c w= $w amp= $amp")
end

plot!(pp3, legend=false, wsize=(700, 400))
title!("Стохастический атрактор при a= $a c= $c b= $b u0x= $u0x")
Out[0]:

ДИСКРЕТНАЯ МОДЕЛЬ ЭКОНОМИЧЕСКОГО ОСЦИЛЛЯТОРА САМУЭЛЬСОНА

In [ ]:
using Plots, PlotThemes

#ЗАДАНИЕ ИСХОДНЫХ ДАННЫХ  
#автономные инвестиции
G0 = 35.0;
#горизонт прогноза
T = 30;
#Норма потребления
a = 0.4;
#Акселератор
b = 3.0;
#начальное значение
Y = zeros(T)
C = zeros(T)
Inv = zeros(T)

#Расчет эндогенных переменных модели для t =1
t = 1;
Y[t] = 10.0;
#C(t)=0;
#Inv(t)=0;
#Расчет эндогенных переменных модели для t=2 
t = 2;
#потребление
C[t] = a * Y[t-1];
#инвестиции
Inv[t] = b * (C[t] - C[t-1]);
#доход
Y[t] = C[t] + Inv[t] + G0;

for t in 3:1:T
    C[t] = a * Y[t-1]
    C[t-1] = a * Y[t-2]
    Inv[t] = b * (C[t] - C[t-1])
    Y[t] = C[t] + Inv[t] + G0
end
X = 1:1:T
theme(:dao)
plot(X, Y[1:T], title="ОСЦИЛЯТОР САМУЭЛЬСОНА Y(t) C(t) Inv(t) при a= $a b= $b",
    ylabel="Y, C, Inv", xlabel="t", label="Доход", lw=2)
plot!(X, C[1:T], label="Потребление", lw=2, legend=:outertopright)
plot!(X, Inv[1:T], label="Инвестиции", lw=2, wsize=(900, 500))
Out[0]:
ИССЛЕДОВАНИЕ ДИСКРЕТНОЙ МОДЕЛИ ЭКОНОМИЧЕСКОГО ОСЦИЛЛЯТОРА САМУЭЛЬСОНА

Число параметров в модели Самуэльсона невелико,поэтому, достаточно легко по каждому параметру задать разумное множество значений и осуществить зондирование в каждой точке пространства параметров. При этом, каждой такой точке поставить в соотвествие наглядный геометрический образ поведения системы. Тогда набор этих образов даст представление о том множестве вариантов поведения экономической системы, которые содержатся в простой линейной дискретной модели Самуэльсона. Ниже приведен скрипт, реализующий эту идею.

In [ ]:
using Plots, PlotThemes
#theme(:dracula)
#theme(:ggplot2)
theme(:dao)
#theme(:juno)
#theme(:dark)

#ЗАДАНИЕ ИСХОДНЫХ ДАННЫХ  
#автономные инвестиции
G0 = 35.0;
#горизонт прогноза
T = 30;
#Норма потребления
Ac = (0.2:0.2:0.8);
#Акселератор
Baks = (1.0:0.5:3.0)
#начальное значение
Y = zeros(T)
C = zeros(T)
Inv = zeros(T)

l = 0
for i in (1:4)
    for j in (1:5)
        l = l + 1
        #Расчет эндогенных переменных модели для t =1
        t = 1
        Y[t] = 10.0
        #Расчет эндогенных переменных модели для t=2 
        t = 2
        #потребление
        C[t] = Ac[i] * Y[t-1]
        #инвестиции
        Inv[t] = Baks[j] * (C[t] - C[t-1])
        #доход
        Y[t] = C[t] + Inv[t] + G0
        for t in 3:1:T
            C[t] = Ac[i] * Y[t-1]
            C[t-1] = Ac[i] * Y[t-2]
            Inv[t] = Baks[j] * (C[t] - C[t-1])
            Y[t] = C[t] + Inv[t] + G0
        end
        a = Ac[i]
        b = Baks[j]
        X = 1:1:T
        if (l == 1)
            global p1 = plot(X, Y[1:T], title="a= $a b= $b", ylabel="Y, C, Inv", xlabel="t", label="Доход", lw=2)
            plot!(X, C[1:T], label="Потребление", lw=2, legend=:outertopright)
            plot!(X, Inv[1:T], label="Инвестиции", lw=2)
        elseif (l == 2)
            global p2 = plot(X, Y[1:T], title="a= $a b= $b", ylabel="Y, C, Inv", xlabel="t", label="Доход", lw=2)
            plot!(X, C[1:T], label="Потребление", lw=2, legend=:outertopright)
            plot!(X, Inv[1:T], label="Инвестиции", lw=2)
        elseif (l == 3)
            global p3 = plot(X, Y[1:T], title="a= $a b= $b", ylabel="Y, C, Inv", xlabel="t", label="Доход", lw=2)
            plot!(X, C[1:T], label="Потребление", lw=2, legend=:outertopright)
            plot!(X, Inv[1:T], label="Инвестиции", lw=2)
        elseif (l == 4)
            global p4 = plot(X, Y[1:T], title="a= $a b= $b", ylabel="Y, C, Inv", xlabel="t", label="Доход", lw=2)
            plot!(X, C[1:T], label="Потребление", lw=2, legend=:outertopright)
            plot!(X, Inv[1:T], label="Инвестиции", lw=2)
        elseif (l == 5)
            global p5 = plot(X, Y[1:T], title="a= $a b= $b", ylabel="Y, C, Inv", xlabel="t", label="Доход", lw=2)
            plot!(X, C[1:T], label="Потребление", lw=2, legend=:outertopright)
            plot!(X, Inv[1:T], label="Инвестиции", lw=2)
        elseif (l == 6)
            global p6 = plot(X, Y[1:T], title="a= $a b= $b", ylabel="Y, C, Inv", xlabel="t", label="Доход", lw=2)
            plot!(X, C[1:T], label="Потребление", lw=2, legend=:outertopright)
            plot!(X, Inv[1:T], label="Инвестиции", lw=2)
        elseif (l == 7)
            global p7 = plot(X, Y[1:T], title="a= $a b= $b", ylabel="Y, C, Inv", xlabel="t", label="Доход", lw=2)
            plot!(X, C[1:T], label="Потребление", lw=2, legend=:outertopright)
            plot!(X, Inv[1:T], label="Инвестиции", lw=2)
        elseif (l == 8)
            global p8 = plot(X, Y[1:T], title="a= $a b= $b", ylabel="Y, C, Inv", xlabel="t", label="Доход", lw=2)
            plot!(X, C[1:T], label="Потребление", lw=2, legend=:outertopright)
            plot!(X, Inv[1:T], label="Инвестиции", lw=2)
        elseif (l == 9)
            global p9 = plot(X, Y[1:T], title="a= $a b= $b", ylabel="Y, C, Inv", xlabel="t", label="Доход", lw=2)
            plot!(X, C[1:T], label="Потребление", lw=2, legend=:outertopright)
            plot!(X, Inv[1:T], label="Инвестиции", lw=2)
        elseif (l == 10)
            global p10 = plot(X, Y[1:T], title="a= $a b= $b", ylabel="Y, C, Inv", xlabel="t", label="Доход", lw=2)
            plot!(X, C[1:T], label="Потребление", lw=2, legend=:outertopright)
            plot!(X, Inv[1:T], label="Инвестиции", lw=2)
        elseif (l == 11)
            global p11 = plot(X, Y[1:T], title="a= $a b= $b", ylabel="Y, C, Inv", xlabel="t", label="Доход", lw=2)
            plot!(X, C[1:T], label="Потребление", lw=2, legend=:outertopright)
            plot!(X, Inv[1:T], label="Инвестиции", lw=2)
        elseif (l == 12)
            global p12 = plot(X, Y[1:T], title="a= $a b= $b", ylabel="Y, C, Inv", xlabel="t", label="Доход", lw=2)
            plot!(X, C[1:T], label="Потребление", lw=2, legend=:outertopright)
            plot!(X, Inv[1:T], label="Инвестиции", lw=2)
        elseif (l == 13)
            global p13 = plot(X, Y[1:T], title="a= $a b= $b", ylabel="Y, C, Inv", xlabel="t", label="Доход", lw=2)
            plot!(X, C[1:T], label="Потребление", lw=2, legend=:outertopright)
            plot!(X, Inv[1:T], label="Инвестиции", lw=2)
        elseif (l == 14)
            global p14 = plot(X, Y[1:T], title="a= $a b= $b", ylabel="Y, C, Inv", xlabel="t", label="Доход", lw=2)
            plot!(X, C[1:T], label="Потребление", lw=2, legend=:outertopright)
            plot!(X, Inv[1:T], label="Инвестиции", lw=2)
        elseif (l == 15)
            global p15 = plot(X, Y[1:T], title="a= $a b= $b", ylabel="Y, C, Inv", xlabel="t", label="Доход", lw=2)
            plot!(X, C[1:T], label="Потребление", lw=2, legend=:outertopright)
            plot!(X, Inv[1:T], label="Инвестиции", lw=2)
        elseif (l == 16)
            global p16 = plot(X, Y[1:T], title="a= $a b= $b", ylabel="Y, C, Inv", xlabel="t", label="Доход", lw=2)
            plot!(X, C[1:T], label="Потребление", lw=2, legend=:outertopright)
            plot!(X, Inv[1:T], label="Инвестиции", lw=2)
        elseif (l == 17)
            global p17 = plot(X, Y[1:T], title="a= $a b= $b", ylabel="Y, C, Inv", xlabel="t", label="Доход", lw=2)
            plot!(X, C[1:T], label="Потребление", lw=2, legend=:outertopright)
            plot!(X, Inv[1:T], label="Инвестиции", lw=2)
        elseif (l == 18)
            global p18 = plot(X, Y[1:T], title="a= $a b= $b", ylabel="Y, C, Inv", xlabel="t", label="Доход", lw=2)
            plot!(X, C[1:T], label="Потребление", lw=2, legend=:outertopright)
            plot!(X, Inv[1:T], label="Инвестиции", lw=2)
        elseif (l == 19)
            global p19 = plot(X, Y[1:T], title="a= $a b= $b", ylabel="Y, C, Inv", xlabel="t", label="Доход", lw=2)
            plot!(X, C[1:T], label="Потребление", lw=2, legend=:outertopright)
            plot!(X, Inv[1:T], label="Инвестиции", lw=2)
        elseif (l == 20)
            global p20 = plot(X, Y[1:T], title="a= $a b= $b", ylabel="Y, C, Inv", xlabel="t", label="Доход", lw=2)
            plot!(X, C[1:T], label="Потребление", lw=2, legend=:outertopright)
            plot!(X, Inv[1:T], label="Инвестиции", lw=2)

        end
    end
end

plot(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, layout=(5, 4), wsize=(1030, 1200), legend=false)
Out[0]:

Краткое заключение

Полученные нами результаты не претендуют на научную новизну. Мы хотели лишь проденстрировать, как сравнительно новый язык программирования Julia, может использоваться в качестве эффективного инструмента проведения модельных экспериментов и анализа их результатов в очень наглядной графической форме.

Список литературы

1.Матросов В.В., Шалфеев В.Д. Моделирование экономических и финансовых циклов: генерация и синхронизация // Известия вузов. ПНД. 2021. T. 29, № 2. С. 1–21. DOI: 10.18500/0869-6632-2021-29-2-1-21

2.Ляпцев А. В Учебная модель экономических циклов // Компьютерные инструменты в образовании, 2021 № 3: 5–16

3.И.А.Башкирцева, Е.Д. Екатеринчук, Т.В. Рязановаc, А. А. Сысолятина. Математическое моделирование стохастических равновесий и бизнес-циклов модели Гудвина // КОМПЬЮТЕРНЫЕ ИССЛЕДОВАНИЯ И МОДЕЛИРОВАНИЕ 2013 Т. 5 № 1 С. 107–118

4.Lorenz H.W., Nusse H. E. Chaotic attractors, chaotic saddles, and fractal basin boundaries: Goodwin’s nonlinear accelerator model reconsidered // Chaos, Solutions and Fractals. — 2002. — No. 13. — P. 957–965.

5.Короновский А.А., Трубецков Д.И. Нелинейная динамика в действии : Как идеи нели- нейной динамики проникают в экологию, экономику и социальные науки. Саратов, изд. ГОСУНЦ «Колледж», 2002.

6.Трубецков Д.И. Введение в синергетику. Хаос и структуры. — М: Едиториал УРСС, 2004

7.Трубецков Д.И. Канонические модели нелинейной динамики в экономике // Известия вузов. Прикладная нелинейная динамика. — 2006. — Т. 14, №2. — С. 75–93.