Skip to content

Commit

Permalink
whit3 passed test
Browse files Browse the repository at this point in the history
  • Loading branch information
kongdd committed May 6, 2024
1 parent b3a3299 commit ca5ece1
Show file tree
Hide file tree
Showing 14 changed files with 736 additions and 338 deletions.
48 changes: 44 additions & 4 deletions data/data01-CA_NS6.jl
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
using JLD2
using RData
using UnPack
using VegCurveFit
using BenchmarkTools

l = load("data/phenofit-CA_NS6.rda")
@unpack INPUT, brks2 = l
Expand All @@ -10,9 +12,47 @@ nptperyear = INPUT["nptperyear"] |> Int
y = INPUT["y"]
t = INPUT["t"]
w = INPUT["w"]
QC_flag = INPUT["QC_flag"]

ylu = INPUT["ylu"]
ylu = [ylu[1], ylu[2]]
# QC_flag = INPUT["QC_flag"]
n = length(y)
w = ones(n)
t = 1:n

jldsave("data/phenofit-CA_NS6.jld2", true; y, t, w, QC_flag, ylu, nptperyear, dt)
# 快20倍左右
z, cve = whit3(y, w; lambda=2);

# cve_right = 0.03960781157141451
@time z, cve = whit3(y, w; lambda=2);
@time z2, cve2 = WHIT(y, t, w; d=3, lambda=2)

z - z2

@btime z, cve = whit3($y, $w; lambda=2);
@btime z2 = WHIT($y, $t; d=3, lambda=2);

@btime z, cve = whit2($y, $w; lambda=2);
@btime z2 = WHIT($y, $t; d=2, lambda=2);

begin
# z, cve = whit2(y, ones(n); lambda=2)
# z2 = whit(y, 1:length(y); d=2, lambda=2)
# @time z, cve = whit3(y, ones(n); lambda=2)
# @time z2 = whit(y, 1:length(y); d=3, lambda=2)
# z - z2

using Plots
plot()
# plot(y, label="y", color="grey")
plot!(z, label="fast")
plot!(z2, label="matrix")
end


# ylu = INPUT["ylu"]
# ylu = [ylu[1], ylu[2]]
# using RTableTools
# d = DT(; y, w)
# fwrite(d, "data.csv")

# jldsave("data/phenofit-CA_NS6.jld2", true; y, t, w, QC_flag, ylu, nptperyear, dt)
whit2(y, )
14 changes: 14 additions & 0 deletions docs/references/main_whit.jl
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using LinearAlgebra, SparseArrays
using Symbolics
import Symbolics: scalarize, variables

@variables λ

Expand Down Expand Up @@ -41,3 +42,16 @@ function LU_decompose(A₁)
end
(; L, U=A₁)
end

function diag_m(x)
n = length(x)
M = Matrix{Num}(undef, n, n)
for i = 1:n, j = 1:n
if i == j
M[i, j] = x[i]
else
M[i, j] = 0.0
end
end
M
end
25 changes: 25 additions & 0 deletions docs/references/test-whit.qmd
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
```{julia}
using LinearAlgebra, SparseArrays
using Symbolics
speye(n) = SparseArrays.sparse(I, n, n)
function Base.diff(x::SparseMatrixCSC, d::Integer=1)
D = x[2:end, :] .- x[1:end-1, :]
d >= 2 ? diff(D, d - 1) : D
end
function ddmat(x::AbstractVector, d::Integer=2)
m = length(x)
if d == 0
return speye(m)
else
dx = x[(d+1):m] - x[1:(m-d)] # bug may here
return diff(ddmat(x, d - 1))
end
end
n = 8
D = ddmat(1:n, 4)
display(D)
```
8 changes: 4 additions & 4 deletions docs/references/whittaker_Cholesky_weinert2007.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@
},
{
"cell_type": "code",
"execution_count": 19,
"execution_count": 5,
"id": "6cba1139-83f8-40eb-bf2e-69bdf19d3356",
"metadata": {},
"outputs": [
Expand Down Expand Up @@ -135,7 +135,7 @@
" (-e_5*θ_5) / f_5 + θ_6 / f_6 + θ_4 w_6"
]
},
"execution_count": 19,
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
Expand Down Expand Up @@ -331,15 +331,15 @@
],
"metadata": {
"kernelspec": {
"display_name": "Julia 1.10.0",
"display_name": "Julia 1.10.3",
"language": "julia",
"name": "julia-1.10"
},
"language_info": {
"file_extension": ".jl",
"mimetype": "application/julia",
"name": "julia",
"version": "1.10.0"
"version": "1.10.3"
}
},
"nbformat": 4,
Expand Down
223 changes: 223 additions & 0 deletions docs/references/whittaker_Cholesky_whit3.ipynb
Original file line number Diff line number Diff line change
@@ -0,0 +1,223 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": 10,
"id": "cd3c38ac-780c-4e99-9e4f-7c26c3d1cf6d",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"diag_m (generic function with 1 method)"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# 这里是whittaker 3阶向量求解过程\n",
"include(\"main_whit.jl\")"
]
},
{
"cell_type": "code",
"execution_count": 46,
"id": "a2c429bc-be39-41e5-a7a0-31ce5e4e0439",
"metadata": {},
"outputs": [
{
"data": {
"text/latex": [
"$$ \\begin{equation}\n",
"\\left[\n",
"\\begin{array}{c}\n",
"\\frac{\\left( - e_1 + c_1 c_2 \\right)^{2}}{d_3} + \\frac{\\left( - \\left( - e_4 + c_4 c_5 \\right) f_1 + \\left( f_3 - c_5 e_3 + c_3 \\left( - e_4 + c_4 c_5 \\right) \\right) e_1 - c_1 \\left( c_5 f_2 - \\left( - e_4 + c_4 c_5 \\right) e_2 + c_2 \\left( f_3 - c_5 e_3 + c_3 \\left( - e_4 + c_4 c_5 \\right) \\right) \\right) \\right)^{2}}{d_6} + \\frac{\\left( - f_1 + c_3 e_1 - c_1 \\left( - e_2 + c_2 c_3 \\right) \\right)^{2}}{d_4} + \\frac{\\left( c_4 f_1 - \\left( - e_3 + c_3 c_4 \\right) e_1 + c_1 \\left( f_2 - c_4 e_2 + c_2 \\left( - e_3 + c_3 c_4 \\right) \\right) \\right)^{2}}{d_5} + \\frac{1}{d_1} + \\frac{c_1^{2}}{d_2} \\\\\n",
"\\frac{\\left( c_5 f_2 - \\left( - e_4 + c_4 c_5 \\right) e_2 + c_2 \\left( f_3 - c_5 e_3 + c_3 \\left( - e_4 + c_4 c_5 \\right) \\right) \\right)^{2}}{d_6} + \\frac{\\left( - e_2 + c_2 c_3 \\right)^{2}}{d_4} + \\frac{\\left( - f_2 + c_4 e_2 - c_2 \\left( - e_3 + c_3 c_4 \\right) \\right)^{2}}{d_5} + \\frac{1}{d_2} + \\frac{c_2^{2}}{d_3} \\\\\n",
"\\frac{1}{d_3} + \\frac{c_3^{2}}{d_4} + \\frac{\\left( - f_3 + c_5 e_3 - c_3 \\left( - e_4 + c_4 c_5 \\right) \\right)^{2}}{d_6} + \\frac{\\left( - e_3 + c_3 c_4 \\right)^{2}}{d_5} \\\\\n",
"\\frac{c_4^{2}}{d_5} + \\frac{\\left( - e_4 + c_4 c_5 \\right)^{2}}{d_6} + \\frac{1}{d_4} \\\\\n",
"\\frac{1}{d_5} + \\frac{c_5^{2}}{d_6} \\\\\n",
"\\frac{1}{d_6} \\\\\n",
"\\end{array}\n",
"\\right]\n",
"\\end{equation}\n",
" $$"
],
"text/plain": [
"6-element Vector{Num}:\n",
" ((-e[1] + c[1]*c[2])^2) / d[3] + ((-(-e[4] + c[4]*c[5])*f[1] + (f[3] - c[5]*e[3] + c[3]*(-e[4] + c[4]*c[5]))*e[1] - c[1]*(c[5]*f[2] - (-e[4] + c[4]*c[5])*e[2] + c[2]*(f[3] - c[5]*e[3] + c[3]*(-e[4] + c[4]*c[5]))))^2) / d[6] + ((-f[1] + c[3]*e[1] - c[1]*(-e[2] + c[2]*c[3]))^2) / d[4] + ((c[4]*f[1] - (-e[3] + c[3]*c[4])*e[1] + c[1]*(f[2] - c[4]*e[2] + c[2]*(-e[3] + c[3]*c[4])))^2) / d[5] + 1 / d[1] + (c[1]^2) / d[2]\n",
" ((c[5]*f[2] - (-e[4] + c[4]*c[5])*e[2] + c[2]*(f[3] - c[5]*e[3] + c[3]*(-e[4] + c[4]*c[5])))^2) / d[6] + ((-e[2] + c[2]*c[3])^2) / d[4] + ((-f[2] + c[4]*e[2] - c[2]*(-e[3] + c[3]*c[4]))^2) / d[5] + 1 / d[2] + (c[2]^2) / d[3]\n",
" 1 / d[3] + (c[3]^2) / d[4] + ((-f[3] + c[5]*e[3] - c[3]*(-e[4] + c[4]*c[5]))^2) / d[6] + ((-e[3] + c[3]*c[4])^2) / d[5]\n",
" (c[4]^2) / d[5] + ((-e[4] + c[4]*c[5])^2) / d[6] + 1 / d[4]\n",
" 1 / d[5] + (c[5]^2) / d[6]\n",
" 1 / d[6]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"n = 6\n",
"@variables λ \n",
"\n",
"@variables d[1:n]\n",
"@variables c[1:n]\n",
"@variables e[1:n]\n",
"@variables f[1:n]\n",
"\n",
"z = variables(:z, 1:n)\n",
"w = variables(:w, 1:n)\n",
"y = variables(:y, 1:n)\n",
"θ = variables(:θ, 1:n)\n",
"\n",
"D = diag_m(d)\n",
"L = Matrix{Num}(undef, n, n)\n",
"fill!(L, 0)\n",
"for i = 1:n\n",
" L[i, i] = 1\n",
" i + 1 <= n && (L[i+1, i] = c[i])\n",
" i + 2 <= n && (L[i+2, i] = e[i])\n",
" i+3 <= n && (L[i+3, i] = f[i])\n",
"end\n",
"L\n",
"\n",
"x = inv(L)\n",
"H = x' * inv(D) * x\n",
"diag(H)"
]
},
{
"cell_type": "code",
"execution_count": 41,
"id": "978e9891-eeff-419f-9a0a-1532275e7b42",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 37,
"id": "95234236-46a3-4346-9576-c27ff284868f",
"metadata": {},
"outputs": [],
"source": [
"# H = inv(L * D * L')\n",
"# diag(H)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "25094dd9",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 17,
"id": "e34b6b09-f606-4d4c-9629-2ba664330115",
"metadata": {},
"outputs": [
{
"data": {
"text/latex": [
"$$ \\begin{equation}\n",
"\\left[\n",
"\\begin{array}{c}\n",
"y_1 \\\\\n",
"y_2 - c_1 y_1 \\\\\n",
"y_3 - e_1 y_1 - \\left( y_2 - c_1 y_1 \\right) c_2 \\\\\n",
"y_4 - f_1 y_1 - \\left( y_2 - c_1 y_1 \\right) e_2 - \\left( y_3 - e_1 y_1 - \\left( y_2 - c_1 y_1 \\right) c_2 \\right) c_3 \\\\\n",
"y_5 - \\left( y_2 - c_1 y_1 \\right) f_2 - \\left( y_3 - e_1 y_1 - \\left( y_2 - c_1 y_1 \\right) c_2 \\right) e_3 - \\left( y_4 - f_1 y_1 - \\left( y_2 - c_1 y_1 \\right) e_2 - \\left( y_3 - e_1 y_1 - \\left( y_2 - c_1 y_1 \\right) c_2 \\right) c_3 \\right) c_4 \\\\\n",
"y_6 - \\left( y_3 - e_1 y_1 - \\left( y_2 - c_1 y_1 \\right) c_2 \\right) f_3 - \\left( y_4 - f_1 y_1 - \\left( y_2 - c_1 y_1 \\right) e_2 - \\left( y_3 - e_1 y_1 - \\left( y_2 - c_1 y_1 \\right) c_2 \\right) c_3 \\right) e_4 - \\left( y_5 - \\left( y_2 - c_1 y_1 \\right) f_2 - \\left( y_3 - e_1 y_1 - \\left( y_2 - c_1 y_1 \\right) c_2 \\right) e_3 - \\left( y_4 - f_1 y_1 - \\left( y_2 - c_1 y_1 \\right) e_2 - \\left( y_3 - e_1 y_1 - \\left( y_2 - c_1 y_1 \\right) c_2 \\right) c_3 \\right) c_4 \\right) c_5 \\\\\n",
"y_7 - \\left( y_4 - f_1 y_1 - \\left( y_2 - c_1 y_1 \\right) e_2 - \\left( y_3 - e_1 y_1 - \\left( y_2 - c_1 y_1 \\right) c_2 \\right) c_3 \\right) f_4 - \\left( y_5 - \\left( y_2 - c_1 y_1 \\right) f_2 - \\left( y_3 - e_1 y_1 - \\left( y_2 - c_1 y_1 \\right) c_2 \\right) e_3 - \\left( y_4 - f_1 y_1 - \\left( y_2 - c_1 y_1 \\right) e_2 - \\left( y_3 - e_1 y_1 - \\left( y_2 - c_1 y_1 \\right) c_2 \\right) c_3 \\right) c_4 \\right) e_5 - \\left( y_6 - \\left( y_3 - e_1 y_1 - \\left( y_2 - c_1 y_1 \\right) c_2 \\right) f_3 - \\left( y_4 - f_1 y_1 - \\left( y_2 - c_1 y_1 \\right) e_2 - \\left( y_3 - e_1 y_1 - \\left( y_2 - c_1 y_1 \\right) c_2 \\right) c_3 \\right) e_4 - \\left( y_5 - \\left( y_2 - c_1 y_1 \\right) f_2 - \\left( y_3 - e_1 y_1 - \\left( y_2 - c_1 y_1 \\right) c_2 \\right) e_3 - \\left( y_4 - f_1 y_1 - \\left( y_2 - c_1 y_1 \\right) e_2 - \\left( y_3 - e_1 y_1 - \\left( y_2 - c_1 y_1 \\right) c_2 \\right) c_3 \\right) c_4 \\right) c_5 \\right) c_6 \\\\\n",
"\\end{array}\n",
"\\right]\n",
"\\end{equation}\n",
" $$"
],
"text/plain": [
"7-element Vector{Num}:\n",
" y₁\n",
" y₂ - c[1]*y₁\n",
" y₃ - e[1]*y₁ - (y₂ - c[1]*y₁)*c[2]\n",
" y₄ - f[1]*y₁ - (y₂ - c[1]*y₁)*e[2] - (y₃ - e[1]*y₁ - (y₂ - c[1]*y₁)*c[2])*c[3]\n",
" y₅ - (y₂ - c[1]*y₁)*f[2] - (y₃ - e[1]*y₁ - (y₂ - c[1]*y₁)*c[2])*e[3] - (y₄ - f[1]*y₁ - (y₂ - c[1]*y₁)*e[2] - (y₃ - e[1]*y₁ - (y₂ - c[1]*y₁)*c[2])*c[3])*c[4]\n",
" y₆ - (y₃ - e[1]*y₁ - (y₂ - c[1]*y₁)*c[2])*f[3] - (y₄ - f[1]*y₁ - (y₂ - c[1]*y₁)*e[2] - (y₃ - e[1]*y₁ - (y₂ - c[1]*y₁)*c[2])*c[3])*e[4] - (y₅ - (y₂ - c[1]*y₁)*f[2] - (y₃ - e[1]*y₁ - (y₂ - c[1]*y₁)*c[2])*e[3] - (y₄ - f[1]*y₁ - (y₂ - c[1]*y₁)*e[2] - (y₃ - e[1]*y₁ - (y₂ - c[1]*y₁)*c[2])*c[3])*c[4])*c[5]\n",
" y₇ - (y₄ - f[1]*y₁ - (y₂ - c[1]*y₁)*e[2] - (y₃ - e[1]*y₁ - (y₂ - c[1]*y₁)*c[2])*c[3])*f[4] - (y₅ - (y₂ - c[1]*y₁)*f[2] - (y₃ - e[1]*y₁ - (y₂ - c[1]*y₁)*c[2])*e[3] - (y₄ - f[1]*y₁ - (y₂ - c[1]*y₁)*e[2] - (y₃ - e[1]*y₁ - (y₂ - c[1]*y₁)*c[2])*c[3])*c[4])*e[5] - (y₆ - (y₃ - e[1]*y₁ - (y₂ - c[1]*y₁)*c[2])*f[3] - (y₄ - f[1]*y₁ - (y₂ - c[1]*y₁)*e[2] - (y₃ - e[1]*y₁ - (y₂ - c[1]*y₁)*c[2])*c[3])*e[4] - (y₅ - (y₂ - c[1]*y₁)*f[2] - (y₃ - e[1]*y₁ - (y₂ - c[1]*y₁)*c[2])*e[3] - (y₄ - f[1]*y₁ - (y₂ - c[1]*y₁)*e[2] - (y₃ - e[1]*y₁ - (y₂ - c[1]*y₁)*c[2])*c[3])*c[4])*c[5])*c[6]"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"L * θ\n",
"L \\ y"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "1c25770d-29f2-483c-aa36-36b01fa50ef3",
"metadata": {},
"outputs": [
{
"data": {
"text/latex": [
"$$ \\begin{equation}\n",
"\\left[\n",
"\\begin{array}{cc}\n",
"\\left( z_1 + c_1 z_2 + e_1 z_3 + f_1 z_4 \\right) d_1 & \\theta_1 \\\\\n",
"\\left( z_2 + c_2 z_3 + e_2 z_4 + f_2 z_5 \\right) d_2 & \\theta_2 \\\\\n",
"\\left( z_3 + c_3 z_4 + e_3 z_5 + f_3 z_6 \\right) d_3 & \\theta_3 \\\\\n",
"\\left( z_4 + c_4 z_5 + e_4 z_6 + f_4 z_7 \\right) d_4 & \\theta_4 \\\\\n",
"\\left( z_5 + c_5 z_6 + e_5 z_7 \\right) d_5 & \\theta_5 \\\\\n",
"\\left( z_6 + c_6 z_7 \\right) d_6 & \\theta_6 \\\\\n",
"d_7 z_7 & \\theta_7 \\\\\n",
"\\end{array}\n",
"\\right]\n",
"\\end{equation}\n",
" $$"
],
"text/plain": [
"7×2 Matrix{Num}:\n",
" (z₁ + c[1]*z₂ + e[1]*z₃ + f[1]*z₄)*d[1] θ₁\n",
" (z₂ + c[2]*z₃ + e[2]*z₄ + f[2]*z₅)*d[2] θ₂\n",
" (z₃ + c[3]*z₄ + e[3]*z₅ + f[3]*z₆)*d[3] θ₃\n",
" (z₄ + c[4]*z₅ + e[4]*z₆ + f[4]*z₇)*d[4] θ₄\n",
" (z₅ + c[5]*z₆ + e[5]*z₇)*d[5] θ₅\n",
" (z₆ + c[6]*z₇)*d[6] θ₆\n",
" d[7]*z₇ θ₇"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"display([D * L' * z θ])\n",
"# z' = (L' * z) \\ θ\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Julia 1.10.3",
"language": "julia",
"name": "julia-1.10"
},
"language_info": {
"file_extension": ".jl",
"mimetype": "application/julia",
"name": "julia",
"version": "1.10.3"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Loading

0 comments on commit ca5ece1

Please sign in to comment.