Passend für Konstanten

Dec 10 2020

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]==22 die Rückprallgeschwindigkeit nach der Kollision und Tdie 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 NDSolvezufällige Werte verwendet und diese ersetzt$k$, $c$, und ersetzen Sie auch einige der Anfangsbedingungen wie x[0]==0.024965, x'[0]==-3und x[T]==2.

Können wir mit diesen die Konstanten anpassen?

Vielen Dank.

Antworten

2 AlexTrounev Dec 10 2020 at 23:30

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 xund 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]}

3 UlrichNeumann Dec 11 2020 at 15:32

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.

2 AntonAntonov Dec 10 2020 at 18:57
  • 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 RealAbsfürx[t]

  • Hinzufügen WhenEventfür den Umgang mit dem Hüpfen

  • Verwenden des ersten x-Werts der Messdaten, um eine Anfangsbedingung zu erstellen

  • Verwendung der parametrischen Formulierung für die mit kund 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 .

2 Cesareo Dec 12 2020 at 01:25

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]