Как использовать ?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
- Расширенная поддержка установки