Oyama zemi ex1 linear interpolation

kei ikegami


In [1]:
;cat linear_interp.jl


function li_ikegami(grid, vals)
    n = length(grid)
    m = length(vals)

    if n != m
        print("grid size and value siza is not equal")
    end

    mat = [grid vals]
    mat = sortrows(mat, by = x->(x[1]))
    mat = transpose(mat)

    grid = mat[1, :]
    vals = mat[2, :]

    slope = Array(Float64, n-1)
    for i in 1: (n-1)
        temp_slope = (vals[i] - vals[i+1]) / (grid[i] - grid[i+1])
        slope[i] = temp_slope
    end
    function approx(x_val)

        if x_val > maximum(grid)
            return print("too big value ...")
        end

        if x_val < minimum(grid)
            return print("too small value ...")
        end

        interval = 1
        for j in 1:(n-1)
            if x_val > grid[j+1]
                interval += 1
            else break
            end
        end
        return slope[interval] * (x_val - grid[interval]) + vals[interval]
    end

    function approx{T<:Real}(x::AbstractVector{T})
        n = length(x)
        out = Array(Float64, n)
        for i in 1:n
            out[i] = approx(x[i])
        end
        return out
    end

    return approx
end

In [2]:
include("linear_interp.jl")


Out[2]:
li_ikegami (generic function with 1 method)

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

f(1.25)


Out[3]:
1.5

interpolation examples


In [4]:
using Gadfly
set_default_plot_size(18cm, 12cm)

In [5]:
mesh = 200
grid = linspace(1,2,mesh)
vals = Array(Float64, mesh)
for i in 1: mesh
    vals[i] = f(grid[i])
end
a = 1
b = 2
plot([f], a, b)


Out[5]:
x -0.5 0.0 0.5 1.0 1.5 2.0 2.5 3.0 3.5 0.00 0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.05 1.10 1.15 1.20 1.25 1.30 1.35 1.40 1.45 1.50 1.55 1.60 1.65 1.70 1.75 1.80 1.85 1.90 1.95 2.00 2.05 2.10 2.15 2.20 2.25 2.30 2.35 2.40 2.45 2.50 2.55 2.60 2.65 2.70 2.75 2.80 2.85 2.90 2.95 3.00 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3.0 -2.5 -2.0 -1.5 -1.0 -0.5 0.0 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 -2.0 -1.9 -1.8 -1.7 -1.6 -1.5 -1.4 -1.3 -1.2 -1.1 -1.0 -0.9 -0.8 -0.7 -0.6 -0.5 -0.4 -0.3 -0.2 -0.1 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3.0 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 4.0 -2 0 2 4 -2.0 -1.8 -1.6 -1.4 -1.2 -1.0 -0.8 -0.6 -0.4 -0.2 0.0 0.2 0.4 0.6 0.8 1.0 1.2 1.4 1.6 1.8 2.0 2.2 2.4 2.6 2.8 3.0 3.2 3.4 3.6 3.8 4.0 f(x)

In [6]:
a = 0
b = 20
mesh = 15
s = Array(Float64, mesh)

grid = linspace(a,b,mesh)
for i in 1:mesh
    s[i] = sin(grid[i])
end

g = li_ikegami(grid, s)
plot([g, sin], a,b)


Out[6]:
x -25 -20 -15 -10 -5 0 5 10 15 20 25 30 35 40 45 -20 -19 -18 -17 -16 -15 -14 -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 -20 0 20 40 -20 -18 -16 -14 -12 -10 -8 -6 -4 -2 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 f1 f2 Color -3.5 -3.0 -2.5 -2.0 -1.5 -1.0 -0.5 0.0 0.5 1.0 1.5 2.0 2.5 3.0 3.5 -3.0 -2.9 -2.8 -2.7 -2.6 -2.5 -2.4 -2.3 -2.2 -2.1 -2.0 -1.9 -1.8 -1.7 -1.6 -1.5 -1.4 -1.3 -1.2 -1.1 -1.0 -0.9 -0.8 -0.7 -0.6 -0.5 -0.4 -0.3 -0.2 -0.1 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3.0 -4 -2 0 2 4 -3.0 -2.8 -2.6 -2.4 -2.2 -2.0 -1.8 -1.6 -1.4 -1.2 -1.0 -0.8 -0.6 -0.4 -0.2 0.0 0.2 0.4 0.6 0.8 1.0 1.2 1.4 1.6 1.8 2.0 2.2 2.4 2.6 2.8 3.0 f(x)

residual


In [7]:
a = 0
b = 20
mesh = 15
s = Array(Float64, mesh)

grid = linspace(a,b,mesh)
for i in 1:mesh
    s[i] = sin(grid[i])
end

g = li_ikegami(grid, s)
function residual(x)
    return sin(x) - g(x)
end
plot([residual], a,b)


Out[7]:
x -25 -20 -15 -10 -5 0 5 10 15 20 25 30 35 40 45 -20 -19 -18 -17 -16 -15 -14 -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 -20 0 20 40 -20 -18 -16 -14 -12 -10 -8 -6 -4 -2 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 -1.0 -0.9 -0.8 -0.7 -0.6 -0.5 -0.4 -0.3 -0.2 -0.1 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 -0.92 -0.90 -0.88 -0.86 -0.84 -0.82 -0.80 -0.78 -0.76 -0.74 -0.72 -0.70 -0.68 -0.66 -0.64 -0.62 -0.60 -0.58 -0.56 -0.54 -0.52 -0.50 -0.48 -0.46 -0.44 -0.42 -0.40 -0.38 -0.36 -0.34 -0.32 -0.30 -0.28 -0.26 -0.24 -0.22 -0.20 -0.18 -0.16 -0.14 -0.12 -0.10 -0.08 -0.06 -0.04 -0.02 0.00 0.02 0.04 0.06 0.08 0.10 0.12 0.14 0.16 0.18 0.20 0.22 0.24 0.26 0.28 0.30 0.32 0.34 0.36 0.38 0.40 0.42 0.44 0.46 0.48 0.50 0.52 0.54 0.56 0.58 0.60 0.62 0.64 0.66 0.68 0.70 0.72 0.74 0.76 0.78 0.80 0.82 0.84 0.86 0.88 0.90 0.92 -1.0 -0.5 0.0 0.5 1.0 -1.00 -0.95 -0.90 -0.85 -0.80 -0.75 -0.70 -0.65 -0.60 -0.55 -0.50 -0.45 -0.40 -0.35 -0.30 -0.25 -0.20 -0.15 -0.10 -0.05 0.00 0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 f(x)

decreasing squared residuals as mesh increase


In [9]:
function sum_resi(mesh)   
    a = 0
    b = 20
    mesh_2 = 200
    
    s = Array(Float64, mesh)
    grid = linspace(a,b,mesh)
    
    for i in 1:mesh
        s[i] = sin(grid[i])
    end
    g = li_ikegami(grid, s)
    
    function residual_sq(x)
        return (sin(x) - g(x))^2
    end
    
    grid_2 = linspace(a,b,mesh_2)
    w = Array(Float64, mesh_2)
    
    for i in 1:mesh_2
        w[i] = residual_sq(grid_2[i])
    end 
    return sum(w)
end

max = 20
x_line = collect(2:max)
q = Array(Float64, max-1)

for i in x_line
    q[i-1] = sum_resi(i)
end
plot(x = x_line, y = q, Guide.xlabel("number of mesh"), Guide.ylabel("squared residual"), Guide.title("Decreasing Squared Residual"))


Out[9]:
number of mesh -25 -20 -15 -10 -5 0 5 10 15 20 25 30 35 40 45 -20 -19 -18 -17 -16 -15 -14 -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 -20 0 20 40 -20 -18 -16 -14 -12 -10 -8 -6 -4 -2 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 -250 -200 -150 -100 -50 0 50 100 150 200 250 300 350 400 450 -200 -190 -180 -170 -160 -150 -140 -130 -120 -110 -100 -90 -80 -70 -60 -50 -40 -30 -20 -10 0 10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180 190 200 210 220 230 240 250 260 270 280 290 300 310 320 330 340 350 360 370 380 390 400 -200 0 200 400 -200 -180 -160 -140 -120 -100 -80 -60 -40 -20 0 20 40 60 80 100 120 140 160 180 200 220 240 260 280 300 320 340 360 380 400 squared residual Decreasing Squared Residual

In [ ]: