Ajustement pour les constantes
J'ai cette équation différentielle: $$m\ddot x=-kx^\frac{3}{2}-c\dot x-mg$$ où je veux m'adapter $k$, $c$. ($g$ vaut 9,81 et $m$ est 0,3).
Il s'agit d'un modèle de collision, donc dans les données que nous avons collectées dans notre expérience, tout ce que nous savons est que x'[0]==-3
, où -3 est la vitesse d'impact avant la collision, et x'[T]==2
où 2 est la vitesse de rebond après la collision et T
le temps de contact, que nous ne pouvons pas mesurer expérimentalement car il est très court, mais nous savons qu'il est plus court que$10^{-3}s$.
m = 1;
k = 1;
c = 1;
g = 9.81;
sol = NDSolve[
{m x''[t] == -k x[t]^(3/2) - c x'[t] - m g, x'[0] == -3, x[0] == 0.024965,
x'[0.00001] == 2},
x[t], {t, 0, 1}]
Voici les données.
Données pour x contre t:
{{0.,23.6724},{0.0333333,23.4316},{0.0666667,23.2125},
{0.1,22.9737},{0.133333,22.7191},{0.166667,22.4796},
{0.2,22.2635},{0.233333,22.0175},{0.266667,21.7774},
{0.3,21.5224},{0.333333,21.3139},{0.366667,21.064},
{0.4,20.8183},{0.433333,20.5699},{0.466667,20.3129},
{0.5,20.0644},{0.533333,19.8333},{0.566656,19.5862},
{0.599989,19.3391},{0.633322,19.094},{0.666656,18.8495},
{0.699989,18.5973},{0.733322,18.3451},{0.766656,18.09},
{0.799989,17.8299},{0.833322,17.581},{0.866656,17.3204},
{0.899989,17.0659},{0.933322,16.817},{0.966656,16.5627},
{0.999989,16.3046},{1.03332,16.0535},{1.06666,15.7956},
{1.09999,15.5383},{1.13332,15.2806},{1.16666,15.0236},
{1.19999,14.7635},{1.23332,14.5015},{1.26666,14.2514},
{1.29999,13.9673},{1.33332,13.6998},{1.36666,13.4402},
{1.39999,13.1574},{1.43332,12.8848},{1.46666,12.6188},
{1.49999,12.3376},{1.53332,12.0596},{1.56666,11.7867},
{1.59999,11.5302},{1.63332,11.2418},{1.66664,10.9721},
{1.69998,10.7005},{1.73331,10.399},{1.76664,10.1111},
{1.79998,9.83385},{1.83331,9.56173},{1.86664,9.25114},
{1.89998,8.98928},{1.93331,8.70041},{1.96664,8.41822},
{1.99998,8.13319},{2.03331,7.84509},{2.06664,7.53343},
{2.09998,7.25237},{2.13331,6.95413},{2.16664,6.63875},
{2.19998,6.34642},{2.23331,6.06828},{2.26664,5.77579},
{2.29998,5.4747},{2.33331,5.15976},{2.36664,4.84916},
{2.39998,4.5256},{2.43331,4.22336},{2.46664,3.9177},
{2.49998,3.58284},{2.53331,3.2908},{2.56664,2.97411},
{2.59998,2.6861},{2.63331,2.4965},{2.66664,2.73492},
{2.69998,2.99366},{2.73331,3.29602},{2.76663,3.58096},
{2.79997,3.83507},{2.8333,4.1179},{2.86663,4.39381},
{2.89997,4.66047},{2.9333,4.95059},{2.96663,5.23038},
{2.99997,5.48554},{3.0333,5.77507},{3.06663,6.03556},
{3.09997,6.30288},{3.1333,6.56806},{3.16663,6.82612},
{3.19997,7.11681},{3.2333,7.37396},{3.26663,7.63213},
{3.29997,7.89755},{3.3333,8.15167},{3.36663,8.4428},
{3.39997,8.6969},{3.4333,8.95516},{3.46663,9.22325},
{3.49997,9.47407},{3.5333,9.73972},{3.56663,9.98549},
{3.59997,10.2457},{3.6333,10.4917},{3.66663,10.7494},
{3.69997,10.9985},{3.7333,11.2493},{3.76663,11.5069},
{3.79997,11.7599},{3.8333,12.0148},{3.86663,12.2645},
{3.89996,12.5198},{3.93329,12.7714},{3.96662,13.0222},
{3.99996,13.2753},{4.03329,13.4973},{4.06662,13.7457},
{4.09996,13.9856},{4.13329,14.2364},{4.16662,14.4828},
{4.19996,14.7348},{4.23329,14.9753},{4.26662,15.211},
{4.29996,15.4466},{4.33329,15.6922},{4.36662,15.9198},
{4.39996,16.1627},{4.43329,16.4001},{4.46662,16.6353},
{4.49996,16.8629},{4.53329,17.1011},{4.56662,17.3418},
{4.59996,17.5674},{4.63329,17.81},{4.66662,18.0313},
{4.69996,18.2533},{4.73329,18.4823},{4.76662,18.7227},
{4.79996,18.9488},{4.83329,19.1835},{4.86662,19.4019},
{4.89996,19.6282},{4.93329,19.86},{4.96662,20.084},
{4.99994,20.3083},{5.03328,20.5353},{5.06661,20.7602},
{5.09994,20.9745},{5.13328,21.1844},{5.16661,21.4296},
{5.19994,21.6461},{5.23328,21.8579},{5.26661,22.0885},
{5.29994,22.3081},{5.33328,22.5211}}
Notez que x est en cm.
La plupart des données sont inutiles car ce ne sont que des données pour la partie qui tombe et rebondit, pas réellement pour la collision.
Dans le code, je n'ai fait NDSolve
que substituer des valeurs aléatoires$k$, $c$, et remplacez également certaines des conditions initiales telles que x[0]==0.024965
, x'[0]==-3
et x[T]==2
.
Avec ceux-ci, est-il possible pour nous d'ajuster les constantes?
Merci.
Réponses
En fait, nous pouvons utiliser les données pour optimiser les paramètres comme suit
data = {{0., 23.6724}, {0.0333333, 23.4316}, {0.0666667, 23.2125}, {0.1, 22.9737}, {0.133333, 22.7191}, {0.166667, 22.4796}, {0.2, 22.2635}, {0.233333, 22.0175}, {0.266667, 21.7774}, {0.3, 21.5224}, {0.333333, 21.3139}, {0.366667, 21.064}, {0.4, 20.8183}, {0.433333, 20.5699}, {0.466667, 20.3129}, {0.5, 20.0644}, {0.533333, 19.8333}, {0.566656, 19.5862}, {0.599989, 19.3391}, {0.633322, 19.094}, {0.666656, 18.8495}, {0.699989, 18.5973}, {0.733322, 18.3451}, {0.766656, 18.09}, {0.799989, 17.8299}, {0.833322, 17.581}, {0.866656, 17.3204}, {0.899989, 17.0659}, {0.933322, 16.817}, {0.966656, 16.5627}, {0.999989, 16.3046}, {1.03332, 16.0535}, {1.06666, 15.7956}, {1.09999, 15.5383}, {1.13332, 15.2806}, {1.16666, 15.0236}, {1.19999, 14.7635}, {1.23332, 14.5015}, {1.26666, 14.2514}, {1.29999, 13.9673}, {1.33332, 13.6998}, {1.36666, 13.4402}, {1.39999, 13.1574}, {1.43332, 12.8848}, {1.46666, 12.6188}, {1.49999, 12.3376}, {1.53332, 12.0596}, {1.56666, 11.7867}, {1.59999, 11.5302}, {1.63332, 11.2418}, {1.66664, 10.9721}, {1.69998, 10.7005}, {1.73331, 10.399}, {1.76664, 10.1111}, {1.79998, 9.83385}, {1.83331, 9.56173}, {1.86664, 9.25114}, {1.89998, 8.98928}, {1.93331, 8.70041}, {1.96664, 8.41822}, {1.99998, 8.13319}, {2.03331, 7.84509}, {2.06664, 7.53343}, {2.09998, 7.25237}, {2.13331, 6.95413}, {2.16664, 6.63875}, {2.19998, 6.34642}, {2.23331, 6.06828}, {2.26664, 5.77579}, {2.29998, 5.4747}, {2.33331, 5.15976}, {2.36664, 4.84916}, {2.39998, 4.5256}, {2.43331, 4.22336}, {2.46664, 3.9177}, {2.49998, 3.58284}, {2.53331, 3.2908}, {2.56664, 2.97411}, {2.59998, 2.6861}, {2.63331, 2.4965}, {2.66664, 2.73492}, {2.69998, 2.99366}, {2.73331, 3.29602}, {2.76663, 3.58096}, {2.79997, 3.83507}, {2.8333, 4.1179}, {2.86663, 4.39381}, {2.89997, 4.66047}, {2.9333, 4.95059}, {2.96663, 5.23038}, {2.99997, 5.48554}, {3.0333, 5.77507}, {3.06663, 6.03556}, {3.09997, 6.30288}, {3.1333, 6.56806}, {3.16663, 6.82612}, {3.19997, 7.11681}, {3.2333, 7.37396}, {3.26663, 7.63213}, {3.29997, 7.89755}, {3.3333, 8.15167}, {3.36663, 8.4428}, {3.39997, 8.6969}, {3.4333, 8.95516}, {3.46663, 9.22325}, {3.49997, 9.47407}, {3.5333, 9.73972}, {3.56663, 9.98549}, {3.59997, 10.2457}, {3.6333, 10.4917}, {3.66663, 10.7494}, {3.69997, 10.9985}, {3.7333, 11.2493}, {3.76663, 11.5069}, {3.79997, 11.7599}, {3.8333, 12.0148}, {3.86663, 12.2645}, {3.89996, 12.5198}, {3.93329, 12.7714}, {3.96662, 13.0222}, {3.99996, 13.2753}, {4.03329, 13.4973}, {4.06662, 13.7457}, {4.09996, 13.9856}, {4.13329, 14.2364}, {4.16662, 14.4828}, {4.19996, 14.7348}, {4.23329, 14.9753}, {4.26662, 15.211}, {4.29996, 15.4466}, {4.33329, 15.6922}, {4.36662, 15.9198}, {4.39996, 16.1627}, {4.43329, 16.4001}, {4.46662, 16.6353}, {4.49996, 16.8629}, {4.53329, 17.1011}, {4.56662, 17.3418}, {4.59996, 17.5674}, {4.63329, 17.81}, {4.66662, 18.0313}, {4.69996, 18.2533}, {4.73329, 18.4823}, {4.76662, 18.7227}, {4.79996, 18.9488}, {4.83329, 19.1835}, {4.86662, 19.4019}, {4.89996, 19.6282}, {4.93329, 19.86}, {4.96662, 20.084}, {4.99994, 20.3083}, {5.03328, 20.5353}, {5.06661, 20.7602}, {5.09994, 20.9745}, {5.13328, 21.1844}, {5.16661, 21.4296}, {5.19994, 21.6461}, {5.23328, 21.8579}, {5.26661, 22.0885}, {5.29994, 22.3081}, {5.33328, 22.5211}};
Maintenant, nous pouvons utiliser la fonction d'interpolation f = Interpolation[data, InterpolationOrder -> 4]
pour découvrir la dépendance de l'accélération sur x
et x'
comme
{ParametricPlot[{f[t], f''[t]}, {t, 2.55, 2.7}, PlotRange -> All,
AspectRatio -> 1/2, AxesLabel -> {"x", "x''"}],
ParametricPlot[{f'[t], f''[t]}, {t, 2.3, 2.8}, PlotRange -> All,
AspectRatio -> 1/2, AxesLabel -> {"x'", "x''"}]}

Cela ressemble à une déformation élastique-plastique typique, et par conséquent, le modèle de Hertz n'est pas du tout applicable. Maintenant, nous pouvons proposer la force avant et après la collision sous une forme$$F/m=-k_1 x+k_2 x^2 + k_3 \dot {x}+k_4 \dot {x}^2-g $$Enfin, en utilisant f[t]
nous pouvons optimiser le modèle en plusieurs points, par exemple,
g=981.; param = Table[{t,
NMinimize[{(f''[t] + g - k1 f[t] + k2 f[t]^2 + k3 f'[t] +
k4 f'[t]^2)^2, k1 > 0 && k2 > 0 && k3 > 0 && k4 > 0}, {k1, k2,
k3, k4}]}, {t, 2.51, 2.7, .01}]
À partir de ce tableau, nous voyons que les paramètres du modèle changent radicalement après une collision à t=2.63
{ListLinePlot[
Table[{param[[i, 1]], k1 /. param[[i, 2, 2]]}, {i, Length[param]}],
AxesLabel -> {"t", "k1"}],
ListLinePlot[
Table[{param[[i, 1]], k2 /. param[[i, 2, 2]]}, {i, Length[param]}],
AxesLabel -> {"t", "k2"}],
ListLinePlot[
Table[{param[[i, 1]], k3 /. param[[i, 2, 2]]}, {i, Length[param]}],
AxesLabel -> {"t", "k3"}],
ListLinePlot[
Table[{param[[i, 1]], k4 /. param[[i, 2, 2]]}, {i, Length[param]}],
AxesLabel -> {"t", "k4"}, PlotRange -> All]}

Je sais que je suis un peu en retard, mais je veux montrer comment résoudre le problème physique directement, en fonction de la mesure tx
(en unités s,m
!)
tx = Map[{#[[1]], #[[2]]/100} &,
{{0., 23.6724}, {0.0333333,23.4316}, {0.0666667, 23.2125}, {0.1, 22.9737}, {0.133333, 22.7191}, {0.166667, 22.4796}, {0.2, 22.2635}, {0.233333,22.0175}, {0.266667, 21.7774}, {0.3, 21.5224}, {0.333333,21.3139}, {0.366667, 21.064}, {0.4, 20.8183}, {0.433333,20.5699}, {0.466667, 20.3129}, {0.5, 20.0644}, {0.533333,19.8333}, {0.566656, 19.5862}, {0.599989, 19.3391}, {0.633322,19.094}, {0.666656, 18.8495}, {0.699989, 18.5973}, {0.733322,18.3451}, {0.766656, 18.09}, {0.799989, 17.8299}, {0.833322,17.581}, {0.866656, 17.3204}, {0.899989, 17.0659}, {0.933322,16.817}, {0.966656, 16.5627}, {0.999989, 16.3046}, {1.03332,16.0535}, {1.06666, 15.7956}, {1.09999, 15.5383}, {1.13332,15.2806}, {1.16666, 15.0236}, {1.19999, 14.7635}, {1.23332,14.5015}, {1.26666, 14.2514}, {1.29999, 13.9673}, {1.33332,13.6998}, {1.36666, 13.4402}, {1.39999, 13.1574}, {1.43332,12.8848}, {1.46666, 12.6188}, {1.49999, 12.3376}, {1.53332,12.0596}, {1.56666, 11.7867}, {1.59999, 11.5302}, {1.63332,11.2418}, {1.66664, 10.9721}, {1.69998, 10.7005}, {1.73331,10.399}, {1.76664, 10.1111}, {1.79998, 9.83385}, {1.83331,9.56173}, {1.86664, 9.25114}, {1.89998, 8.98928}, {1.93331,8.70041}, {1.96664, 8.41822}, {1.99998, 8.13319}, {2.03331,7.84509}, {2.06664, 7.53343}, {2.09998, 7.25237}, {2.13331,6.95413}, {2.16664, 6.63875}, {2.19998, 6.34642}, {2.23331,6.06828}, {2.26664, 5.77579}, {2.29998, 5.4747}, {2.33331, 5.15976}, {2.36664, 4.84916}, {2.39998, 4.5256}, {2.43331,4.22336}, {2.46664, 3.9177}, {2.49998, 3.58284}, {2.53331,3.2908}, {2.56664, 2.97411}, {2.59998, 2.6861}, {2.63331, 2.4965}, {2.66664, 2.73492}, {2.69998, 2.99366}, {2.73331, 3.29602}, {2.76663, 3.58096}, {2.79997, 3.83507}, {2.8333,4.1179}, {2.86663, 4.39381}, {2.89997, 4.66047}, {2.9333, 4.95059}, {2.96663, 5.23038}, {2.99997, 5.48554}, {3.0333, 5.77507}, {3.06663, 6.03556}, {3.09997, 6.30288}, {3.1333,6.56806}, {3.16663, 6.82612}, {3.19997, 7.11681}, {3.2333,7.37396}, {3.26663, 7.63213}, {3.29997, 7.89755}, {3.3333, 8.15167}, {3.36663, 8.4428}, {3.39997, 8.6969}, {3.4333,8.95516}, {3.46663, 9.22325}, {3.49997, 9.47407}, {3.5333,9.73972}, {3.56663, 9.98549}, {3.59997, 10.2457}, {3.6333,10.4917}, {3.66663, 10.7494}, {3.69997, 10.9985}, {3.7333,11.2493}, {3.76663, 11.5069}, {3.79997, 11.7599}, {3.8333,12.0148}, {3.86663, 12.2645}, {3.89996, 12.5198}, {3.93329,12.7714}, {3.96662, 13.0222}, {3.99996, 13.2753}, {4.03329,13.4973}, {4.06662, 13.7457}, {4.09996, 13.9856}, {4.13329,14.2364}, {4.16662, 14.4828}, {4.19996, 14.7348}, {4.23329,14.9753}, {4.26662, 15.211}, {4.29996, 15.4466}, {4.33329,15.6922}, {4.36662, 15.9198}, {4.39996, 16.1627}, {4.43329,16.4001}, {4.46662, 16.6353}, {4.49996, 16.8629}, {4.53329,17.1011}, {4.56662, 17.3418}, {4.59996, 17.5674}, {4.63329,17.81}, {4.66662, 18.0313}, {4.69996, 18.2533}, {4.73329,18.4823}, {4.76662, 18.7227}, {4.79996, 18.9488}, {4.83329,19.1835}, {4.86662, 19.4019}, {4.89996, 19.6282}, {4.93329,19.86}, {4.96662, 20.084}, {4.99994, 20.3083}, {5.03328,20.5353}, {5.06661, 20.7602}, {5.09994, 20.9745}, {5.13328, 21.1844}, {5.16661, 21.4296}, {5.19994, 21.6461}, {5.23328,21.8579}, {5.26661, 22.0885}, {5.29994, 22.3081}, {5.33328,22.5211}}];
La mesure montre, où / quand la collision a lieu
{tc, xc} = MinimalBy[tx, Last][[1]];
(*{2.63331, 0.024965}*)
La collision (qui n'est pas mesurée!) Est décrite par le coefficient de restitution x'[SuperPlus[tc]]==-e x'[ SuperMinus[tc]]
Le système modifié (décrit uniquement l'état avant / après la collision) x''[t] == -F - km x[t] - cm*x'[t]
peut être résolu par morceaux
(*before collision*)
X0 = ParametricNDSolveValue[{ x''[t] == -F - km x[t] - cm*x'[t] ,
x'[tc] == v0 , x[tc] == xc}, x, {t, tx[[1, 1]], tc}, { v0, F, km, cm , e }]
(*after collision*)
X1 = ParametricNDSolveValue[{ x''[t] == -F - km x[t] - cm*x'[t] ,
x'[tc] == -v0 e, x[tc] == xc}, x, {t, tc, tx[[-1, 1]]}, { v0, F, km, cm, e }]
identification du système
mod=NonlinearModelFit[tx, {Which[t <= tc, X0[v0, F, km, cm , e ][t],t > tc, X1[v0, F, km, cm , e ][t]], 0 < e < 1, F > 0, km > 0,cm > 0},
{v0, F, km, cm , e}, t, Method -> "NMinimize"]
spectacles
Show[{ListPlot[tx, PlotStyle -> Red],Plot[mod[t], {t, 0, tx[[-1, 1]]}]}]

très bon accord avec la mesure et justfie l'utilisation d'un modèle différent.
Cette réponse ne prend pas en compte tous les détails sur les unités et le processus modélisé donnés par OP.
- Par conséquent, il devrait être considéré comme une réponse «en principe».
Il paraît que:
Des descriptions supplémentaires du processus et du modèle sont nécessaires
De multiples modifications du modèle et de son codage doivent être apportées
Veuillez consulter les commentaires sur la question et cette réponse.
Voici les données mesurées:
lsData = {{0., 23.6724}, {0.0333333, 23.4316}, {0.0666667, 23.2125}, {0.1, 22.9737}, {0.133333, 22.7191}, {0.166667, 22.4796}, {0.2, 22.2635}, {0.233333, 22.0175}, {0.266667, 21.7774}, {0.3, 21.5224}, {0.333333, 21.3139}, {0.366667, 21.064}, {0.4, 20.8183}, {0.433333, 20.5699}, {0.466667, 20.3129}, {0.5, 20.0644}, {0.533333, 19.8333}, {0.566656, 19.5862}, {0.599989, 19.3391}, {0.633322, 19.094}, {0.666656, 18.8495}, {0.699989, 18.5973}, {0.733322, 18.3451}, {0.766656, 18.09}, {0.799989, 17.8299}, {0.833322, 17.581}, {0.866656, 17.3204}, {0.899989, 17.0659}, {0.933322, 16.817}, {0.966656, 16.5627}, {0.999989, 16.3046}, {1.03332, 16.0535}, {1.06666, 15.7956}, {1.09999, 15.5383}, {1.13332, 15.2806}, {1.16666, 15.0236}, {1.19999, 14.7635}, {1.23332, 14.5015}, {1.26666, 14.2514}, {1.29999, 13.9673}, {1.33332, 13.6998}, {1.36666, 13.4402}, {1.39999, 13.1574}, {1.43332, 12.8848}, {1.46666, 12.6188}, {1.49999, 12.3376}, {1.53332, 12.0596}, {1.56666, 11.7867}, {1.59999, 11.5302}, {1.63332, 11.2418}, {1.66664, 10.9721}, {1.69998, 10.7005}, {1.73331, 10.399}, {1.76664, 10.1111}, {1.79998, 9.83385}, {1.83331, 9.56173}, {1.86664, 9.25114}, {1.89998, 8.98928}, {1.93331, 8.70041}, {1.96664, 8.41822}, {1.99998, 8.13319}, {2.03331, 7.84509}, {2.06664, 7.53343}, {2.09998, 7.25237}, {2.13331, 6.95413}, {2.16664, 6.63875}, {2.19998, 6.34642}, {2.23331, 6.06828}, {2.26664, 5.77579}, {2.29998, 5.4747}, {2.33331, 5.15976}, {2.36664, 4.84916}, {2.39998, 4.5256}, {2.43331, 4.22336}, {2.46664, 3.9177}, {2.49998, 3.58284}, {2.53331, 3.2908}, {2.56664, 2.97411}, {2.59998, 2.6861}, {2.63331, 2.4965}, {2.66664, 2.73492}, {2.69998, 2.99366}, {2.73331, 3.29602}, {2.76663, 3.58096}, {2.79997, 3.83507}, {2.8333, 4.1179}, {2.86663, 4.39381}, {2.89997, 4.66047}, {2.9333, 4.95059}, {2.96663, 5.23038}, {2.99997, 5.48554}, {3.0333, 5.77507}, {3.06663, 6.03556}, {3.09997, 6.30288}, {3.1333, 6.56806}, {3.16663, 6.82612}, {3.19997, 7.11681}, {3.2333, 7.37396}, {3.26663, 7.63213}, {3.29997, 7.89755}, {3.3333, 8.15167}, {3.36663, 8.4428}, {3.39997, 8.6969}, {3.4333, 8.95516}, {3.46663, 9.22325}, {3.49997, 9.47407}, {3.5333, 9.73972}, {3.56663, 9.98549}, {3.59997, 10.2457}, {3.6333, 10.4917}, {3.66663, 10.7494}, {3.69997, 10.9985}, {3.7333, 11.2493}, {3.76663, 11.5069}, {3.79997, 11.7599}, {3.8333, 12.0148}, {3.86663, 12.2645}, {3.89996, 12.5198}, {3.93329, 12.7714}, {3.96662, 13.0222}, {3.99996, 13.2753}, {4.03329, 13.4973}, {4.06662, 13.7457}, {4.09996, 13.9856}, {4.13329, 14.2364}, {4.16662, 14.4828}, {4.19996, 14.7348}, {4.23329, 14.9753}, {4.26662, 15.211}, {4.29996, 15.4466}, {4.33329, 15.6922}, {4.36662, 15.9198}, {4.39996, 16.1627}, {4.43329, 16.4001}, {4.46662, 16.6353}, {4.49996, 16.8629}, {4.53329, 17.1011}, {4.56662, 17.3418}, {4.59996, 17.5674}, {4.63329, 17.81}, {4.66662, 18.0313}, {4.69996, 18.2533}, {4.73329, 18.4823}, {4.76662, 18.7227}, {4.79996, 18.9488}, {4.83329, 19.1835}, {4.86662, 19.4019}, {4.89996, 19.6282}, {4.93329, 19.86}, {4.96662, 20.084}, {4.99994, 20.3083}, {5.03328, 20.5353}, {5.06661, 20.7602}, {5.09994, 20.9745}, {5.13328, 21.1844}, {5.16661, 21.4296}, {5.19994, 21.6461}, {5.23328, 21.8579}, {5.26661, 22.0885}, {5.29994, 22.3081}, {5.33328, 22.5211}};
Ci-dessous, la programmation du modèle ODE est modifiée de plusieurs manières:
Utilisation
RealAbs
pourx[t]
Ajout
WhenEvent
pour gérer le rebondUtilisation de la première valeur x des données de mesure pour créer une condition initiale
Utilisation de la formulation paramétrique pour la famille de solutions paramétrées avec
k
etc
ClearAll[g, m, k, c];
m = 0.3;
g = 9.81;
sol =
ParametricNDSolve[{
m*x''[t] == -k*RealAbs[x[t]]^(3/2) - c*x'[t] - g*m,
WhenEvent[x[t] == 0, x'[t] -> -2/3 x'[t]],
x'[0] == -3,
x[0] == lsData[[1, 2]]
}, x, {t, Min[lsData[[All, 1]]], Max[lsData[[All, 1]]]}, {k, c}]

Remarque:
-
[...] tout ce que nous savons, c'est que x '[0] == - 3, où -3 est la vitesse d'impact avant la collision, et x' [T] == 2 où 2 est la vitesse de rebond après la collision et T est le moment du contact, [...]
WhenEvent[x[t] == 0, x'[t] -> -2/3 x'[t]]
dit que lorsque l'objet touche le sol, il rebondit (avec un signe opposé) à une vitesse qui est $2/3$-rds de la vitesse juste avant l'impact. (Le$2/3$ le coefficient provient des vitesses décrites dans la question.)
Ici, nous définissons une fonction ParDist
qui mesure l'écart de l'ajustement (qui prend comme arguments la fonction paramétrique, la liste des paramètres, les données mesurées):
Clear[ParDist]
ParDist[x_ParametricFunction, {k_?NumberQ, c_?NumberQ}, tsPath : {{_?NumberQ, _?NumberQ} ..}] :=
Block[{points, tMin, tMax},
points = Map[{#, x[k, c][#]} &, tsPath[[All, 1]]];
Norm[(tsPath[[All, 2]] - Re[points[[All, 2]]])/tsPath[[All, 2]]]
];
Réduisez la fonction de mesure ParDist sur un domaine approprié pour les paramètres:
AbsoluteTiming[
nsol = NMinimize[{ParDist[x /. sol, {k, c}, lsData], -1 <= k <= 0, -2 <= c <= 0}, {k, c}, Method -> "NelderMead", PrecisionGoal -> 3, AccuracyGoal -> 3, MaxIterations -> 100]
]
(* Messages... *)
(*{0.319493, {2.57776, {k -> -0.0223514, c -> -0.0730673}}}*)
(Plusieurs expériences peuvent / doivent être effectuées avec différentes plages de paramètres.)
Évaluez la fonction paramétrique avec les paramètres trouvés sur le domaine des données mesurées et tracez:
Block[{k, c},
{k, c} = {k, c} /. nsol[[2]];
fitData = Table[{t, Re[x[k, c][t] /. sol]}, {t, lsData[[All, 1]]}]
];
ListPlot[{lsData, fitData}, PlotRange -> All, PlotTheme -> "Detailed",PlotLegends -> {"Measured", "Fitted"}]

Une procédure similaire, mais plus compliquée, est décrite dans cette réponse de "Calibration du modèle avec des données d'espace de phase" .
Ceci est une extension de l'excellente réponse de @Ulrich Neumann considérant
$$m\ddot x=-kx^{\alpha}-c\dot x-mg$$ à la place de
$$m\ddot x=-kx-c\dot x-mg$$
tx = Map[{#[[1]], #[[2]]/100} &, data]
{tc, xc} = MinimalBy[tx, Last][[1]];
X0 = ParametricNDSolveValue[{x''[t] == -F - km Sign[x[t]] Abs[x[t]]^alpha - cm*x'[t], x'[tc] == v0, x[tc] == xc}, x, {t, tx[[1, 1]], tc}, {v0, F, km, cm, alpha, e}]
X1 = ParametricNDSolveValue[{x''[t] == -F - km Sign[x[t]] Abs[x[t]]^alpha - cm*x'[t], x'[tc] == -v0 e, x[tc] == xc}, x, {t, tc, tx[[-1, 1]]}, {v0, F, km, cm, alpha, e}]
mod = NonlinearModelFit[tx, {Which[t <= tc, X0[v0, F, km, cm, alpha, e][t], t > tc, X1[v0, F, km, cm, alpha, e][t]], 0 < e < 1, F > 0, km > 0, cm > 0, 0.5 < alpha < 3}, {v0, F, km, cm, alpha, e}, t, Method -> "NMinimize"]
Show[{ListPlot[tx, PlotStyle -> Red], Plot[mod[t], {t, 0, tx[[-1, 1]]}]}]
Normal[mod]
