Necesita ayuda para resolver la ecuación diferencial y graficar la velocidad como una función de forzar la magnitud del término

Necesitaba ayuda para trazar un diagrama de término de velocidad frente a forzar para un oscilador caótico en mathica.

Básicamente, tengo que resolver la siguiente ecuación diferencial

x''[t] + b x'[t] - x[t] + x[t]^3 - f Cos[w t] == 0, x'[0] == 0, 
 x[0] == 0

y graficar la velocidad de mi solución para tiempos en el intervalo [0,1000] en incrementos de 2 * Pi para diferentes valores de f.

Es decir, para cada f en el intervalo [0,2] (en incrementos de .05), tendré aproximadamente 150 puntos de velocidad y debo trazar todos estos puntos en un gráfico.

Pensé en usar un bucle do y se me ocurrió algo como

Remove["Global`*"]

b = .1;
w = 1;
Period = 1;
tstep = 2 Pi/Period;

Do[{Do[{data = 
     Table[Flatten[
       Evaluate[{f, 
         x'[t] /. 
          NDSolve[{x''[t] + b x'[t] - x[t] + x[t]^3 - f Cos[w t] == 0,
             x'[0] == 0, x[0] == 0}, x[t], {t, 0, 1000}, 
           MaxSteps -> 59999]}]], {t, 0, 1000, tstep}]}, {t, 0, 1000, 
    1}]}, {f, 0, 2, .1}]

pero no tuve suerte.

¿Cómo puedo hacer esto?

preguntado el 16 de mayo de 11 a las 17:05

Permítame darle la bienvenida a StackOverflow y recordarle tres cosas que solemos hacer aquí: 1) A medida que reciba ayuda, trate de brindarla también respondiendo preguntas en su área de especialización 2) Read the FAQs 3) Cuando vea buenas preguntas y respuestas, vote por ellas using the gray triangles, ya que la credibilidad del sistema se basa en la reputación que los usuarios obtienen al compartir sus conocimientos. También recuerde aceptar la respuesta que mejor resuelva su problema, si lo hubiera, by pressing the checkmark sign -

Tu regla de reemplazo, x'[t] /. NDSolve[...], no funcionará porque NDSolve devoluciones x[t] -> ..., pero x'[t] internamente tiene la forma Derivative[1][x][t] que es muy diferente. (Puede comprobarlo usted mismo utilizando FullForm.) Las reglas de reemplazo reemplazan exactamente la forma que usted le indica, y puede requerir mucho esfuerzo hacer que hagan algún tipo de transformación más allá de la básica. Este califica como más allá de lo básico. En esos casos, FullForm y MatchQ son indispensables para determinar qué funcionará y qué no. -

Se supone que no debes eliminar tu pregunta una vez que hayas recibido una respuesta. He revertido tu última edición en la que hiciste esto. -

FP, ¿su actualización es solo para aclarar la pregunta o está esperando una respuesta revisada? -

1 Respuestas

¿Hace esto lo que quieres?

b = .1;
w = 1;

sol := {f, 
  NDSolve[{x''[t] + b x'[t] - x[t] + x[t]^3 - f Cos[w t] == 0, 
     x'[0] == 0, x[0] == 0}, x[t], {t, 0, 1000}, MaxSteps -> 59999][[1, 1, 2]]}

interpsols = Table[sol, {f, 0, 2, 0.1}];

ListPlot[Table[interpsols, {t, 0, 1000, 2 Pi}]]

La explicación

Primero, déjame enfocarme en sol. Esto está cerca de su propio código (con un cambio) pero refactorizado para mayor claridad, en lugar de enterrarse dentro de los bucles.

  • sol := es equivalente a SetDelayed[sol, ...
  • Esto tiene la definición no evaluada que se da en el lado derecho
  • La NDSolve Por lo tanto, la operación no se realiza hasta sol se usa en alguna parte

El cambio que hice fue extraer esta parte del resultado de NDSolve:

InterpolatingFunction[{{0.,1000.}},<>][t]

Hago esto con Part: NDSolve[...][[1, 1, 2]]

También se puede hacer con x[t] /. First @ NDSolve[...]

Esta porción extraída se empareja con el valor actual de f en una lista: {f, NDSolve[ ... } para que luego se puedan trazar.

Ahora:

interpsols = Table[sol, {f, 0, 2, 0.1}];

construye una tabla del valor cambiante de sol ya que cambia globalmente el valor de f. Aquí es donde se realiza NDSolve.

El resultado es una serie de soluciones para cada valor de f ene sta forma:

{{0.,InterpolatingFunction[{{0.,1000.}},<>][t]},
 {0.1,InterpolatingFunction[{{0.,1000.}},<>][t]},
 {0.2,InterpolatingFunction[{{0.,1000.}},<>][t]},
 {0.3,InterpolatingFunction[{{0.,1000.}},<>][t]},
 {0.4,InterpolatingFunction[{{0.,1000.}},<>][t]}
 ...

Por último:

ListPlot[Table[interpsols, {t, 0, 1000, 2 Pi}]]

crea una tabla mediante la evaluación de la serie completa de resultados creados anteriormente para los valores de cambio global de t, ListPlotsentar.

Hay algunas cosas más que me gustaría decir, pero se me acaba el tiempo. Haré una nueva edición en unas horas.

contestado el 16 de mayo de 11 a las 22:05

Sí, creo que esto soluciona mi problema. ¡Muchas gracias! ¿Como funciona? - Programador frustrado

Para honrar su apodo, el Sr. Mago debería responder - "Es mágico" - - Dr. belisario

Jaja, sí. Además, ¿por qué los puntos tienen diferentes colores? ¿Es porque corresponden al mismo valor t pero diferentes valores f? - Programador frustrado

Dos liendres: f debe incrementarse en 0.05 y el OP pidió la velocidad. La segunda liendre se puede arreglar fácilmente anteponiendo D[#, t]&@ en frente de NDSolve. De lo contrario, debería funcionar. - rcollyer

oh, creo que veo, su iteración de D [#, t] & @ le dice a mathica que tome la derivada de la solución NDSolve para cada valor de t, lo que me da la velocidad en cada punto. Además, si hago un diagrama de línea de lista, puedo ver cómo cambia mi sistema con el tiempo para cada valor de f, ya que cada línea diferente corresponde a un conjunto de puntos con los mismos valores de f pero diferentes valores de tiempo, ¿verdad? - Programador frustrado

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.