Setindex! not defined for StepRangeLen

Hello, I got the following error when I ran the following code:setindex! not defined for StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}
I found out he had run T1. But why is this wrong? thanks

using Optim, LinearAlgebra, Statistics, Plots, QuantEcon, Distributions, Interpolations, NLsolve, Random, JuMP, GLPK
import Ipopt

function CareerWorkerProblem(;β = 0.88, 
                             θ = 3.4,
                             Nb = 1000,
                             Nz = 50, 
                             v = 0.19,
                             α = 0.33,
                             δ = 1.5,
                             χ = 0.05,
                             ϵ = 0.335,
                             γ = 0.89,
                             ψ = 0.95,
                             ξ = 0.8 )
    wage = 1                                    
    rate = 1                                    
    grid_z = range(1, 10, length = 50)          
    grid_b = range(0, 5, length = 1000)         
    dist_z = Pareto(θ)                          
    z_probs = pdf.(dist_z, grid_z)              
    return (β=β, θ=θ, Nb=Nb, Nz=Nz,v=v,α=α, δ=δ, χ=χ, ϵ=ϵ, γ=γ, ψ=ψ, wage=wage, rate=rate, grid_z=grid_z, grid_b=grid_b, dist_z=dist_z, z_probs=z_probs)
end

out = zeros(50,1000)                            
action = zeros(50,1000)                         
Tw1 = zeros(1000,1)                            
Tw2 = zeros(1000,1)
Tw3 = zeros(1000,1)
c_choice1 = zeros(1000,1)
k_choice2 = zeros(1000,1)
l_choice3 = zeros(1000,1)
c_choice1 = zeros(1000,1)
k_choice2 = zeros(1000,1)
l_choice3 = zeros(1000,1)
c_choice1 = zeros(1000,1)
k_choice2 = zeros(1000,1)
l_choice3 = zeros(1000,1)
#################################### bellman begin #################################
function bellman(cp)
        
    for i in 1:50                                 
        
################################### choice1 ##########################
        function T1(w)                          
            
            # 插值函数t1
            function t1(x)                      
                w_func = LinearInterpolation(cp.grid_b, w,extrapolation_bc=Line())
                return w_func(x)
            end
            
            # 优化模型choice1 
            choice1 = Model(Ipopt.Optimizer)                   
            @variable(choice1, x >= 0)                         
            register(choice1,:w_func,1,t1; autodiff = true)     
            @NLparameter(choice1, b == 0)
            @NLobjective(choice1, Max, (x^(1-cp.δ))/(1-cp.δ) + cp.β * (w_func((b*(1+cp.rate)+cp.wage-x)))) 
            for j in 1:cp.Nb
                set_value(b, cp.grid_b[j])
                optimize!(choice1)    
                Tw1[j,1] = objective_value(choice1) 
                c_choice1[j,1] = value(x)
            end
            
        return Tw1   
        end
        
        function solve_optgrowth1(initial_w; tol = 1e-6, max_iter = 500)   
            fixedpoint(w -> T1(w), initial_w).zero                         
        end
        
################################### choice2 ##########################   
        function T2(w)
            
            # 插值函数t2
            function t2(x)
                w_func2 = LinearInterpolation(cp.grid_b, w)
                return w_func2(x)
            end   
            
            #优化模型choice2
            choice2 = Model(Ipopt.Optimizer) 
            @variable(choice2, x >= 0)
            @variable(choice2, y >= 0)
            @variable(choice2, z >= 0)
            register(choice2, :w_func2, 1, t2; autodiff = true)
            @NLparameter(choice2, b == 1)
            @NLobjective(choice2, Max, (x^(1-cp.δ))/(1-cp.δ) + cp.β * (w_func2(-x + (1+cp.rate)*(b-y) + (1-cp.δ)*y + cp.grid_z[i]*((y^α)*(z^(1-α))^(1-cp.v))-cp.wage*z)))
            @NLconstraint(choice2, x[2] <= b)
            
            for j in 1:cp.Nb
                set_value(b, cp.grid_b[j])
                optimize!(choice2)
                Tw2[j,1] = objective_value(choice2) 
                c_choice2[j,1] = value(x)
                k_choice2[j,1] = value(y)
                l_choice2[j,1] = value(z)
            end
            
        return Tw2
        end 
        
        function solve_optgrowth2(initial_w; tol = 1e-6, max_iter = 500)
            fixedpoint(w -> T2(w), initial_w).zero # gets returned
        end
        
################################### choice3 ########################## 
        function T3(w)
            
            function t3(x)
                w_func3 = LinearInterpolation(cp.grid_b, w,extrapolation_bc=Line())
                return w_func3(x)
            end
            
            choice3 = Model(Ipopt.Optimizer) 
            @variable(choice3, x >= 0)
            @variable(choice3, y >= 0)
            @variable(choice3, z >= 0)
            register(choice3, :w_func3, 1, t3; autodiff = true)
            @NLparameter(choice3, b == 1)
            @NLobjective(choice3, Max, (x^(1-cp.δ))/(1-cp.δ) + cp.β * (w_func3(-x - cp.wage*z + (1-cp.δ)*y - (1+cp.rate+cp.χ)*(y-b+cp.ψ) +cp.grid_z[i]*((y^α)*(z^(1-α))^(1-cp.v)))))
            @NLconstraint(choice3, cp.ξ*y <= b - cp.ψ)
            @NLconstraint(choice3, x[2] >= b)
            
            for j in 1:cp.Nb
                set_value(b, cp.grid_b[j])
                optimize!(choice3)
                Tw3[j,1] = objective_value(choice3) # 返回生产率为zi,初始财富为bj下的最优值函数
                c_choice3[j,1] = value(x)
                k_choice3[j,1] = value(y)
                l_choice3[j,1] = value(z)
            end
        
            return Tw3
        end
            
        function solve_optgrowth3(initial_w; tol = 1e-6, max_iter = 500)
            fixedpoint(w -> T3(w), initial_w).zero # gets returned
        end
################################### solve ##########################         
        initial_w= cp.grid_b
        v_star_approx1 = solve_optgrowth1(initial_w)
        v_star_approx2 = solve_optgrowth2(initial_w)
        v_star_approx3 = solve_optgrowth3(initial_w.(cp.grid_b))
        func1 = LinearInterpolation(cp.grid_b, v_star_approx1,extrapolation_bc=Line())
        func2 = LinearInterpolation(cp.grid_b, v_star_approx2,extrapolation_bc=Line())
        func3 = LinearInterpolation(cp.grid_b, v_star_approx3,extrapolation_bc=Line())
        for j in 1:cp.Nb
            
            b = cp.grid_b[j]
            
            v1 = func1(b)
            v2 = func2(b)
            v3 = func3(b)
            
            if v1 > max(v2, v3)
                action = 1
            elseif v2 > max(v1, v3)
                action = 2
            else
                action = 3
            end
            
            action[i,j] = action
            out[i,j] = max(v1, v2, v3)
        end        
    end
    
    return action, out
    
end
#################################### Bellman end #################################

wp = CareerWorkerProblem()

action, out = bellman(wp)

You need to collect so that I converts it to an array because assigning to a StepRangeLen does not work.

Another thing: you’ll need to rename one of the variables named action.

setindex! will not work because that type does not explicitly store every index, so there’s nothing to set. You will need to call collect() on the object instead which converts it to an array.