In [1]:
function lin_interp(grid, vals)
    function func(x)
        index_1 = searchsortedfirst(grid, x)
        index_2 = searchsortedlast(grid, x)
        x_1 = grid[index_1]
        x_2 = grid[index_2]
        y_1 = vals[index_1]
        y_2 = vals[index_2]
        
        y = ((y_2- y_1)/(x_2 - x_1))*(x - x_1) + y_1
        return y
    end
    return func
end


Out[1]:
lin_interp (generic function with 1 method)

In [2]:
grid = [1, 2]
vals = [2, 0]
f = lin_interp(grid, vals)

f(1.25)


Out[2]:
1.5

In [3]:
function lin_interp(grid, vals)
    function func(x)
        if x <= grid[1]
            index_1 = 1
            index_2 = 2
        elseif x >= grid[length(grid)]
            index_1 = length(grid) - 1
            index_2 = length(grid)
        else
            index_1 = searchsortedfirst(grid, x)
            index_2 = searchsortedlast(grid, x)
        end
        x_1 = grid[index_1]
        x_2 = grid[index_2]
        y_1 = vals[index_1]
        y_2 = vals[index_2]
        
        y = ((y_2- y_1)/(x_2 - x_1))*(x - x_1) + y_1
        return y
    end
    return func
end


WARNING: Method definition lin_interp(Any, Any) in module Main at In[1]:2 overwritten at In[3]:2.
Out[3]:
lin_interp (generic function with 1 method)

In [4]:
grid = [1, 2]
vals = [2, 0]
f = lin_interp(grid, vals)

println(f(100))
println(f(2))


-196.0
0.0

In [5]:
function lin_interp(grid, vals)
    function func(x::Real)
        if x <= grid[1]
            index_1 = 1
            index_2 = 2
        elseif x >= grid[length(grid)]
            index_1 = length(grid) - 1
            index_2 = length(grid)
        else
            index_1 = searchsortedfirst(grid, x)
            index_2 = searchsortedlast(grid, x)
        end
        x_1 = grid[index_1]
        x_2 = grid[index_2]
        y_1 = vals[index_1]
        y_2 = vals[index_2]
        
        y = ((y_2- y_1)/(x_2 - x_1))*(x - x_1) + y_1
        return y
    end
    
    function func{T<:Real}(x::AbstractVector{T})
        y = zeros(length(x))
        for i in 1:length(x)
            y[i] = func(x[i])
        end
        return y
    end
    
    return func
end


WARNING: Method definition lin_interp(Any, Any) in module Main at In[3]:2 overwritten at In[5]:2.
Out[5]:
lin_interp (generic function with 1 method)

In [6]:
grid = [1, 2]
vals = [2, 0]
f = lin_interp(grid, vals)

println(f(1.25))
println(f(100))
println(f([1.25, 100]))
println(f([1.25, 1.5, 1.9, 2.00, 100]))


1.5
-196.0
[1.5,-196.0]
[1.5,1.0,0.2,0.0,-196.0]

In [ ]: