Gleichungssystem mit Mutatione < Mathematica < Mathe-Software < Mathe < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 12:18 Mi 24.02.2010 | Autor: | Daidalus |
Hallo,
zwecks Simulation möchte ich in Mathematica eine Virusinfektion simulieren. Das Problem ist, daß zunehmend neue Mutationen entstehen. Um das umzusetzen, habe ich die folgende Schleife programmiert:
...
v1[0] = 1;
v2[0] = 0;
v3[0] = 0;
...
Do[o[t_] = RandomReal[]; a[t_] = RandomReal[];
v1[t_] =
v1[t - 1] + h v1[t - 1] (r (1 + ix) - p x1[t - 1] - q z[t - 1]);
w2[t_] =
v2[t - 1] + h v2[t - 1] (r (1 + ix) - p x2[t - 1] - q z[t - 1]);
w3[t_] =
v3[t - 1] + h v3[t - 1] (r (1 + ix) - p x3[t - 1] - q z[t - 1]);
x1[t_] =
x1[t - 1] +
h (c v1[t - 1] -
u x1[t - 1] (1 + v1[t - 1] + v2[t - 1] + v3[t - 1]));
x2[t_] =
x2[t - 1] +
h (c v2[t - 1] -
u x2[t - 1] (1 + v1[t - 1] + v2[t - 1] + v3[t - 1]));
x3[t_] =
x3[t - 1] +
h (c v3[t - 1] -
u x3[t - 1] (1 + v1[t - 1] + v2[t - 1] + v3[t - 1]));
z[t_] = z[t - 1] + h (( 1 - ix) k - u z[t - 1]);
v2[t_] = If[ w2[t] <= 0 && o[t] > 0.95, a[t], w2[t]];
v3[t_] =
If[ w3[t] <= 0 && ö[t] > 0.95 && w2[t] > 0, ä[t], w3[t]];
X1[t] = x1[t]; X2[t] = x2[t]; X3[t] = x3[t]; V1[t] = v1[t];
V2[t] = v2[t]; V3[t] = v3[t]; W2[t] = w2[t]; W3[t] = w3[t];
Z[t] = z[t]; U[t] = o[t]; A[t] = a[t], {t, 1, T}];
Das Problem ist, daß ich somit jede mögliche Virusmutation v[t] and die zugehörigen Antigene x[t] zuvor programmieren muß, Null setze und dann beim Eintreffen der Bedingung auf einen höheren Wert setze. In dem Beispiel sind nur 3 Mutationen angeben, sollten es aber mehr sein, wird es sehr schnell umständlich.
Weiß jemand wie es möglich ist, daß Mathematica innerhalb der Do-Funktion neue Funktionen anhängt? Mit append kann man leider keine Funktionen anhängen.
Danke für die Hilfe!
Ich habe diese Frage auch in folgenden Foren auf anderen Internetseiten gestellt:
http://www.matheplanet.com/default3.html?call=viewforum.php?forum=41004&ref=http%3A%2F%2Fwww.google.com%2Fsearch%3Fhl%3Dde%26safe%3Doff%26client%3Dfirefox-a%26hs%3D1MZ%26rls%3Dorg.mozilla%253Ade%253Aofficial%26q%3Dmathematica%2Bhilfe%2Bforum%26btnG%3DSuche%26lr%3D%26cts%3D1267006033985%26aq%3Df%26oq%3D
|
|
|
|
Hallöle,
wie wäre es, wenn Du v und x als Listen implementierst ({v1,v2....} bzw {x1,x2,...}?
Da es sich augenscheinlich um einen iterativen Prozess handelt, wäre es eventuell auch lohnend, sich in der Hilfe auch mal NestList bzw. NestWhileList anzuschauen.
Allerdings verstehe ich nicht, warum a und o als Funktionen mit Parameter definiert sind (a=o=RandomReal verhielte sich genau so) und warum Du die Funktionen v1,v2 etc in jedem Schleifendurchlauf neu definierst, aber ich kenne ja auch nicht das ganze Programm.
Gruß,
Peter
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 13:10 Mi 24.02.2010 | Autor: | Daidalus |
Danke für die Antwort,
möglicherweise ist NestList auch ein Option, jedoch handelt es sich hier um ein Gleichungssystem. Nest scheint sich nur auf eine Funktion, wenn auch mit mehreren Argumenten zu beziehen.
Die Funktionen für v2, v3 werden als w2 und w3 neu definiert, da ab einem bestimmten Punkt der Wert exogen von Null auf ein positive Zahl gesetzt wird.
Das System ist eigentlich das folgende:
[mm] v_i[t+1] [/mm] = [mm] v_i[/mm] [t] + h v1[t] (r (1 + ix) - p [mm] x_i[/mm] [t] - q z[t]);
[mm] x_i[t+1] =x_i[/mm] [t] + h (c [mm] v_i[/mm] [t] -u [mm] x_i[/mm] [t] (1 + [mm] Summe_i[v_i[/mm] [t];
z[t+1] = z[t] + h (( 1 - ix) k - u z[t]);
mit i=1,..,n;
und der Wahrscheinlichkeit einer neue Mutation bei 5% per Periode liegt.
Das Problem ist, daß ich nicht die n Gleichungen für [mm] v_i [/mm] und [mm] x_i [/mm] zuvor programmieren möchte, sondern daß Mathematica jeweils zwei neue Funktionen dazu setzen sollte mit der entsprechenden Wahrscheinlichkeit.
|
|
|
|
|
Nenn mich stur, aber ich bin der festen Überzeugung, dass es für neue Mutationen keine Funktionen, sondern Daten braucht.
Ich habe das mal fix hingetippselt. Leider weiss ich nicht genau, welche Werte für die Konstanten typisch sind und habe mental gewürfelt
Auch war mir unklar, wie neue Mutationen ihre Startwerte gesetzt bekommen müssen; hier lasse ich Mathematica würfeln.
Ein Testlauf brachte mir folgendes Schaubild (sieht eigentlich plausibel aus):
[Dateianhang nicht öffentlich]
Das Notebook ist im Anhang.
Gruß,
Peter
Dateianhänge: Anhang Nr. 1 (Typ: png) [nicht öffentlich] Anhang Nr. 2 (Typ: nb) [nicht öffentlich]
|
|
|
|
|
Vielen Dank für die Mühe! Leider ist mir ein Fehler bei der Notation unterlaufen. In der Darstellung ist das v1[t] ein [mm] v_i[/mm] [t]. Das Problem ist, daß die Mutation nicht nur Perturbationen der Werte sind, sondern eigenständige Funktioen. Vielleicht noch mal ein einfacheres Bespiel:
Nehmen wir an, das System ist wie folgt:
gegeben [mm] $x_1(0)$ [/mm] und [mm] $x_1(0)$
[/mm]
[mm] $v_1(t+1) [/mm] = a [mm] v_1(t) [/mm] + b [mm] x_1(t)$;
[/mm]
[mm] $x_1(t+1) [/mm] = c [mm] v_1(t) [/mm] + d [mm] x_1(t)$;
[/mm]
Angenommen, die Mutationswahrscheinlichkeit liegt bei 5%.Jetzt gibt es z.B. 30 Iterationen, ohne daß ein Wert RandomReal größer 0.95 erscheint. Die Ausgabe beinhaltet also 2 x 30 Werte.
In Periode 31 ist der Wert wird RandomReal > 0.95 erzeugt, somit kommt ein Mutant hinzu. Das Gleichungssystem lautet dann:
[mm] $v_1(t+1) [/mm] = a [mm] v_1(t) [/mm] + b [mm] x_1(t)$;
[/mm]
[mm] $x_1(t+1) [/mm] = c [mm] v_1(t) [/mm] + d [mm] x_1(t)$;
[/mm]
[mm] $v_2(t+1) [/mm] = a [mm] v_2(t) [/mm] + b [mm] x_2(t)$;
[/mm]
[mm] $x_2(t+1) [/mm] = c [mm] v_2(t) [/mm] + d [mm] x_2(t)$;
[/mm]
Mit de Wert [mm] $v_2(30)= [/mm] Z$ [mm] $x_2(30) [/mm] = W$, wobei Z und W irgendwelche Zufallsvariablen sind.
In 45 Periode/Iteration trifft die Bedingung wieder zu. Wir haben also 2x 30 Werte für die ersten 30 Perioden + 15 x 4Werte für Periode 30 bis 45 (zuzüglich der Ursprungsbedingungen). Jetzt kommen wieder 2 weitere Gleichungen für [mm] v_3(t) [/mm] und [mm] x_3(t) [/mm] hinzu. Ich möchte also, daß Mathematica automatisch zwei Funktionen anfügt, sobald die bedigung erfüllt ist.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 10:20 Di 02.03.2010 | Autor: | matux |
$MATUXTEXT(ueberfaellige_frage)
|
|
|
|