Contourplot numerischer Funkt. < Mathematica < Mathe-Software < Mathe < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 18:14 Mi 16.02.2011 | Autor: | JackyJay |
Ich habe diese Frage in keinem Forum auf anderen Internetseiten gestellt.
Hallo zusammen ich habe eine Frage:
Ich muss ein Differentialgleichungssystem lösen, welches keine
analytische Lösung hat. Dazu benutze ich NDSolve.
In dem System befindet sich noch ein zusätzlicher Parameter w, den ich
gerne variieren möchte.
Am ende möchte ich nämlich einen Contourplot zeichnen mit x-achse die
zeit (x) und y-achse den anderen parameter(w).
Es sieht ungefähr so aus:
NDSolve[{y1'[x] == f (y1[x], y2[x], w, ...),
y2'[x] == f (y1[x], y2[x], w, ...),
...
y1[0] == 1, y2[0] == 0, ...}, {y1, y2, ...}, {x, 0, 100}];
Die Funtion f ist einfach eine beliebige Funktion, die von den
anderen y und eben dem parameter w abhängt.
Ich habe 2 ansätze versucht, komme aber bei beiden nicht so richtig weiter:
1. Ansatz
Ich benutze eine for schleife und variere den parameter w, wie ich es
möchte.
Ich bekomme dann die Lösung abhängig von w ( y1[w],y2[w],...) und jedes
y[w] ist natürlich auch noch von x abhängig.
Jetzt weiss ich aber nicht wie ich das in einen plot bekomme. Also z.b. y2[x,w].
2. Ansatz
Die 2. idee kommt aus der Hilfe:
NDSolve[eqns,y,{x,Subscript[x, min],Subscript[x, max]},{t,Subscript[t,
min],Subscript[t, max]}]
Damit sollte es doch eigentlich gehen.
Also angewandt auf mein Beispiel :
NDSolve[{y1'[x] == f (y1[x], y2[x], w, ...),
y2'[x] == f (y1[x], y2[x], w, ...),
...
y1[0] == 1, y2[0] == 0, ...}, {y1, y2, ...}, {x, 0, 100},{w,0,1}] Oder
NDSolve[{y1'[x] == f (y1[x], y2[x], w, ...),
y2'[x] == f (y1[x], y2[x], w, ...),
...
y1[0] == 1, y2[0] == 0, ...},y4, {x, 0, 100},{w,0,1}]
Im ersten Fall geb ich alle y aus im 2. Fall nur das gewünschte y4.
Allerdings bekomme ich bei beiden die Fehlermeldung:
NDSolve::derlen: The length of the derivative operator Derivative[1] in
[mm] (y4^\[Prime])[x] [/mm] is not the same as the number of arguments. >>
Hat da jemand eine idee?
|
|
|
|
Moin,
mehrere Sachen, damit die Methode funktioniert
1. Du musst wissen, dass NDSolve die DGL mit allen Parameterwerten im gewuenschten Intervall loesen kann. Ansonsten fliegt dir der ContourPlot um die Ohren.
2. Weil hier bei jedem Punkt (x,w) neu integriert werden muss sollte man vielleicht ueberlegen, ob man nicht lieber Datenpunkte erzeugt und ListContourPlot nimmt.
Nehmen wir an, du willst dir eine Matrix erstellen, in der dann die Funktionswerte fuer verschiedene Werte (x,w) stehen, dann kannst du jede Zeile ausrechnen indem du 1x NDSolve benutzt, eine Funktion erhaelst und die an allen Punkten x abtastest. Dann nimmst du den naechsten Wert w und machst das gleiche. So musst du fuer jede Zeile nur einmal integrieren.
Ansonsten geht es wie folgt. Bau dir eine Funktion, die ein Wertepaar (x,w) bekommt und dann deine DGL fuer dieses spezielle w von 0 (oder von wo auch immer) bis x integriert. Dann gibst du den Punkt f(x,w) zurueck, indem du die Werte in die erhaltene Interpolationsfunktion einsetzt. Fuer das erste Beispiel aus der Hilfe zu NDSolve ergibt sich dann sowas wie
1: | fc = Compile[{{x, _Real}, {w, _Real}},
| 2: | Block[{xx,
| 3: | yy}, (yy /.
| 4: | First@NDSolve[{yy'[xx] == yy[xx] Cos[w*xx + yy[xx]],
| 5: | yy[0] == 1}, yy, {xx, 0, x}])[x]
| 6: | ], RuntimeOptions -> "Speed"]
| 7: | f[x_?NumericQ, w_?NumericQ] := fc[x, w]
| 8: |
| 9: | ContourPlot[f[x, w], {x, 2, 5}, {w, 2, 5}]
|
[Dateianhang nicht öffentlich]
Cheers
Patrick
Dateianhänge: Anhang Nr. 1 (Typ: png) [nicht öffentlich]
|
|
|
|