線形補間をするコードを書いてみる. 詳細: https://github.com/myuuuuun/oyama_seminar2016/tree/master/exercise/ex01
In [1]:
# imports
using Gadfly
set_default_plot_size(24cm, 12cm)
In [2]:
array = collect(0:2:10)
println(array)
# Return the index of the first value in a greater than or equal to x
println("first, 3.5: ", searchsortedfirst(array, 3.5))
println("first, -2: ", searchsortedfirst(array, -2))
println("first, 11: ", searchsortedfirst(array, 11))
# Return the index of the first value in a less than or equal to x
println("last, 3.5: ", searchsortedlast(array, 3.5))
println("last, -2: ", searchsortedlast(array, -2))
println("last, 11: ", searchsortedlast(array, 11))
# Returns the range of indices of a which compare as equal to x
println("range, 3.5: ", searchsorted(array, 3.5))
In [3]:
function my_lin_interp(grid, vals)
function func(x)
lower_index = searchsortedlast(grid, x)
upper_index = lower_index + 1
if lower_index == 0 || lower_index == length(grid)
throw(DomainError())
end
grid_step = grid[upper_index] - grid[lower_index]
val_step = vals[upper_index] - vals[lower_index]
iterp_val = vals[lower_index] + (val_step / grid_step)* (x - grid[lower_index])
return iterp_val
end
return func
end
Out[3]:
In [4]:
grid = collect(0:2:10)
val = collect(0:2:10)
interp_func = my_lin_interp(grid, val)
println(interp_func(0))
println(interp_func(1))
println(interp_func(2))
In [5]:
grid2 = linspace(-3pi, 3pi, 201)
val2 = cos.(grid2)
grid3 = linspace(-3pi, 3pi, 19)
val3 = cos.(grid3)
set_default_plot_size(24cm, 6cm)
plot(
layer(x=grid2, y=val2, Geom.line, Theme(line_width=2pt)),
layer(x=grid3, y=val3, Geom.point, Geom.line, Theme(default_color=colorant"red"), order=2),
Guide.xlabel("x"), Guide.ylabel("cosx"), Guide.title("Interpolation of cos x")
)
Out[5]:
In [6]:
interp_func2 = my_lin_interp(grid3, val3)
@printf "cos(0) の 真値: %.5f, 補間値: %.5f\n" cos(0) interp_func2(0)
@printf "cos(π/4) の 真値: %.5f, 補間値: %.5f\n" cos(pi/4) interp_func2(pi/4)
@printf "cos(π/3) の 真値: %.5f, 補間値: %.5f\n" cos(pi/3) interp_func2(pi/3)
println("\n参考: 1/√2 = ", 1/1.4142)
In [7]:
immutable MyInterp
grid::Array
vals::Array
end
function (points::MyInterp)(x)
grid = points.grid; vals = points.vals
lower_index = searchsortedlast(points.grid, x)
upper_index = lower_index + 1
if lower_index == 0 || lower_index == length(grid)
throw(DomainError())
end
grid_step = grid[upper_index] - grid[lower_index]
val_step = vals[upper_index] - vals[lower_index]
iterp_val = vals[lower_index] + (val_step / grid_step)* (x - grid[lower_index])
return iterp_val
end
In [8]:
grid3 = linspace(-3pi, 3pi, 19)
val3 = cos.(grid3)
cos_interp = MyInterp(grid3, val3)
@printf "cos(0) の 真値: %.5f, 補間値: %.5f\n" cos(0) cos_interp(0)
@printf "cos(π/4) の 真値: %.5f, 補間値: %.5f\n" cos(pi/4) cos_interp(pi/4)
@printf "cos(π/3) の 真値: %.5f, 補間値: %.5f\n" cos(pi/3) cos_interp(pi/3)
println("\n参考: 1/√2 = ", 1/1.4142)
In [9]:
immutable MyInterp2
grid::Array
vals::Array
end
function (points::MyInterp2)(x::Real)
grid = points.grid; vals = points.vals
lower_index = searchsortedlast(points.grid, x)
upper_index = lower_index + 1
if lower_index == 0 || lower_index == length(grid)
return NaN
end
grid_step = grid[upper_index] - grid[lower_index]
val_step = vals[upper_index] - vals[lower_index]
iterp_val = vals[lower_index] + (val_step / grid_step)* (x - grid[lower_index])
return iterp_val
end
In [10]:
grid3 = linspace(-3pi, 3pi, 19)
val3 = cos.(grid3)
cos_interp = MyInterp2(grid3, val3)
@printf "cos(0) の 真値: %.5f, 補間値: %.5f\n" cos(0) cos_interp(0)
@printf "cos(π/4) の 真値: %.5f, 補間値: %.5f\n" cos(pi/4) cos_interp(pi/4)
@printf "cos(π/3) の 真値: %.5f, 補間値: %.5f\n" cos(pi/3) cos_interp(pi/3)
@printf "cos(-4π) の 真値: %.5f, 補間値: %.5f\n" cos(-4pi) cos_interp(-4pi)
println( "\nVector version: ", cos_interp.([-3pi, 2pi, 4pi, pi/4, -4pi, pi/3, 0, 2.4]) )
In [ ]: