@@ -21,6 +21,7 @@ realFMUPath = joinpath(dirname(@__FILE__), "../model/SpringFrictionPendulum1D.fm
21
21
t_start = 0.0
22
22
t_step = 0.01
23
23
t_stop = 5.0
24
+ tData = t_start: t_step: t_stop
24
25
25
26
myFMU = fmiLoad (realFMUPath)
26
27
fmiInstantiate! (myFMU; loggingOn= false )
@@ -31,7 +32,7 @@ fmiExitInitializationMode(myFMU)
31
32
32
33
x0 = fmi2GetContinuousStates (myFMU)
33
34
34
- realSimData = fmi2SimulateCS (myFMU, t_step, t_start, t_stop, [" mass.s" , " mass.v" , " mass.f" , " mass.a" ], false )
35
+ realSimData = fmi2Simulate (myFMU, t_start, t_stop; recordValues = [" mass.s" , " mass.v" , " mass.f" , " mass.a" ], saveat = tData, setup = false )
35
36
fmiUnload (myFMU)
36
37
37
38
fmiPlot (realSimData)
@@ -40,7 +41,7 @@ displacement = 0.1
40
41
myFMU = fmiLoad (modelFMUPath)
41
42
42
43
fmiInstantiate! (myFMU; loggingOn= false )
43
- fmuSimData = fmiSimulate (myFMU, t_step, t_start, t_stop, [" mass.s" , " mass.v" , " mass.a" ])
44
+ fmuSimData = fmiSimulate (myFMU, t_start, t_stop; recordValues = [" mass.s" , " mass.v" , " mass.a" ], saveat = tData )
44
45
fmiReset (myFMU)
45
46
fmiSetupExperiment (myFMU, 0.0 )
46
47
@@ -50,13 +51,12 @@ fmi2SetReal(myFMU, "mass_s0", 0.5 + displacement) # das sollte Wurst sein oder?
50
51
fmiEnterInitializationMode (myFMU)
51
52
fmiExitInitializationMode (myFMU)
52
53
# x0 = fmi2GetContinuousStates(myFMU)
53
- tData = t_start: t_step: t_stop
54
54
posData = fmi2SimulationResultGetValues (realSimData, " mass.s" )
55
55
velData = fmi2SimulationResultGetValues (realSimData, " mass.v" )
56
56
57
57
# loss function for training
58
58
function losssum ()
59
- solution = problem (t_start, x0)
59
+ solution = problem (x0)
60
60
61
61
posNet = collect (data[2 ] for data in solution. u)
62
62
velNet = collect (data[3 ] for data in solution. u)
@@ -77,7 +77,7 @@ function callb()
77
77
78
78
if iterCB % 10 == 1
79
79
avg_ls = losssum ()
80
- display ( " Loss: $(round (avg_ls, digits= 5 )) Avg displacement in data: $(round (sqrt (avg_ls / 2.0 ), digits= 5 )) Weight/Scale: $(p_net[1 ][1 ]) Bias/Offset: $(p_net[1 ][5 ]) " )
80
+ @info " Loss: $(round (avg_ls, digits= 5 )) Avg displacement in data: $(round (sqrt (avg_ls / 2.0 ), digits= 5 )) Weight/Scale: $(p_net[1 ][1 ]) Bias/Offset: $(p_net[1 ][5 ]) "
81
81
end
82
82
83
83
end
@@ -91,20 +91,20 @@ net = Chain(Dense(numStates, numStates, identity; initW = (out, in) -> [[1.0, 0.
91
91
Dense (16 , 16 , tanh),
92
92
Dense (16 , numStates))
93
93
94
- problem = ME_NeuralFMU (myFMU, net, (t_start, t_stop), Tsit5 (), tData)
95
- solutionBefore = problem (t_start, x0)
94
+ problem = ME_NeuralFMU (myFMU, net, (t_start, t_stop), Tsit5 (); saveat = tData)
95
+ solutionBefore = problem (x0)
96
96
fmiPlot (problem)
97
97
98
98
# train it ...
99
99
p_net = Flux. params (problem)
100
100
optim = ADAM ()
101
101
for i in 1 : 3
102
- display ( " epoch: $i /3" )
102
+ @info " epoch: $i /3"
103
103
Flux. train! (losssum, p_net, Iterators. repeated ((), 1000 ), optim; cb= callb)
104
104
end
105
105
106
106
# ##### plot results s
107
- solutionAfter = problem (t_start, x0)
107
+ solutionAfter = problem (x0)
108
108
fig = Plots. plot (xlabel= " t [s]" , ylabel= " mass position [m]" , linewidth= 2 ,
109
109
xtickfontsize= 12 , ytickfontsize= 12 ,
110
110
xguidefontsize= 12 , yguidefontsize= 12 ,
@@ -115,7 +115,7 @@ Plots.plot!(fig, tData, collect(data[2] for data in solutionAfter.u), label="Neu
115
115
Plots. savefig (fig, " exampleResult_s.pdf" )
116
116
117
117
# ##### plot results v
118
- solutionAfter = problem (t_start, x0)
118
+ solutionAfter = problem (x0)
119
119
fig = Plots. plot (xlabel= " t [s]" , ylabel= " mass velocity [m/s]" , linewidth= 2 ,
120
120
xtickfontsize= 12 , ytickfontsize= 12 ,
121
121
xguidefontsize= 12 , yguidefontsize= 12 ,
@@ -125,35 +125,6 @@ Plots.plot!(fig, tData, velData, label="reference", linewidth=2)
125
125
Plots. plot! (fig, tData, collect (data[3 ] for data in solutionAfter. u), label= " NeuralFMU" , linewidth= 2 )
126
126
Plots. savefig (fig, " exampleResult_v.pdf" )
127
127
128
- # write training parameters *p_net* back to *net* with data offset *c*
129
- function transferParams! (net, p_net, c= 0 )
130
- numLayers = length (net. layers)
131
- for l in 1 : numLayers
132
- ni = size (net. layers[l]. weight,2 )
133
- no = size (net. layers[l]. weight,1 )
134
-
135
- w = zeros (no, ni)
136
- b = zeros (no)
137
-
138
- for i in 1 : ni
139
- for o in 1 : no
140
- w[o,i] = p_net[1 ][c + (i- 1 )* no + (o- 1 )]
141
- end
142
- end
143
-
144
- c += ni* no
145
-
146
- for o in 1 : no
147
- b[o] = p_net[1 ][c + (o- 1 )]
148
- end
149
-
150
- c += no
151
-
152
- copy! (net. layers[l]. weight, w)
153
- copy! (net. layers[l]. bias, b)
154
- end
155
- end
156
-
157
128
# ##### friction model extraction
158
129
layers = problem. neuralODE. model. layers[4 : 6 ]
159
130
net_bottom = Chain (layers... )
0 commit comments