둥지에서 표현식을 바꾸는 방법은 무엇입니까?
Dec 11 2020
반복 교체로 다음 함수를 계산해야합니다.
f[x0_, y0_]:= (s1 + s2)/t1 /. {s1 ->
NDSolveValue[{x''[t] + x[t] == 0., y''[t] + x[t]^2 y[t] == 0.,
x[0.] == x0, x'[0.] == 0., y[0.] == y0, y'[0.] == 0.},
y, {t, 0, t1}][t1], s2 -> NDSolveValue[{x''[t] + x[t] == 0, y''[t] + x[t]^2 y[t] == 0.,
x[0.] == x0, x'[0.] == 0., y[0.] == y0, y'[0.] == 1.},
y, {t, 0, t1}][t1]} /. {t1 -> Take[Reap[
NDSolve[{x''[t] + x[t] == 0., x[0.] == x0, x'[0.] == 0.,
WhenEvent[x'[t] > 0., {Sow[t], "StopIntegration"}]},
x, {t, 0., 100.},
MaxStepSize -> 0.001]], {2, -1}][[1]][[1]][[1]]}
하지만 "NDSolveValue : {t, 0., t1}의 끝점 t1은 실수가 아닙니다"라는 오류가 발생합니다.
핵심 표현은
NDSolveValue[{x''[t] + x[t] == 0, y''[t] + x[t]^2 y[t] == 0.,
x[0.] == 1., x'[0.] == 0., y[0.] == 1., y'[0.] == 0.},
y, {t, 0, Re[t1]}][Re[t1]] /. {t1 -> Take[Reap[
NDSolve[{x''[t] + x[t] == 0, x[0.] == 1., x'[0.] == 0.,
WhenEvent[x'[t] > 0., {Sow[t], "StopIntegration"}]},
x, {t, 0., 100.},
MaxStepSize -> 0.001]], {2, -1}][[1]][[1]][[1]]}
오류가 발생합니다. 이 문제를 어떻게 해결할 수 있습니까?
답변
3 MichaelE2 Dec 12 2020 at 08:26
괄호로 그룹화 하여 t1
대체에서 대체하십시오 s1,s2
.
ff[x0_, y0_] := s1 + s2 /. (
{s1 :>
NDSolveValue[{x''[t] + x[t] == 0., y''[t] + x[t]^2 y[t] == 0.,
x[0.] == x0, x'[0.] == 0., y[0.] == y0, y'[0.] == 0.},
y, {t, 0, t1}][t1],
s2 :> NDSolveValue[{x''[t] + x[t] == 0,
y''[t] + x[t]^2 y[t] == 0., x[0.] == x0, x'[0.] == 0.,
y[0.] == y0, y'[0.] == 1.}, y, {t, 0, t1}][t1]} /. {t1 ->
NDSolveValue[{x''[t] + x[t] == 0., x[0.] == x0, x'[0.] == 0.,
WhenEvent[x'[t] > 0., {"StopIntegration"}]},
Indexed[x["Domain"], {1, -1}], {t, 0., 100.},
MaxStepSize -> 0.001]}
);
ff[-1, -3]
(* -2.54137 *)
대안 :
ff[x0_, y0_] :=
Block[{t1 =
NDSolveValue[{x''[t] + x[t] == 0., x[0.] == x0, x'[0.] == 0.,
WhenEvent[x'[t] > 0., {"StopIntegration"}]},
Indexed[x["Domain"], {1, -1}], {t, 0., 100.},
MaxStepSize -> 0.001]},
s1 + s2 /.
{s1 :>
NDSolveValue[{x''[t] + x[t] == 0., y''[t] + x[t]^2 y[t] == 0.,
x[0.] == x0, x'[0.] == 0., y[0.] == y0, y'[0.] == 0.},
y, {t, 0, t1}][t1],
s2 :> NDSolveValue[{x''[t] + x[t] == 0,
y''[t] + x[t]^2 y[t] == 0., x[0.] == x0, x'[0.] == 0.,
y[0.] == y0, y'[0.] == 1.}, y, {t, 0, t1}][t1]}
];