Wolfram Computation Meets Knowledge

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