Fam
Fam

Reputation: 533

General Equilibrium Problem using SymPy in Julia

I am trying to solve an economic problem using the sympy package in Julia. In this economic problem I have exogenous variables and endogenous variables and I am indexing them all. I have two questions:

  1. How to access the indexed variables to pass: calibrated values ( to exogenous variables, calibrated in other enveiroment) or formula (to endogenous variables, determined by the first order conditions of the agents' maximalization problem using pencil and paper). This will also allow me to study the behavior of equilibrium when I disturb exogenous variables. First, consider my attempto to pass calibrated values on exogenous variables.
using SymPy

# To index
n,N = sympy.symbols("n N", integer=True)

N = 3 # It can change

# Household

#exogenous variables
α = sympy.IndexedBase("α")
@syms γ
α2 =  sympy.Sum(α[n], (n, 1, N))
equation_1 = Eq(α2  + γ, 1)

The equation_1 says that the alpha's plus gamma sums one. So I would like to pass values to the α vector according to another vector, alpha3, with calibrated parameters.

# Suposse
alpha3 = [1,2,3]

for n in 1:N
        α[n]= alpha3[n]
end
MethodError: no method matching setindex!(::Sym, ::Int64, ::Int64)

I will certainly do this step once the system is solved. Now, I want to pass formulas or expressions as a function of prices. Prices are endogenous and unknown variables. (As said before, the expressions were calculated using paper and pencil)

# Price vector, Endogenous, unknown in the system equations
P = sympy.IndexedBase("P")

# Other exogenous variables to be calibrated.
z = sympy.IndexedBase("z")
s = sympy.IndexedBase("s")
Y = sympy.IndexedBase("Y")

# S[n] and D[n], Supply and Demand, are endogenous, but determined by the first order conditions of the maximalization problem of the agents

# Supply and Demand 
S = sympy.IndexedBase("S")
D = sympy.IndexedBase("D")

# (Hypothetical functions that I have to pass)
# S[n] = s[n]*P[n]
# D[n] = z[n]/P[n]  

Once I can write the formulas on S[n] and D[n], consider the second question:

  1. How to specify the endogenous variables indexed (All prices in their indexed format P[n]) as being unknown in the system of non-linear equations? I will ignore the possibility of not solving my system. Suppose my system has a single solution or infinite (manifold). So let's assume that I have more equations than variables:
# For all n, I want determine N indexed equations (looping?) 
Eq_n = Eq(S[n] - D[n],0)
# Some other equations relating the P[n]'s
Eq0 = Eq(sympy.Sum(P[n]*Y[n] , (n, 1, N)), 0 )

# Equations system
eq_system = [Eq_n,Eq0]

# Solving 
solveset(eq_system,P[n])

Many thanks

Upvotes: 2

Views: 200

Answers (1)

jverzani
jverzani

Reputation: 5700

There isn't any direct support for the IndexedBase feature of SymPy. As such, the syntax alpha[n] is not available. You can call the method __getitem__ directly, as with

alpha.__getitem__[n]

I don't see a corresponding __setitem__ documented, so I'm not sure whether

α[n]= alpha3[n]

is valid in sympy itself. But if there is some other assignment method, you would likely just call that instead of the using [ for assignment.

As for the last question about equations, I'm not sure but you would presumably find the size of the IndexedBase object and use that to loop.

If possible, using native julia constructs would be preferred, as possible. For this example, you might just consider an array of variables. The recently changed @syms macro makes this easy to generate.

For example, I think the following mostly replicates what you are trying to do:

@syms n::integer, N::integer

#exogenous variables
N = 3
@syms α[1:3] # hard code 3 here or use `α =[Sym("αᵢ$i") for i ∈ 1:N]`
@syms γ
α2 = sum(α[i] for i ∈ 1:N)
equation_1 = Eq(α2  + γ, 1)


alpha3 = [1,2,3]

for n in 1:N
    α[n]= alpha3[n]
end

@syms P[1:3], z[1:3], s[1:3], γ[1:3], S[1:3], D[1:3]
Eq_n = [Eq(S[n], D[n]) for n ∈ 1:N]
Eq0 = Eq(sum(P .* Y), 0)

eq_system = [Eq_n,Eq0]

solveset(eq_system,P[n])

Upvotes: 2

Related Questions