利用Julia中的辛方法求解一般均衡问题

利用Julia中的辛方法求解一般均衡问题,julia,sympy,Julia,Sympy,我试图用朱莉娅的Symphy软件包解决一个经济问题。在这个经济问题中,我有外生变量和内生变量,我正在对它们进行索引。我有两个问题: 如何访问要传递的索引变量:校准值(到外部变量,在其他环境中校准)或公式(到内生变量,由代理使用铅笔和纸的最大化问题的一阶条件确定)。这也将允许我研究当我干扰外生变量时的平衡行为。首先,考虑我尝试通过外生变量的校准值。 方程式_1表示α加γ和1之和。因此,我想根据另一个向量alpha3将值传递给α向量,该向量带有校准参数 # Suposse alpha3 = [1,2

我试图用朱莉娅的Symphy软件包解决一个经济问题。在这个经济问题中,我有外生变量和内生变量,我正在对它们进行索引。我有两个问题:

  • 如何访问要传递的索引变量:校准值(到外部变量,在其他环境中校准)或公式(到内生变量,由代理使用铅笔和纸的最大化问题的一阶条件确定)。这也将允许我研究当我干扰外生变量时的平衡行为。首先,考虑我尝试通过外生变量的校准值。
  • 方程式_1表示α加γ和1之和。因此,我想根据另一个向量alpha3将值传递给α向量,该向量带有校准参数

    # Suposse
    alpha3 = [1,2,3]
    
    for n in 1:N
            α[n]= alpha3[n]
    end
    MethodError: no method matching setindex!(::Sym, ::Int64, ::Int64)
    
    一旦系统解决了,我肯定会做这一步。现在,我想传递公式或表达式作为价格的函数。价格是内生的未知变量。(如前所述,表达式是用纸和铅笔计算的)

    < >我可以在<代码> s[n] < /代码>和<代码> d[n] < /代码>上编写公式,考虑第二个问题:

  • 在非线性方程组中,如何指定索引的内生变量(以其索引格式的所有价格
    P[n]
    )为未知变量?我将忽略不解决我的系统的可能性。假设我的系统有一个单一解或无限解(流形)。让我们假设我的方程比变量多:

  • 非常感谢

    Symphy的
    索引数据库
    功能没有任何直接支持。因此,语法
    alpha[n]
    不可用。您可以直接调用方法
    \uuu getitem\uu
    ,如

    alpha.__getitem__[n]
    
    我没有看到相应的
    \uuuuu setitem\uuuuu
    文档,所以我不确定

    α[n]= alpha3[n]
    
    在sympy中是有效的。但若有其他赋值方法,您可能只调用它,而不是使用
    [
    进行赋值

    关于方程的最后一个问题,我不确定,但您可能会找到IndexedBase对象的大小,并使用它来循环

    如果可能的话,尽可能使用本机朱丽亚构造。对于这个例子,您可能只考虑变量数组。最近更改的<代码> @ Syss< /Cord:Me宏使这很容易生成。

    例如,我认为以下内容主要重复了您正在尝试的操作:

    @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])
    

    我从你的答案中吸取了一些教训,但当我运行solveset函数时,它给出了一个错误。首先,eq_系统看起来很奇怪,但我设法使用vcat函数连接。但是当我执行solveset函数时,错误是:ArgumentError:无效索引:n类型SYM我认为它与nonlinsolve一起工作得更好。我刚刚测试了它重新。
    alpha.__getitem__[n]
    
    α[n]= alpha3[n]
    
    @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])