Сообщество Engee

Модель Гудвина: эмпирический анализ в 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 (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-го порядка, которую можно записать в традиционном виде:

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

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

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

где .

Численное исследование модели (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]:

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

здесь – отклонение дохода от равновесия, – четная функция с условиями ;
– нечетная функция с условием , – функция издержек.
В своих исследованиях Лоренца и Нуссэ [4] предложили конкретный вид функций и :

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

1. Случай

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

В этой системе существуют три равновесия , , .

Равновесие зависит от всех трех параметров. Исследуем эту зависимость. Исходя из экономического смысла параметров: определяет предельный уровень потребления при соотвествующих значениях и ; - норма потребления; -коэффициент снижения дохода, чем он меньше тем больше доход. Зададим следующие значения: ; ; .
Проведем соответствующие расчеты с помощью разработанного нами скрипта 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), в которых система из переходит в колебательный режим (аттрактор седло). В остальных исследуемых точках система переходит в устойчивое состояние (аттрактор устойчивый фокус).Если детально исследовать пространство параметров (задать небольшой шаг по каждому параметру,то можно найти точки биффуркации,где система переходит из одного состояния в другое). Например, если в найденных точках параметров, где система находится в колебательном режиме, мы начнем увеличивать значение параметра ,то система перейдет в устойчивое состояние (точка биффуркации)

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]:

Перейдем к анализу устойчивости модели Гудвина в точке . Зададим и посмотрим как изменяется поведение системы в пространстве параметров . При этом, из экономических сображений набор значений параметра представим как вектор ,а значения параметра будем определять эксперементально двигаясь от значения параметра вниз с шагом 0.01 с тем, чтобы обнаружить точку бифуркации, где система переходит из одного состояния в другое. Ниже с помощью разработанных нами скриптов, мы получили для каждого значения параметра серии из 4-х графиков, демонстриющих переход системы из устойчивого состояния в колебательный режим.Полученные результаты можно представить в виде графика(рис. 1). На графике видны точки бифуркации (желтые квадраты),соединяя которые можно получить линию бифуркации.Она делит пространство значений параметров на области устойчивых и неустойчевых состояний.

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) это переодическая функция вида:

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

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 будет возрастающей функцией. Обеспечить (возрастание функции) можно задав fr=0.02 и faz=10.0. Обеспечить условие Q(t)>0 (экономически это означает наличие внешнего притока средств в экономику) можно выбрав определенное значения и и соотношение между ними.

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

Из графиков видно, что угол наклона Q(t) увеличивается от arctg(2/30)=3.81 град. до arctg(25/30)=39.81 град. То есть, скорость роста Q(t) увеличивается на интервале исследования более чем в 10 раз. Функция сначала стабилизируется на определенном уровне, а затем переходит в режим практически линейного устойчивого роста, при этом переходная фаза к усточивому состоянию становиться все менее выраженной (уменьшается число колебаний и их амплитуда). Грубо по графикам оценим скрость роста . При ; ; ; ;
; ; . В точке, где кривая роста стновитья явно выпуклой и это последняя точка, где на всем диапозоне исследования (). В точке и уходят в отрицательную зону и движение становиться хаотичным. Точкой бифуркации является точка расположенная между и . Это хорошо видно по фазовым портретам последних двух точек исследования.

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] будет убывающей функцией. Обеспечить (убывание функции) можно задав fr=0.02 и faz=0.0. При этом на исследуемом инттервале времени функция может и (экономически это означает наличие убывающего притока средств в экономику, переходящего в отток ресурсов из экономики ).Данное поведение можно обеспечить, выбрав определенное значения и и соотношение между ними.

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

Из графиков видно, что по мере движения от значения отношения до система деградирует (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. Зададим такие параметры ,при которых она на соотвествующем диапозоне t [0,100] будет переодической функцией (). При этом на исследуемом инттервале времени функция может и (экономически это означает наличие переодически увеливающегося и убывающего притока средств в экономику, переходящего в определенные моменты t в отток ресурсов из экономики).Данное поведение можно обеспечить, выбрав определенное значения и и соотношение между ними.

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

Из графиков видно, что при значении отношения система сохраняет устойчивое состояние(x(t)≈ 9.2 ).При находится в колебательном режиме с частотой близкой к частоте $Q(t).\text{При} система переходит в сложное состояние с переодической составляющей с постоянным переходом в отрицательную зону,с экономической точки зрения это соотвествует коллапсу и разрушению системы (фазовый портрет седло с петлями).

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мплитуду. Ниже представлен скрипт, который генерирует реализаций подобной функции

Статистический анализ 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].

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

Полученные статистические характеристики используются для построения графиков: . При построении графиков пропускаются две начальные точки,в которых происходит переходный процесс.

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

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

  • уровень вариотивности существенно ниже чем у $Q(t), \text{что} \text{подтверждается} \text{следующим} ;

  • с 0.99 уверенности , если с 0,99 уверенностью

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

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

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.