Utilizzando la soluzione di un'equazione differenziale in due terreno separato comandi in Mathematica

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

Domanda

ho incontrato un problema durante il tentativo di utilizzare la risposta da un NDSolve in due grafico distinto comandi. Per illustrare il problema, userò una semplice equazione differenziale e un solo comando plot. Se scrivo qualcosa di simile:

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

Si risolve l'equazione e calcola x [4] senza alcun problema, ma la trama risulta vuota, e ho idea perché.

Nel mio vero problema, la mia equazione è un sistema piuttosto complicato per diverse funzioni, e al posto di x [4] disegno un grafico parametrico delle funzioni risolti. Alla fine ho intenzione di includere tutto questo in un Manipola dichiarazione in modo da non voglio il NDSolve dichiarazione di apparire più di una volta (richiede troppo tempo) e non posso solo calcolare in anticipo (dal momento che ha un sacco di parametri).


Edit: Vorrei chiarire e ampliare la mia domanda: Che cosa Io in realtà voglio fare è quello di includere la mia dichiarazione tramando in un Manipola dichiarazione nel seguente modo:

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

Poiché solo la Manipola dichiarazione dà valore al parametro a , non posso calcolare la risposta al NDSolve in anticipo. Inoltre, poiché il mio sistema equazione reale è molto complicata e non lineare, non posso usare la funzione simbolica DSolve .

Ci dispiace se non era chiaro prima.

È stato utile?

Soluzione

Il tuo problema è che Plot [] fa alcune cose divertenti per rendere la stampa più conveniente, e una delle cose che fa è semplicemente non tracciare le cose che non può valutare numericamente. Così l'espressione che hai postato,

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

va solo avanti e valuta prima fare la sostituzione regola con la soluzione da NDSolve, producendo un oggetto grafico di un complotto vuoto. Questo oggetto grafico contiene alcun riferimento alla x, quindi non c'è nulla da sostituire.

Si vuole fare in modo la sostituzione viene effettuata prima che il tracciato. Se anche voi volete fare in modo la sostituzione può essere effettuata in più luoghi, si desidera conservare la soluzione in una variabile.

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

Il Valutare [] nella trama si assicura che Mathematica fa solo la sostituzione una volta, invece di una volta per ogni punto della trama. Non è importante per una semplice sostituzione regola come questa, ma è una buona abitudine di usarlo in caso vi capitasse di voler tracciare qualcosa di più complicato.


Al fine di rendere questo lavoro in una manipolare, il modo più semplice è quello di utilizzare con [], che è uno dei costrutti di scoping di Mathematica; è quello di utilizzare in cui si desidera solo per sostituire qualcosa senza usarlo come variabile si può mutare.

Ad esempio,

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

Utilizzare l'opzione PlotRange per mantenere l'asse y fisso; altrimenti le cose saranno saltare in modo brutto come il valore di un cambiamento. Quando si fanno le cose più complesse con Manipolare, ci sono una serie di opzioni per il controllo della velocità di aggiornamento, che può essere importante se l'ODE è abbastanza complicato che ci vuole un po 'per risolvere.

Altri suggerimenti

Nel frattempo, ho trovato un altro modo per farlo. E 'meno elegante, ma utilizza solo una sostituzione così ho pensato che vi posterò anche qui.

L'idea è quella di utilizzare In attesa sul Stampa in modo che non si sarebbe valutata, fare la sostituzione regola e quindi ReleaseHold , basta prima che il Manipola .

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}]
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top