상수 피팅
이 미분 방정식이 있습니다. $$m\ddot x=-kx^\frac{3}{2}-c\dot x-mg$$ 내가 적합하고 싶은 곳 $k$, $c$. ($g$ 9.81이고 $m$ 0.3).
이것은 충돌에 대한 모델이므로 실험에서 수집 한 데이터에서 우리가 아는 것은 x'[0]==-3
, 여기서 -3은 충돌 전의 충돌 속도이고 x'[T]==2
, 2는 충돌 후의 반발 속도 T
이며 시간입니다. 매우 짧기 때문에 실험적으로 측정 할 수는 없지만$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}]
다음은 데이터입니다.
t에 대한 x 데이터 :
{{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}}
x는 cm 단위입니다.
대부분의 데이터는 실제로 충돌이 아니라 떨어 뜨리고 튀는 부분에 대한 데이터이기 때문에 쓸모가 없습니다.
코드에서 나는 단지 NDSolve
무작위 값으로 대체하고$k$, $c$, 또한 같은 초기 조건의 일부를 대체 할 x[0]==0.024965
, x'[0]==-3
하고 x[T]==2
.
이것으로 상수를 맞출 수 있습니까?
감사합니다.
답변
실제로 데이터를 사용하여 다음과 같이 매개 변수를 최적화 할 수 있습니다.
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}};
이제 우리는 보간 기능을 사용할 수 있습니다 f = Interpolation[data, InterpolationOrder -> 4]
에 가속의 의존도를 찾아 x
와 x'
같이
{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''"}]}

일반적인 탄성-소성 변형처럼 보이므로 Hertz 모델은 전혀 적용 할 수 없습니다. 이제 우리는 충돌 전후의 힘을 형태로 제안 할 수 있습니다.$$F/m=-k_1 x+k_2 x^2 + k_3 \dot {x}+k_4 \dot {x}^2-g $$마지막으로 사용하여 f[t]
여러 지점에서 모델을 최적화 할 수 있습니다.
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}]
이 표에서 우리는 모델의 매개 변수가 충돌 후 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]}

내가 조금 늦었다는 것을 알고 있지만 측정을 기반으로 물리적 문제를 전면적으로 해결하는 방법을 보여주고 싶습니다 tx
(단위로 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}}];
측정은 충돌이 발생한 위치 /시기를 보여줍니다.
{tc, xc} = MinimalBy[tx, Last][[1]];
(*{2.63331, 0.024965}*)
충돌 (측정되지 않음!)은 복원 계수로 설명됩니다. x'[SuperPlus[tc]]==-e x'[ SuperMinus[tc]]
수정 된 시스템 (충돌 전 / 후 상태 만 설명) x''[t] == -F - km x[t] - cm*x'[t]
은 부분적으로 해결 될 수 있습니다.
(*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 }]
시스템 식별
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"]
쇼
Show[{ListPlot[tx, PlotStyle -> Red],Plot[mod[t], {t, 0, tx[[-1, 1]]}]}]

측정과 매우 잘 일치하고 다른 모델의 사용을 정당화합니다.
이 답변은 OP가 제공하는 단위 및 모델링 된 프로세스에 대한 모든 세부 사항을 고려하지 않습니다.
- 그러므로 그것은 "원칙적으로"대답으로 보아야합니다 .
다음과 같이 보입니다.
프로세스 및 모델에 대한 추가 설명이 필요합니다.
모델과 코딩을 여러 번 수정해야합니다.
질문에 대한 의견과이 답변을 참조하십시오.
측정 된 데이터는 다음과 같습니다.
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}};
아래에서 ODE 모델 프로그래밍은 여러 가지 방식으로 변경됩니다.
사용
RealAbs
을 위해x[t]
WhenEvent
바운싱 처리를 위해 추가측정 데이터의 첫 번째 x 값을 사용하여 초기 조건 만들기
k
및로 매개 변수화 된 솔루션 제품군에 대한 매개 변수 공식 사용c
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}]

말:
-
[...] 우리가 아는 것은 x '[0] ==-3입니다. 여기서 -3은 충돌 전의 충돌 속도이고 x'[T] == 2입니다. 여기서 2는 충돌 후의 반발 속도이고 T는 접촉 시간, [...]
WhenEvent[x[t] == 0, x'[t] -> -2/3 x'[t]]
물체가지면에 닿으면 바운스 속도 (부호 반대) $2/3$충격 직전 속도의 -rds. (그만큼$2/3$ 계수는 질문에 설명 된 속도에서 비롯됩니다.)
여기서 우리 ParDist
는 적합의 편차를 측정 하는 함수 를 정의합니다 (인수 파라 메트릭 함수, 매개 변수 목록, 측정 된 데이터로 사용) :
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]]]
];
매개 변수에 대한 적절한 도메인에서 측정 함수 ParDist를 최소화합니다.
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}}}*)
(다른 매개 변수 범위로 여러 실험을 수행 할 수 있습니다.)
측정 된 데이터 및 플롯의 영역에서 발견 된 매개 변수로 매개 변수 함수를 평가합니다.
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"}]

유사하지만 더 복잡한 절차는 "위상 공간 데이터를 사용한 모델 교정" 답변 에 설명되어 있습니다.
이것은 @Ulrich Neumann의 탁월한 답변에 대한 확장입니다.
$$m\ddot x=-kx^{\alpha}-c\dot x-mg$$ 대신에
$$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]
