Как использовать ?NumericQ для изменения порядка выполнения
Используя численные решатели, такие как NIntegrate или NMaximize, порядок выполнения играет большую роль. Рассмотрим следующую функцию, обозначаемую f
:
f[a_] := NIntegrate[ (2 - a) Sin[a x], {x, 0, Pi}]
Функция f
вроде хорошо определена, поскольку дает числовой результат для числовых аргументов, таких как f[0.5]
. Однако, вычисление функции f
сталкивается с трудностями для символьных аргументов:
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}}
Поскольку символ a
не имеет заданного значения, язык Wolfram Language не может численно проинтегрировать выражение (2 - a) Sin[a x]
относительно переменной x
. Такая трудность возникает с каждой функцией, которая может вычислять f[a]
прежде, чем символу a
будет присвоено численное значение. Например, язык Wolfram Language не может численно найти максимум функции f
:
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}}
Выполнение этой команды дает то же сообщение об ошибке, что и выполнение f[a]
. В этом примере, выражение f[a]
вычисляется раньше, чем полное выражение NMaximize.
Для изменения порядка вычисления, зададим функцию f
так, чтобы определение работало только для числовых аргументов, используя предикат NumericQ и возможность тестирования шаблонов. Добавим к аргументу функции f
следующее условие ?NumericQ
:
Clear[f]
f[a_?NumericQ] := NIntegrate[ (2 - a) Sin[a x], {x, 0, Pi}]
Теперь, вычисление выражения f[a]
возвращает функцию невычисленной и не генерирует сообщения об ошибке. Язык Wolfram Language теперь в состоянии численно максимизировать функцию, поскольку использование ?NumericQ
в определении f
изменяет порядок вычисления:
NMaximize[f[a], a]
{3.05716, {a -> 0.581569}}}
Обратиться в службу поддержки
Если у вас есть вопросы о ценах и оплате, активации или сомнения по техническим темам, мы готовы вам помочь.
1-800-WOLFRAM (+1-217-398-0700 для международных звонков)
Служба поддержки
Понедельник-пятница
с 08:00 до 17:00 по центральному времени США
- Регистрация или активация продукта
- Предпродажная информация и заказ
- Помощь в установке и первом запуске
Расширенная техническая поддержка (для правомочных клиентов)
Понедельник-четверг
с 08:00 до 19:00 по центральному времени США
Пятница
с 08:30 до 10:00 и с 11:00 до 17:00 по центральному времени США
- Приоритетная техническая поддержка
- Поддержка по продуктам от экспертов Wolfram
- Помощь специалистов по программированию на Wolfram Language
- Расширенная поддержка установки