Passend für Konstanten
Ich habe diese Differentialgleichung: $$m\ddot x=-kx^\frac{3}{2}-c\dot x-mg$$ wo ich hinpassen will $k$, $c$. (($g$ ist 9,81 und $m$ ist 0,3).
Dies ist ein Modell für die Kollision. Daher wissen wir in den Daten, die wir in unserem Experiment gesammelt haben, nur, dass x'[0]==-3
-3 die Aufprallgeschwindigkeit vor der Kollision ist und x'[T]==2
2 die Rückprallgeschwindigkeit nach der Kollision und T
die Zeit ist Kontakt, den wir nicht experimentell messen können, da er sehr kurz ist, aber wir wissen, dass er kürzer ist als$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}]
Hier sind die Daten.
Daten für x gegen 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}}
Beachten Sie, dass x in cm ist.
Die meisten Daten sind nutzlos, da es sich nur um Daten für das Fallenlassen und Abprallen handelt, nicht für die Kollision.
Im Code habe ich nur NDSolve
zufällige Werte verwendet und diese ersetzt$k$, $c$, und ersetzen Sie auch einige der Anfangsbedingungen wie x[0]==0.024965
, x'[0]==-3
und x[T]==2
.
Können wir mit diesen die Konstanten anpassen?
Vielen Dank.
Antworten
Tatsächlich können wir Daten verwenden, um Parameter wie folgt zu optimieren
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}};
Jetzt können wir die Interpolationsfunktion verwenden f = Interpolation[data, InterpolationOrder -> 4]
, um die Abhängigkeit der Beschleunigung von x
und x'
als herauszufinden
{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''"}]}

Es sieht aus wie eine typische elastisch-plastische Verformung, und daher ist das Hertz-Modell überhaupt nicht anwendbar. Jetzt können wir Kraft vor und nach der Kollision in einer Form vorschlagen$$F/m=-k_1 x+k_2 x^2 + k_3 \dot {x}+k_4 \dot {x}^2-g $$Schließlich können f[t]
wir mithilfe des Modells das Modell in mehreren Punkten optimieren, z.
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}]
Aus dieser Tabelle geht hervor, dass sich die Parameter des Modells nach der Kollision bei drastisch ändern 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]}

Ich weiß, dass ich etwas spät dran bin, aber ich möchte zeigen, wie das physikalische Problem auf der Grundlage der Messung tx
(in Einheiten s,m
!) Geradlinig gelöst werden kann.
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}}];
Die Messung zeigt, wo / wann die Kollision stattfindet
{tc, xc} = MinimalBy[tx, Last][[1]];
(*{2.63331, 0.024965}*)
Die Kollision (die nicht gemessen wird!) Wird durch den Restitutionskoeffizienten beschrieben x'[SuperPlus[tc]]==-e x'[ SuperMinus[tc]]
Modifiziertes System (beschreibt nur den Zustand vor / nach der Kollision) x''[t] == -F - km x[t] - cm*x'[t]
kann stückweise gelöst werden
(*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 }]
Systemidentifikation
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"]
zeigt an
Show[{ListPlot[tx, PlotStyle -> Red],Plot[mod[t], {t, 0, tx[[-1, 1]]}]}]

Sehr gute Übereinstimmung mit der Messung und rechtfertigt die Verwendung eines anderen Modells.
Diese Antwort berücksichtigt nicht alle Details zu Einheiten und modellierten Prozessen, die von OP angegeben wurden.
- Daher sollte es als "prinzipielle" Antwort angesehen werden.
Es scheint, dass:
Weitere Beschreibungen des Prozesses und des Modells sind erforderlich
Das Modell und seine Codierung müssen mehrfach geändert werden
Bitte beachten Sie die Kommentare zur Frage und diese Antwort.
Hier sind die gemessenen Daten:
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}};
Im Folgenden wird die ODE-Modellprogrammierung auf verschiedene Arten geändert:
Verwenden
RealAbs
fürx[t]
Hinzufügen
WhenEvent
für den Umgang mit dem HüpfenVerwenden des ersten x-Werts der Messdaten, um eine Anfangsbedingung zu erstellen
Verwendung der parametrischen Formulierung für die mit
k
und parametrisierte Lösungsfamiliec
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}]

Anmerkung:
-
[...] alles was wir wissen ist, dass x '[0] == - 3, wobei -3 die Aufprallgeschwindigkeit vor der Kollision ist, und x' [T] == 2 wobei 2 die Rückprallgeschwindigkeit nach der Kollision ist und T ist die Zeit des Kontakts, [...]
WhenEvent[x[t] == 0, x'[t] -> -2/3 x'[t]]
sagt, wenn das Objekt den Boden berührt, springt es (mit entgegengesetztem Vorzeichen) auf die Geschwindigkeit, die ist $2/3$-rds der Geschwindigkeit kurz vor dem Aufprall. (Das$2/3$ Koeffizient ergibt sich aus den in der Frage beschriebenen Geschwindigkeiten.)
Hier definieren wir eine Funktion ParDist
, die die Abweichung der Anpassung misst (die als Parameter parametrische Funktion, Parameterliste, Messdaten verwendet):
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]]]
];
Minimieren Sie die Messfunktion ParDist über eine geeignete Domäne für die Parameter:
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}}}*)
(Mehrere Experimente können / sollten mit unterschiedlichen Parameterbereichen durchgeführt werden.)
Bewerten Sie die parametrische Funktion mit den gefundenen Parametern über den Bereich der gemessenen Daten und des Diagramms:
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"}]

Ein ähnliches, aber komplizierteres Verfahren wird in dieser Antwort von "Modellkalibrierung mit Phasenraumdaten" beschrieben .
Dies ist eine Erweiterung für die hervorragende Antwort von @Ulrich Neumann
$$m\ddot x=-kx^{\alpha}-c\dot x-mg$$ Anstatt von
$$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]
