2016-10-28 2 views
-1

В Scipy одномерное интегрирование функции с несколькими параметрами достигается путем указания постоянных параметров в определении функции через аргумент args.Python Scipy получает доступ к локальным переменным в другой функции?

Этот пример взят из справочного руководства SciPy:

>>> from scipy.integrate import quad 
>>> def integrand(x, a, b): 
...  return a * x + b 
>>> a = 2 
>>> b = 1 
>>> I = quad(integrand, 0, 1, args=(a,b)) 
>>> I = (2.0, 2.220446049250313e-14) 

https://docs.scipy.org/doc/scipy/reference/tutorial/integrate.html

Я всегда думал, что локальные переменные, определенные в пределах функций недоступны вне определения. Здесь это кажется неверным, так как quad требует только integrad как аргумент функции, и он автоматически знает, что используемые переменные (x, a, b) (и, следовательно, (a, b) взяты за параметры в интеграцию).

Что здесь происходит? Что мне не хватает?

ответ

0

quad ничего не знает о том, что переменные integrand использует. Он не знает, что аргументы называются a и b. Он видит только значения глобальных переменных a и b и передает эти значения позиционно подынтегральным выражением. Другими словами, код будет работать так же, если вы сделали

x = 2 
y = 1 
I = quad(integrand, 0, 1, args=(x,y)) 

quad даже не знает, сколько аргументов integrand принимает, кроме того, что он принимает по крайней мере один. quad передает значение переменной интеграции в качестве первого аргумента. Вы, пользователь, должны знать это и передавать правильное число. Если вы этого не сделаете (например, если вы не прошли args или просто передали один аргумент), вы получите сообщение об ошибке. quad просто слепо передает все ваши аргументы.

+0

Я вижу. Итак, как он узнает, что когда вы передаете args (a, b) для некоторых глобальных переменных (a, b), он знает, как выполнить квадратурное интегрирование по x? –

+0

@TaeHyounPark: вам необходимо прочитать [документацию] (https://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.quad.html): «Если func принимает много аргументов, он интегрирован вдоль оси, соответствующей первому аргументу ». – BrenBarn

+0

О, извините, я пропустил часть вашего объяснения. переменная интегрирования является первым аргументом. Большое спасибо за объяснение. И да, я должен обратить больше внимания на документацию ... –

Смежные вопросы