문제

나는 ndsolve 두 개의 별도 플롯 명령으로. 문제를 설명하기 위해 간단한 미분 방정식과 하나의 플롯 명령 만 사용하겠습니다. 내가 다음과 같이 쓰면 :

{Plot[x[t], {t, 0, 10}], x[4]} 
/. NDSolve[{x'[s] == - x[s], x[0] == 1}, x, {s, 0, 10}]

방정식을 해결하고 문제가없는 X [4]를 계산하지만 플롯은 비어 있으며 이유는 모릅니다.

내 실제 문제에서 내 방정식은 여러 기능을위한 매우 복잡한 시스템이며 대신 x [4 해결 된 함수의 파라 메트릭 플롯을 그립니다. 나는 궁극적 으로이 모든 것을 a에 포함 시키려고합니다 조종하다 진술을 원하지 않습니다 ndsolve 명령문이 두 번 이상 나타나고 (너무 오래 걸리면) 매개 변수가 많기 때문에 미리 계산할 수는 없습니다.


편집 : 나는 내 질문을 명확히하고 확장하고 싶습니다 : 실제로하고 싶은 것은 내 음모를 포함시키는 것입니다. 조종하다 다음과 같은 방법으로 진술 :

Manipulate[{Plot[x[t], {t, 0, 10}], x[4]} 
/. NDSolve[{x'[s] == - a*x[s], x[0] == 1}, x, {s, 0, 10}]
,{{a,1},0,5}]

단지 조종하다 명령문은 매개 변수에 값을 제공합니다 , 나는에 대한 답을 계산할 수 없다 ndsolve 미리. 또한 실제 방정식 시스템이 매우 복잡하고 비선형이므로 기호 기능을 사용할 수 없습니다. dsolve.

전에 명확하지 않은 경우 죄송합니다.

도움이 되었습니까?

해결책

당신의 문제는 음모가 플롯을 더 편리하게 만들기 위해 재미있는 일을한다는 것입니다. 그리고 그것이하는 일 중 하나는 수치 적으로 평가할 수없는 줄거리가 아니라는 것입니다. 그래서 당신이 게시 한 표현에서

Plot[x[t], {t, 0, 10}]

계속해서 평가합니다 ~ 전에 NDSOLVE의 솔루션으로 규칙 대체를 수행하여 빈 플롯의 그래픽 객체를 생성합니다. 그 그래픽 객체에는 X에 대한 참조가 포함되어 있지 않으므로 대체 할 것이 없습니다.

플로팅 전에 치환이 수행되도록하고 싶습니다. 또한 여러 장소에서 치환을 수행 할 수 있는지 확인하려면 솔루션을 변수에 저장하려고합니다.

sol = NDSolve[{x'[s] == - x[s], x[0] == 1}, x, {s, 0, 10}];
{Plot[Evaluate[x[t] /. sol], {t, 0, 10}], x[4] /. sol} 

플롯에서 평가는 수학적으로 각 플롯 지점에 대해 한 번 대신 한 번만 대체를 수행하는지 확인합니다. 이와 같은 간단한 규칙 대체에는 중요하지 않지만 더 복잡한 것을 계획하고 싶을 때 사용하는 것은 좋은 습관입니다.


이 작업을 조작하기 위해 간단한 방법은 Mathematica의 범위 구조물 중 하나 인 []와 함께 사용하는 것입니다. 그것은 당신이 그것을 돌연변이 할 수있는 가변으로 사용하지 않고 무언가를 대체하려는 곳에서 사용하는 것입니다.

예를 들어,

Manipulate[
  With[{sol = NDSolve[{x'[s] == - x[s], x[0] == 1}, x, {s, 0, 10}]},
    {Plot[x[t] /. sol // Evaluate, {t, 0, 10}, PlotRange -> {0, 1}], 
     x[4] /. sol}],
  {{a, 1}, {0, 5}}]

플롯 레인지 옵션을 사용하여 y 축을 고정 상태로 유지하십시오. 그렇지 않으면 상황이 바뀌면서 추악한 방식으로 상황이 뛰어납니다. 조작으로 더 복잡한 작업을 수행하면 업데이트 속도를 제어하기위한 여러 가지 옵션이 있으며, 이는 ODE가 복잡하다면 해결하는 데 시간이 걸리면 중요 할 수 있습니다.

다른 팁

한편, 나는 이것을하는 또 다른 방법을 찾았다. 덜 우아하지만 하나의 대체 만 사용하므로 여기에도 게시 할 것이라고 생각했습니다.

아이디어는 사용하는 것입니다 잡고 있다구성 그래서 그것은 평가되지 않고 규칙 대체를 수행 한 다음 릴리스, 바로 직전 조종하다.

Manipulate[ReleaseHold[
  Hold[ {Plot[x[t], {t, 0, 10}, PlotRange -> {0, 1}], x[4]} ]
 /.NDSolve[{x'[s] == -a x[s], x[0] == 1}, x, {s, 0, 10}]
], {{a, 1}, 0, 5}]
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top