Skip to content

Commit ccf9e57

Browse files
authored
Merge pull request #70 from ShipMMG/dev
v0.0.8
2 parents f4923aa + 7c1c1d0 commit ccf9e57

File tree

7 files changed

+355
-14
lines changed

7 files changed

+355
-14
lines changed

Project.toml

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,29 @@
11
name = "ShipMMG"
22
uuid = "37f2b0bf-0c13-4883-8808-e75eb56597e7"
33
authors = ["Taiga MITSUYUKI <[email protected]>"]
4-
version = "0.0.7"
4+
version = "0.0.8"
55

66
[deps]
77
AdvancedPS = "576499cb-2369-40b2-a588-c64705576edc"
8+
CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b"
9+
DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"
810
Dierckx = "39dd38d3-220a-591b-8e3c-4c3a8c710a94"
911
DifferentialEquations = "0c46a032-eb83-5123-abaf-570d42b7fbaa"
1012
Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f"
1113
ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210"
1214
KernelDensity = "5ab0869b-81aa-558d-bb23-cbf5423bbe9b"
1315
Libtask = "6f1fad26-d15e-5dc8-ae53-837a1d7b8c9f"
16+
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
1417
ParameterizedFunctions = "65888b18-ceab-5e60-b2b9-181511a3b968"
1518
Parameters = "d96e819e-fc66-5662-9728-84c9c7592b0a"
19+
ProgressMeter = "92933f4c-e287-5a05-a399-4b506db050ca"
20+
Revise = "295af30f-e4ad-537b-8983-00126c2a3abe"
21+
StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91"
22+
StatsPlots = "f3b207a7-027a-5e70-b257-86293d7955fd"
1623
Turing = "fce5fe82-541a-59a6-adf8-730c64b5f9a0"
1724

1825
[compat]
19-
AdvancedPS = "^0.4"
26+
AdvancedPS = "^0.6"
2027
Dierckx = "0.5"
2128
DifferentialEquations = "^7"
2229
Distributions = "^0.25"
@@ -25,7 +32,7 @@ KernelDensity = "^0.6"
2532
Libtask = "^0.8"
2633
ParameterizedFunctions = "^5.12"
2734
Parameters = "0.12"
28-
Turing = "^0.24"
35+
Turing = "^0.36"
2936
julia = "^1.6"
3037

3138
[extras]

src/ShipMMG.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ using Parameters
77
using Distributions
88
using Turing
99
using ForwardDiff
10+
using LinearAlgebra
1011

1112
include("data.jl")
1213
export calc_position,

src/kt.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ function kt_simulate(
9090
spl_δ = Spline1D(time_list, δ_list)
9191

9292
X0 = [u0; v0; r0; x0; y0; Ψ0; δ_list[1]]
93-
p = [K, T, spl_δ]
93+
p = (K, T, spl_δ)
9494
prob = ODEProblem(kt_model!, X0, (time_list[1], time_list[end]), p)
9595
sol = solve(prob, algorithm, reltol=reltol, abstol=abstol)
9696
sol_timelist = sol(time_list)
@@ -333,7 +333,7 @@ function create_model_for_mcmc_sample_kt(
333333
u0 = [r_obs[1]; δ_obs[1]]
334334
K_start = 0.10
335335
T_start = 60.0
336-
p = [K_start, T_start]
336+
p = (K_start, T_start)
337337
prob1 = ODEProblem(KT!, u0, (time_obs[1], time_obs[end]), p)
338338

339339
# create probabilistic model
@@ -342,7 +342,7 @@ function create_model_for_mcmc_sample_kt(
342342
K ~ K_prior_dist
343343
T ~ T_prior_dist
344344

345-
p = [K, T]
345+
p = (K, T)
346346
prob = remake(prob1, p=p)
347347
sol = solve(prob, Tsit5())
348348
predicted = sol(time_obs)

src/mmg.jl

Lines changed: 256 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1103,7 +1103,7 @@ function create_model_for_mcmc_sample_mmg(
11031103
N_vrr_dash_start = 0.055
11041104
N_rrr_dash_start = -0.013
11051105

1106-
p = [
1106+
p = (
11071107
R_0_dash_start,
11081108
X_vv_dash_start,
11091109
X_vr_dash_start,
@@ -1121,7 +1121,7 @@ function create_model_for_mcmc_sample_mmg(
11211121
N_vvr_dash_start,
11221122
N_vrr_dash_start,
11231123
N_rrr_dash_start,
1124-
]
1124+
)
11251125

11261126
u0 = 2.29 * 0.512
11271127
v0 = 0.0
@@ -1152,7 +1152,7 @@ function create_model_for_mcmc_sample_mmg(
11521152
N_vrr_dash ~ N_vrr_dash_prior_dist
11531153
N_rrr_dash ~ N_rrr_dash_prior_dist
11541154

1155-
p = [
1155+
p = (
11561156
R_0_dash,
11571157
X_vv_dash,
11581158
X_vr_dash,
@@ -1170,7 +1170,259 @@ function create_model_for_mcmc_sample_mmg(
11701170
N_vvr_dash,
11711171
N_vrr_dash,
11721172
N_rrr_dash,
1173-
]
1173+
)
1174+
prob = remake(prob1, p=p)
1175+
sol = solve(prob, solver, abstol=abstol, reltol=reltol)
1176+
predicted = sol(time_obs)
1177+
for i in eachindex(predicted)
1178+
obs[1][i] ~ Normal(predicted[i][1], σ_u) # u
1179+
obs[2][i] ~ Normal(predicted[i][2], σ_v) # v
1180+
obs[3][i] ~ Normal(predicted[i][3], σ_r) # r
1181+
end
1182+
end
1183+
1184+
return fitMMG(time_obs, [u_obs, v_obs, r_obs], prob1)
1185+
end
1186+
1187+
function create_model_for_mcmc_sample_mmg(
1188+
data::ShipData,
1189+
basic_params::Mmg3DofBasicParams,
1190+
k_0,
1191+
k_1,
1192+
k_2,
1193+
multivariate_prior_dist;
1194+
ρ=1025.0,
1195+
σ_u_prior_dist=Uniform(0.00, 0.20),
1196+
σ_v_prior_dist=Uniform(0.00, 0.20),
1197+
σ_r_prior_dist=Uniform(0.00, 0.20),
1198+
solver=Tsit5(),
1199+
abstol=1e-6,
1200+
reltol=1e-3
1201+
)
1202+
time_obs = data.time
1203+
u_obs = data.u
1204+
v_obs = data.v
1205+
r_obs = data.r
1206+
δ_obs = data.δ
1207+
n_p_obs = data.n_p
1208+
1209+
@unpack L_pp,
1210+
B,
1211+
d,
1212+
x_G,
1213+
D_p,
1214+
m,
1215+
I_zG,
1216+
A_R,
1217+
η,
1218+
m_x,
1219+
m_y,
1220+
J_z,
1221+
f_α,
1222+
ϵ,
1223+
t_R,
1224+
x_R,
1225+
a_H,
1226+
x_H,
1227+
γ_R_minus,
1228+
γ_R_plus,
1229+
l_R,
1230+
κ,
1231+
t_P,
1232+
w_P0,
1233+
x_P = basic_params
1234+
1235+
# create sytem model
1236+
spl_δ = Spline1D(time_obs, δ_obs)
1237+
spl_n_p = Spline1D(time_obs, n_p_obs)
1238+
function MMG!(dX, X, p, t)
1239+
u, v, r, δ, n_p = X
1240+
R_0_dash,
1241+
X_vv_dash,
1242+
X_vr_dash,
1243+
X_rr_dash,
1244+
X_vvvv_dash,
1245+
Y_v_dash,
1246+
Y_r_dash,
1247+
Y_vvv_dash,
1248+
Y_vvr_dash,
1249+
Y_vrr_dash,
1250+
Y_rrr_dash,
1251+
N_v_dash,
1252+
N_r_dash,
1253+
N_vvv_dash,
1254+
N_vvr_dash,
1255+
N_vrr_dash,
1256+
N_rrr_dash = p
1257+
1258+
U = sqrt(u^2 + (v - r * x_G)^2)
1259+
1260+
β = 0.0
1261+
if U == 0.0
1262+
β = 0.0
1263+
else
1264+
β = asin(-(v - r * x_G) / U)
1265+
end
1266+
1267+
v_dash = 0.0
1268+
if U == 0.0
1269+
v_dash = 0.0
1270+
else
1271+
v_dash = v / U
1272+
end
1273+
1274+
r_dash = 0.0
1275+
if U == 0.0
1276+
r_dash = 0.0
1277+
else
1278+
r_dash = r * L_pp / U
1279+
end
1280+
1281+
w_P = w_P0 * exp(-4.0 *- x_P * r_dash)^2)
1282+
1283+
J = 0.0
1284+
if n_p == 0.0
1285+
J = 0.0
1286+
else
1287+
J = (1 - w_P) * u / (n_p * D_p)
1288+
end
1289+
K_T = k_0 + k_1 * J + k_2 * J^2
1290+
β_R = β - l_R * r_dash
1291+
γ_R = γ_R_minus
1292+
1293+
if β_R < 0.0
1294+
γ_R = γ_R_minus
1295+
else
1296+
γ_R = γ_R_plus
1297+
end
1298+
1299+
v_R = U * γ_R * β_R
1300+
1301+
u_R = 0.0
1302+
if J == 0.0
1303+
u_R = sqrt** ϵ * 8.0 * k_0 * n_p^2 * D_p^4 / pi)^2)
1304+
else
1305+
u_R =
1306+
u *
1307+
(1.0 - w_P) *
1308+
ϵ *
1309+
sqrt* (1.0 + κ * (sqrt(1.0 + 8.0 * K_T / (pi * J^2)) - 1))^2 + (1 - η))
1310+
end
1311+
1312+
U_R = sqrt(u_R^2 + v_R^2)
1313+
α_R = δ - atan(v_R, u_R)
1314+
F_N = 0.5 * A_R * ρ * f_α * (U_R^2) * sin(α_R)
1315+
1316+
X_H = (
1317+
0.5 *
1318+
ρ *
1319+
L_pp *
1320+
d *
1321+
(U^2) *
1322+
(
1323+
-R_0_dash +
1324+
X_vv_dash * (v_dash^2) +
1325+
X_vr_dash * v_dash * r_dash +
1326+
X_rr_dash * (r_dash^2) +
1327+
X_vvvv_dash * (v_dash^4)
1328+
)
1329+
)
1330+
X_R = -(1.0 - t_R) * F_N * sin(δ)
1331+
X_P = (1.0 - t_P) * ρ * K_T * n_p^2 * D_p^4
1332+
Y_H = (
1333+
0.5 *
1334+
ρ *
1335+
L_pp *
1336+
d *
1337+
(U^2) *
1338+
(
1339+
Y_v_dash * v_dash +
1340+
Y_r_dash * r_dash +
1341+
Y_vvv_dash * (v_dash^3) +
1342+
Y_vvr_dash * (v_dash^2) * r_dash +
1343+
Y_vrr_dash * v_dash * (r_dash^2) +
1344+
Y_rrr_dash * (r_dash^3)
1345+
)
1346+
)
1347+
Y_R = -(1 + a_H) * F_N * cos(δ)
1348+
N_H = (
1349+
0.5 *
1350+
ρ *
1351+
(L_pp^2) *
1352+
d *
1353+
(U^2) *
1354+
(
1355+
N_v_dash * v_dash +
1356+
N_r_dash * r_dash +
1357+
N_vvv_dash * (v_dash^3) +
1358+
N_vvr_dash * (v_dash^2) * r_dash +
1359+
N_vrr_dash * v_dash * (r_dash^2) +
1360+
N_rrr_dash * (r_dash^3)
1361+
)
1362+
)
1363+
N_R = -(x_R + a_H * x_H) * F_N * cos(δ)
1364+
dX[1] = du = ((X_H + X_R + X_P) + (m + m_y) * v * r + x_G * m * (r^2)) / (m + m_x)
1365+
dX[2] =
1366+
dv =
1367+
(
1368+
(x_G^2) * (m^2) * u * r - (N_H + N_R) * x_G * m +
1369+
((Y_H + Y_R) - (m + m_x) * u * r) * (I_zG + J_z + (x_G^2) * m)
1370+
) / ((I_zG + J_z + (x_G^2) * m) * (m + m_y) - (x_G^2) * (m^2))
1371+
dX[3] = dr = (N_H + N_R - x_G * m * (dv + u * r)) / (I_zG + J_z + (x_G^2) * m)
1372+
dX[4] == derivative(spl_δ, t)
1373+
dX[5] = dn_p = derivative(spl_n_p, t)
1374+
end
1375+
1376+
R_0_dash_start = 0.022
1377+
X_vv_dash_start = -0.040
1378+
X_vr_dash_start = 0.002
1379+
X_rr_dash_start = 0.011
1380+
X_vvvv_dash_start = 0.771
1381+
Y_v_dash_start = -0.315
1382+
Y_r_dash_start = 0.083
1383+
Y_vvv_dash_start = -1.607
1384+
Y_vvr_dash_start = 0.379
1385+
Y_vrr_dash_start = -0.391
1386+
Y_rrr_dash_start = 0.008
1387+
N_v_dash_start = -0.137
1388+
N_r_dash_start = -0.049
1389+
N_vvv_dash_start = -0.030
1390+
N_vvr_dash_start = -0.294
1391+
N_vrr_dash_start = 0.055
1392+
N_rrr_dash_start = -0.013
1393+
1394+
p = (
1395+
R_0_dash_start,
1396+
X_vv_dash_start,
1397+
X_vr_dash_start,
1398+
X_rr_dash_start,
1399+
X_vvvv_dash_start,
1400+
Y_v_dash_start,
1401+
Y_r_dash_start,
1402+
Y_vvv_dash_start,
1403+
Y_vvr_dash_start,
1404+
Y_vrr_dash_start,
1405+
Y_rrr_dash_start,
1406+
N_v_dash_start,
1407+
N_r_dash_start,
1408+
N_vvv_dash_start,
1409+
N_vvr_dash_start,
1410+
N_vrr_dash_start,
1411+
N_rrr_dash_start,
1412+
)
1413+
1414+
u0 = 2.29 * 0.512
1415+
v0 = 0.0
1416+
r0 = 0.0
1417+
X0 = [u_obs[1]; v_obs[1]; r_obs[1]; δ_obs[1]; n_p_obs[1]]
1418+
prob1 = ODEProblem(MMG!, X0, (time_obs[1], time_obs[end]), p)
1419+
1420+
# create probabilistic model
1421+
@model function fitMMG(time_obs, obs, prob1)
1422+
σ_u ~ σ_u_prior_dist
1423+
σ_v ~ σ_v_prior_dist
1424+
σ_r ~ σ_r_prior_dist
1425+
p ~ multivariate_prior_dist;
11741426
prob = remake(prob1, p=p)
11751427
sol = solve(prob, solver, abstol=abstol, reltol=reltol)
11761428
predicted = sol(time_obs)

src/mmg_wind.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1142,7 +1142,7 @@ function create_model_for_mcmc_sample_mmg(
11421142
N_vrr_dash_start = 0.055
11431143
N_rrr_dash_start = -0.013
11441144

1145-
p = [
1145+
p = (
11461146
R_0_dash_start,
11471147
X_vv_dash_start,
11481148
X_vr_dash_start,
@@ -1160,7 +1160,7 @@ function create_model_for_mcmc_sample_mmg(
11601160
N_vvr_dash_start,
11611161
N_vrr_dash_start,
11621162
N_rrr_dash_start,
1163-
]
1163+
)
11641164

11651165
u0 = 2.29 * 0.512
11661166
v0 = 0.0
@@ -1191,7 +1191,7 @@ function create_model_for_mcmc_sample_mmg(
11911191
N_vrr_dash ~ N_vrr_dash_prior_dist
11921192
N_rrr_dash ~ N_rrr_dash_prior_dist
11931193

1194-
p = [
1194+
p = (
11951195
R_0_dash,
11961196
X_vv_dash,
11971197
X_vr_dash,
@@ -1209,7 +1209,7 @@ function create_model_for_mcmc_sample_mmg(
12091209
N_vvr_dash,
12101210
N_vrr_dash,
12111211
N_rrr_dash,
1212-
]
1212+
)
12131213
prob = remake(prob1, p=p)
12141214
sol = solve(prob, solver, abstol=abstol, reltol=reltol)
12151215
predicted = sol(time_obs)

0 commit comments

Comments
 (0)