Utilizando la solución de una ecuación diferencial en dos parcela separada comandos en Mathematica

StackOverflow https://stackoverflow.com/questions/1327789

Pregunta

He encontrado un problema al intentar utilizar la respuesta de un NDSolve en parcela independiente de dos órdenes. Para ilustrar el problema, voy a utilizar una simple ecuación diferencial y único comando plot. Si escribo algo como esto:

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

Se resuelve la ecuación y calcula x [4] sin ningún problema, pero la trama se vuelve vacía, y no tengo ni idea de por qué.

En mi problema real, mi ecuación es un sistema bastante complicado para varias funciones, y en lugar de x [4] dibujo un diagrama paramétrico de las funciones resueltos. Yo en última instancia, la intención de incluir todo esto en un Manipular declaración por lo que no desea que el NDSolve comunicado que aparezca más de una vez (se tarda demasiado tiempo) y no puedo calcular por adelantado (ya que tiene una gran cantidad de parámetros).


Edit: Me gustaría aclarar y ampliar mi pregunta: ¿Lo que realmente quiero hacer es incluir el trazado de mi declaración en un Manipular Declaración de la siguiente manera:

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

Puesto que sólo la Manipular declaración da valor al parámetro a , no puedo calcular la respuesta a la NDSolve de antemano. También, ya que mi sistema de ecuaciones real es muy complicado y no lineal, no puedo usar la función simbólica DSolve .

Lo siento si no estaba claro antes.

¿Fue útil?

Solución

Su problema es que la parcela [] hace algunas cosas divertidas que hacen que el trazado más conveniente, y una de las cosas que hace no está trazar cosas que no puede evaluar numéricamente. Así que en la expresión informados,

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

simplemente sigue adelante y evalúa antes haciendo la sustitución regla con la solución de NDSolve, la producción de un objeto gráfico de una parcela vacía. Ese objeto gráfico no contiene ninguna referencia a X, por lo que no hay nada que sustituir.

Usted quiere asegurarse de que la sustitución se realiza antes de que el trazado. Si también quiere asegurarse de que la sustitución se puede hacer en varios lugares, que desea almacenar la solución en una variable.

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

El Evaluar [] En la parcela se asegura de que Mathematica sólo lo hace la sustitución una vez, en lugar de una vez por cada punto de la trama. No es importante para una sustitución simple regla de este tipo, pero es un buen hábito para usarlo en caso de que desee representar algo más complicado.


Con el fin de hacer este trabajo en una de manipular, la forma más sencilla es utilizar con [], que es una de las construcciones de la definición del alcance de Mathematica; que es la de utilizar cuando lo que desea es sustituir algo en sin necesidad de utilizar como variable que puede mutar.

Por ejemplo,

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

Utilice la opción PlotRange para mantener el eje fijo; de lo contrario las cosas van a saltar de una manera fea como el valor de un cambio. Cuando haces las cosas más complejas con Manipular, hay una serie de opciones para controlar la velocidad de cambios, que puede ser importante si su ODE es bastante complicado que se necesita un tiempo para resolver.

Otros consejos

Mientras tanto, he encontrado otra manera de hacer esto. Es menos elegante, pero sólo utiliza una sustitución así que he pensado que voy a publicar aquí también.

La idea es utilizar Espera en el Terreno para que no se evalúan, hacer la sustitución regla y luego ReleaseHold , justo antes de la Manipular .

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}]
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top