In [ ]:
include("Interpolation.jl")
In [53]:
grid = [1, 2]
vals = [2, 0]
Out[53]:
In [54]:
function f(x)
return (vals[2]-vals[1])/(grid[2]-grid[1])*(x-grid[1])+vals[1]
end
return f
In [51]:
grid = [1, 2]
vals = [2, 0]
f = my_lin_interp(grid, vals)
Out[51]:
In [30]:
f(1.5)
Out[30]:
In [26]:
searchsortedfirst(grid, 2)
Out[26]:
In [25]:
searchsortedfirst(grid, 6)
Out[25]:
In [37]:
#Vector 入力への対応
grid = [1, 2]
vals = [2, 0]
f = my_lin_interp(grid, vals)
function my_lin_interp(grid, vals)
function func(x::Real)
return (vals[2]-vals[1])/(grid[2]-grid[1])*(x-grid[1])+vals[1]
end
#引数 x が Vector のときは func(x::Vector) に書いてある命令が,それ以外のときは func(x) に書いてある命令が実行される
function func{T<:Real}(x::Vector{T})
return (vals[2]-vals[1])/(grid[2]-grid[1])*(x-grid[1])+vals[1]
end
return func
end
Out[37]:
In [38]:
f([1.25, 1.5])
Out[38]:
In [39]:
#Type として実装
immutable MyLinInterp
grid
vals
end
# grid,valsからなるMyLinInterpは変更不可能なデータタイプ
In [40]:
#call(x, args...)
#If x is not a Function, then x(args...) is equivalent to call(x, args...). This means that function-like behavior can be added to any type by defining new call methods.
In [46]:
function Base.call(f::MyLinInterp, x)
function func(x::Real)
return (vals[2]-vals[1])/(grid[2]-grid[1])*(x-grid[1])+vals[1]
end
function func{T<:Real}(x::Vector{T})
return (vals[2]-vals[1])/(grid[2]-grid[1])*(x-grid[1])+vals[1]
end
return func
end
Out[46]:
In [49]:
grid = [1, 2.5]
vals = [2, 0]
f = MyLinInterp(grid, vals)
Out[49]:
In [ ]: