-
Notifications
You must be signed in to change notification settings - Fork 0
/
6_splines_and_interpolation.jl
94 lines (82 loc) · 4.71 KB
/
6_splines_and_interpolation.jl
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
function create_quadratic_spline(x::Union{Array{DateTime,1},Array{Date,1},Array{Union{Date,DateTime},1}},y::Array{<:Real,1} ; gradients::Union{Missing,Array{<:Real,1}} = missing, extrapolation::Tuple{Schumaker_ExtrapolationSchemes,Schumaker_ExtrapolationSchemes} = (Curve,Curve), left_gradient::Union{Missing,Real} = missing, right_gradient::Union{Missing,Real} = missing)
x_as_Floats = years_from_global_base.(x)
return create_quadratic_spline(x_as_Floats, y; gradients = gradients, extrapolation = extrapolation, left_gradient = left_gradient, right_gradient = right_gradient)
end
function create_quadratic_spline(x::Array{<:Real,1},y::Array{<:Real,1} ; gradients::Union{Missing,Array{<:Real,1}} = missing, extrapolation::Tuple{Schumaker_ExtrapolationSchemes,Schumaker_ExtrapolationSchemes} = (Curve,Curve),
left_gradient::Union{Missing,Real} = missing, right_gradient::Union{Missing,Real} = missing)
schum = Schumaker(x, y; gradients = gradients, extrapolation = extrapolation, left_gradient = left_gradient, right_gradient = right_gradient)
return create_quadratic_spline(schum)
end
function create_quadratic_spline(schum::Schumaker)
starts_ = schum.IntStarts_
coefficients = schum.coefficient_matrix_
number_of_intervals = size(coefficients)[1]
funcs_ = Array{Sum_Of_Functions,1}(undef, number_of_intervals)
for i in 1:number_of_intervals
quadratic = PE_Function(coefficients[i,1], 0.0, starts_[i], 2)
linear = PE_Function(coefficients[i,2], 0.0, starts_[i], 1)
constant = PE_Function(coefficients[i,3], 0.0, 0.0 , 0)
polynomial = Sum_Of_Functions([quadratic, linear, constant])
funcs_[i] = polynomial
end
return Piecewise_Function(starts_, funcs_)
end
function create_quadratic_spline(x::Union{Array{D,1},Array{<:DatePeriod,1}},y::Array{<:Real,1}; gradients::Union{Missing,Array{<:Real,1}} = missing, extrapolation::Tuple{Schumaker_ExtrapolationSchemes,Schumaker_ExtrapolationSchemes} = (Curve,Curve),
left_gradient::Union{Missing,Real} = missing, right_gradient::Union{Missing,Real} = missing) where D<:DatePeriod
x_as_Floats = period_length.(x)
return create_quadratic_spline(x_as_Floats, y; gradients = gradients, extrapolation = extrapolation, left_gradient = left_gradient, right_gradient = right_gradient)
end
function create_constant_interpolation_to_right(x::Array{Date,1},y::Array{<:Real,1})
x_Float = years_from_global_base.(x)
return create_constant_interpolation_to_right(x_Float,y)
end
function create_constant_interpolation_to_right(x::Array{<:Real,1},y::Array{<:Real,1})
x_ = vcat(-Inf,x)
y = vcat(y[1], y)
funcs_ = PE_Function.(y,0.0,0.0,0)
return Piecewise_Function(x_, funcs_)
end
function create_constant_interpolation_to_right(x::Union{Array{D,1},Array{<:DatePeriod,1}},y::Array{<:Real,1}) where D<:DatePeriod
x_as_Floats = period_length.(x)
return create_constant_interpolation_to_right(x_as_Floats,y)
end
function create_constant_interpolation_to_left(x::Array{Date,1},y::Array{<:Real,1})
x_Float = years_from_global_base.(x)
return create_constant_interpolation_to_left(x_Float,y)
end
function create_constant_interpolation_to_left(x::Array{<:Real,1},y::Array{<:Real,1})
x_ = vcat(-Inf,x[1:(length(x)-1)])
funcs_ = PE_Function.(y,0.0,0.0,0)
return Piecewise_Function(x_, funcs_)
end
function create_constant_interpolation_to_left(x::Union{Array{D,1},Array{<:DatePeriod,1}},y::Array{<:Real,1}) where D<:DatePeriod
x_as_Floats = period_length.(x)
return create_constant_interpolation_to_left(x_as_Floats,y)
end
function create_linear_interpolation(x::Array{Date,1},y::Array{<:Real,1})
x_Float = years_from_global_base.(x)
return create_linear_interpolation(x_Float,y)
end
function create_linear_interpolation(x::Union{Array{D,1},Array{<:DatePeriod,1}},y::Array{<:Real,1}) where D<:DatePeriod
x_as_Floats = period_length.(x)
return create_linear_interpolation(x_as_Floats,y)
end
function create_linear_interpolation(x::Array{R,1},y::Array{<:Real,1}) where R<:Real
len = length(x)
if len < 2
error("Insufficient data to linearly interpolate")
end
starts_ = Array{R,1}(undef, len-1)
funcs_ = Array{UnivariateFunction}(undef, len-1)
coefficient = (y[2] - y[1])/(x[2] - x[1])
starts_[1] = -Inf
funcs_[1] = Sum_Of_Functions([PE_Function(y[1],0.0,0.0,0), PE_Function(coefficient,0.0,x[1],1)])
if len > 2
for i in 2:(len-1)
starts_[i] = x[i]
coefficient = (y[i+1] - y[i])/(x[i+1] - x[i])
funcs_[i] = Sum_Of_Functions([PE_Function(y[i],0.0,0.0,0), PE_Function(coefficient,0.0,x[i],1)])
end
end
return Piecewise_Function(starts_, funcs_)
end