Wie verwende ich ?NumericQ, um die Reihenfolge der Auswertung zu beeinflussen?
Bei der Verwendung von numerischen Funktionen wie NIntegrate oder NMaximize ist die Reihenfolge der Auswertung wichtig. Betrachten Sie die folgende Funktion f
:
f[a_] := NIntegrate[ (2 - a) Sin[a x], {x, 0, Pi}]
Die Funktion f
sieht wie eine wohldefinierte Funktion aus, da sie für numerische Werte wie f[0.5]
ausgewertet wird. Das Problem tritt auf, wenn der Funktion f
ein Symbol statt einer Zahl gegeben wird:
f[a]
NIntegrate::inumr : The integrand (2 - a) Sin[a x] has evaluated to non-numerical values for all sampling points in the region with boundaries {{0, Pi}}
Da a
nicht definiert ist, kann die Wolfram Language den Ausdruck (2 - a) Sin[a x]
nicht numerisch nach x
integrieren. Dies ist ein Problem für jede Funktion, die f[a]
auswertet, bevor sie einen Wert für a
liefert. Zum Beispiel kann die Wolfram Language die Funktion f
nicht numerisch maximieren:
NMaximize[f[a], a]
NIntegrate::inumr : The integrand (2 - a) Sin[a x] has evaluated to non-numerical values for all sampling points in the region with boundaries {{0, Pi}}
Dieser Code gibt die gleiche Fehlermeldung aus, wie wenn nur f[a]
ausgewertet wird. In diesem Beispiel wird f[a]
vor der vollständigen NMaximize-Anweisung ausgewertet.
Um die Reihenfolge der Auswertung zu ändern, definieren Sie die Funktion f
so, dass sie nur ausgewertet wird, wenn sie durch NumericQ und Pattern Testing einen numerischen Wert erhält. Hängen Sie das Muster ?NumericQ
an das Argument der Funktion f
an:
Clear[f]
f[a_?NumericQ] := NIntegrate[ (2 - a) Sin[a x], {x, 0, Pi}]
Jetzt gibt die Auswertung von f[a]
die Funktion unausgewertet zurück, anstatt eine Fehlermeldung zu erzeugen. Die Wolfram Language kann die neue Definition von f
numerisch maximieren, da ?NumericQ
die Reihenfolge der Auswertung ändert:
NMaximize[f[a], a]
{3.05716, {a -> 0.581569}}}
[English]
Support kontaktieren
Egal, ob Sie eine Frage zur Rechnung, Aktivierung oder zu einer technischen Angelegenheit haben, wir sind da, um Ihnen zu helfen.
1-800-WOLFRAM (+1-217-398-0700 für internationale Anrufer)
Kundendienst
Montag–Freitag
8:00–17:00 US Central Time
- Produktregistrierung oder Aktivierung
- Kaufinformationen und Bestellung
- Hilfe beim Installieren und Starten
Erweiterter technischer Support (für berechtigte Kunden)
Montag–Donnerstag
8:00–19:00 US Central Time
Freitag
8:30–10:00 & 11:00–17:00 US Central Time
- Technischer Priority-Support
- Produktassistenz von Wolfram-Experten
- Hilfe beim Programmieren mit der Wolfram Language
- Erweiterter Support beim Installieren