Rufen Sie die Werte von InterpolatingFunction ab

  • Bei der Analyse eines großen ODE-Systems habe ich ein bestimmtes Verhältnis p definiert, das einige Variablen enthält, die durch InterpolatingFunction durch NDSolve dargestellt werden.

     p = Sum[(c[i][t] + ac[i][t] + ct[i][t] + bmct[i][t] + 
     ambmct[i][t]) i, {i, 0, 6}]/(6*0.58)
     

    Um p zu zeichnen, füge ich p mit einer Transformationsregel in eine Plot[] ein, wie folgt:

     Plot[p/.tsol,{t, 0, timeduration}]
     

    wobei tsol die Ausgabe von NDSolve speichert.

    Das Plotten von p funktioniert gut und ergibt eine schön oszillierende Darstellung. Wie extrahiere ich Werte dieser neuen InterpolatingFunction p für bestimmte Zeitpunkte t?

    Ironischerweise gelingt es mir, die Ableitung dieser Funktion zusammen mit dem zu berechnen Punkte, an denen die Steigung 0 ist. Dieses eher trivial aussehende Problem bereitet mir jedoch Kopfschmerzen ...

    Danke !!

    15 June 2012
    helloandreDrahcir
3 answers
  • Sie können eine Interpolationsfunktion wie jede andere Funktion aufrufen. Hier ein Beispiel mit NDSolve:

     sol = NDSolve[{y'[x] == -y[x], y[0] == 1}, y, {x, 0, 10}]
    
    (* ==> {{y->InterpolatingFunction[{{0.,10.}},<>]}} *)
    
    fun = y /. First[sol]
    
    (* ==> InterpolatingFunction[{{0.,10.}},<>] *)
    
    {fun[0], fun[1], fun[2]}
    
    (* ==> {1., 0.367879, 0.135335} *)
     

    Es klingt wie die Schwierigkeit für Sie, die eigentliche Funktion zu extrahieren die von NDSolve zurückgegebene Regelliste. Mein Beispiel oben sollte Ihnen dabei helfen.

    30 May 2012
    Szabolcs
  • Sie könnten so etwas tun

     fun = Sum[(c[i][#] + ac[i][#] + ct[i][#] + bmct[i][#] + ambmct[i][#]) i, 
      {i, 0, 6}]/(6*0.58) & /. tsol[[1]]
     

    Dann ist fun ein (reines) Funktion, damit Sie es auf normale Weise auswerten können.

    30 May 2012
    EAMannAndrew
  • Vielen Dank an Szabolcs und Heike, dass Sie sich etwas Zeit für meine Frage genommen haben.

    Ich habe mir das erst ausgedacht, bevor ich Ihre Antworten las, was am meisten ist nützliche Lösung für das spezielle Problem, das ich zu lösen versuche (sehr ähnlich der Lösung von Heike, in der auch eine Funktion definiert wird):

     p[sol_, parameters_, t_] := (Sum[(c[i][t] + ac[i][t] + ct[i][t] + 
    bmct[i][t] + ambmct[i][t]) i, {i, 0, 6}] /. sol)/(6 cT /. parameters);
     

    Es ist schön, dass ich jetzt fragen kann, wozu jeder Wert t in seiner Domäne zugeordnet ist, während er trotzdem die Ableitung berechnen kann.

    Ich bin relativ neu in Mathematica, aber die Tatsache, dass es immer einen sexy Weg gibt, um ein Problem zu lösen, gefällt mir sehr.

    30 May 2012
    Javier