>-----Original Message-----
>From: Jochen Haller [mailto:haller@XXXXXXX.de]
>Sent: Thursday, May 15, 2003 11:27 AM
>To: Mathematica Mailingliste
>Subject: Anfängerfrage
>
>
>Morgen!
>
>Wahrscheinlich eine Anfängerfrage, aber ich bin eben auch einer. ;)
kein Problem!
>
>Manchmal wenn ich ein Funktion durch verzögerte Zuweisung definieren
>möchte, wie z.B. hier
>
>xc[pb_, pc_] := Which[Evaluate[pb > pbgr1, xc1[pb, pc], pbgr2 < pb <=
>pbgr1, xc2[pb, pc], 0 <= pb <= pbgr2, xc3[pb, pc], True, 0]],
>
Also, was wollen Sie mit Evaluate an dieser Stelle erreichen? Evaluate
ändert die Reihenfolge der Berechnungen, ist also sehr bedacht zu nutzen. Es
ist kein Zaubermittel, irgendetwas irgendwie schneller oder irgendwie
sonstwas zu machen.
Wenn etwas nicht funktioniert, versuchen Sie den Fall zu vereinfachen, immer
weiter in kleine Bestandteile, in der Hoffnung irgendwann durchzublicken.
Dann wieder rückwärts zusammenbauen, bis der Fehler wieder auftritt. Meist
hat man dann schon das aha!-Erlebnis, oder man schaut ins's Buch oder macht
'ne Trace oder schreibt 'ne Post an DMUG.
Obwohl das Evaluate hier sicher strikt falsch ist, ist es wahrscheinlich nur
indirekt die Quelle Ihres Fehlers:
In[6]:= pbgr1 = 2; pbgr2 = 1; (* wir setzen mal Werte für die Grenzen *)
In[7]:=
Which[Evaluate[pb > pbgr1, xc1[pb, pc], pbgr2 < pb <= pbgr1, xc2[pb, pc],
0 <= pb <= pbgr2, xc3[pb, pc], True, 0]]
Out[7]=
Which[pb > 2, xc1[pb, pc], 1 < pb <= 2, xc2[pb, pc], 0 <= pb <= 1,
xc3[pb, pc], True, 0]
Wie man sieht, in diesem Falle hat das Evaluate nichts gebracht (aber auch
nicht falsch gemacht).
Jetzt testen wir mal Werte für das Argument.:
In[8]:= With[{pb = #},
Which[Evaluate[pb > pbgr1, xc1[pb, pc], pbgr2 < pb <= pbgr1,
xc2[pb, pc], 0 <= pb <= pbgr2, xc3[pb, pc], True, 0]]] & /@ {-0.5,
0.5, 1.5, 2.5}
Out[8]=
{0, xc3[0.5, pc], xc2[1.5, pc], xc1[2.5, pc]}
Das sieht soweit gut aus. Jetzt muß man sich fragen, ob die Funktionen
xc<i>[_,pc] für pc uns *alle* möglichen Werte des Argumentes definiert sind,
denn bei jedem Aufruf werden alle drei Funktionen ausgewertet, auch in den
"Zweigen", die nachher nichts zum Ergebnis beitragen. Das ist mit größter
Wahrscheinlichkeit der Fehler.
Definieren wir mal
In[17]:=
rugg[a_]:=If[a>0,a,Print["Fehler"]]
In[18]:=
xc1[a_,_]:=rugg[a - pbgr1];
xc2[a_,_]:=rugg[a-pbgr2];
xc3[a_,_]:=rugg[a]
In[21]:= With[{pb = #},
Which[Evaluate[pb > pbgr1, xc1[pb, pc], pbgr2 < pb <= pbgr1,
xc2[pb, pc], 0 <= pb <= pbgr2, xc3[pb, pc], True, 0]]] & /@ {-0.5,
0.5, 1.5, 2.5}}
>From In[21]:= Fehler
>From In[21]:= Fehler
>From In[21]:= Fehler
>From In[21]:= Fehler
>From In[21]:= Fehler
>From In[21]:= Fehler
Out[21]= {0,0.5,0.5,0.5}
Wohingegen (ohne Evaluate):
In[22]:= (With[{pb = #1}, Which[pb > pbgr1, xc1[pb, pc],
Inequality[pbgr2, Less, pb, LessEqual, pbgr1],
xc2[pb, pc], 0 <= pb <= pbgr2, xc3[pb, pc], True,
0]] & ) /@ {-0.5, 0.5, 1.5, 2.5}
Out[22]= {0, 0.5, 0.5, 0.5}
keinen Fehler liefert, weil die nicht benötigten "Zweige" nicht ausgewertet
werden. Das ist (u.a.) der Sinn von Which, Evaluate macht das kaputt.
>erhalte ich folgende Fehlermeldung:
>
>SetDelayed::write: Marke Integer in 0[pb_,pc_] ist geschützt
>(Protected).
>
>Dabei ist 'Marke' auch manchmal 'Times', 'Integer'. Was bedeutet das?
>Ist event. das Symbol schon belegt?
>
Also, das sieht aus wie weitere Fehler, haben sie zusätzliche Zuweisungen?
Wenn ich 'Marke' mit 'Tag' lese, bekommen Sie diesen Fehler, wenn Sie z.B.
zwischenzeitlich xp3 = 0 setzen, und dann wieder neu
xp3[pb_,pc_]:= ..irgendwas.. definieren wollen. Das sind relativ ordinären
Fehler, die auch in anderen Programmiersprachen auftreten. (Halten Sie
Kontrolle über ihre Namen, wählen Sie neue Namen für neue Objekte, der
Symbolspeicher von Mathematica ist groß genug!)
>MfG
>Jochen Haller
>
>--
>Dipl.-Kfm. Jochen Haller
>
>Inst. VWL und Recht, Abt. Mikroökonomik und Räumliche Ökonomik
>Keplerstraße 17, 10. OG, 70174 Stuttgart
>0711/121-3557, 0711/121-2450 (FAX)
>http://www.sofo.uni-stuttgart.de/mikro/haller.html
>
>
--
Hartmut Wolf