public static double[,] Run()
        {
            const int    count     = 100;
            const double timescale = 1.0 / 4;

            CircleGraph firms = new CircleGraph(count, 4);

            firmCapital = new NodeStock("Capital (K)", firms.GraphStack, new NodeConstant("initial", firms.GraphStack, NodeRandomInitial, GlobalDimensions.get("k")));

            TemporalVariable firmProduction = new Function("Production (Y)", x => timescale * x[0] * Math.Pow(x[1], x[2]),
                                                           GlobalDimensions.get("k"), (firms.NodeEdgeCount() + 1), firmCapital, new Constant("Preference (alpha)", .3, Dimensionless.Instance));

            Constant savingsRate = new Constant("Savings Rate (s)", .1, GlobalDimensions.Time.RaisedTo(-1));

            firms.AddAction(new StepNodeAction(.1 * timescale, AddRandomEdge));             // technological advancement
            firms.AddAction(new StepNodeAction(GrowOrDie, new PassiveDelay(firmProduction, 1), savingsRate, firmCapital, new Constant("Depreciation Rate (delta)", .1 * timescale, GlobalDimensions.Time.RaisedTo(-1))));

            double[,] result = new double[1000, 3];
            for (int tt = 0; tt < 1000; tt++)
            {
                collapses     = 0;
                result[tt, 0] = firms.Sum(firmCapital).Evaluate(tt);
                result[tt, 1] = (1 - savingsRate.Evaluate(tt)) * firms.Sum(firmProduction).Evaluate(tt);
                result[tt, 2] = collapses;
            }

            return(result);
        }
Beispiel #2
0
        public static double[,] Run()
        {
            const int    count     = 100;
            const double timescale = 1.0 / 4;

            // First get this working like SolowModel, then move into SOCSolowModel
            Stock            labor     = new SimplePopulationStock("Labor (L)", 10000, .01 * timescale);
            TemporalVariable firmLabor = labor / new Constant("Firms", count, Dimensionless.Instance);

            CircleGraph firms = new CircleGraph(count, 4);

            firmCapital = new NodeStock("Capital (K)", firms.GraphStack, new NodeConstant("initial", firms.GraphStack, NodeRandomInitial, GlobalDimensions.get("k")));

            TemporalVariable firmEffectiveLabor = firmLabor * (firms.NodeEdgeCount() + 1);
            TemporalVariable firmProduction     = new Function("Production (Y)", x => timescale * Math.Pow(count * x[0], x[2]) * Math.Pow(count * x[1], (1 - x[2])),
                                                               GlobalDimensions.get("k"), firmCapital, firmEffectiveLabor, new Constant("Preference (alpha)", .3, Dimensionless.Instance));

            Constant savingsRate = new Constant("Savings Rate (s)", .1, GlobalDimensions.Time.RaisedTo(-1));

            firms.AddAction(new StepNodeAction(.1 * timescale, AddRandomEdge));             // technological advancement
            firms.AddAction(new StepNodeAction(GrowOrDie, new PassiveDelay(firmProduction, 1), savingsRate, firmCapital, new Constant("Depreciation Rate (delta)", .1 * timescale, GlobalDimensions.Time.RaisedTo(-1))));

            //TemporalVariable capitalPerEffectiveLaborer = firms.Sum(firmCapital) / firms.Sum(firmEffectiveLabor);
            TemporalVariable capitalPerLaborer    = firms.Sum(firmCapital) / firms.Sum(firmLabor);
            TemporalVariable productionPerLaborer = firms.Sum(firmProduction) / firms.Sum(firmLabor);

            double[,] result = new double[1000, 4];
            for (int tt = 0; tt < 1000; tt++)
            {
                collapses     = 0;
                result[tt, 0] = capitalPerLaborer.Evaluate(tt);
                result[tt, 1] = (1 - savingsRate.Evaluate(tt)) * productionPerLaborer.Evaluate(tt);
                result[tt, 2] = labor.Evaluate(tt);
                result[tt, 3] = collapses;
            }

            return(result);
        }