Программирование и научные вычисления на языке Python/§15: различия между версиями

Содержимое удалено Содержимое добавлено
Нет описания правки
Нет описания правки
Строка 11:
<math>y(t) = v_0(t) - \frac{1}{2}gt^2</math>.
 
Здесь ''y'' является функций времени ''t'' и кроме того, зависит от других параметров ''v<sub>0</sub>'' и ''g''. Мы могли бы придумать какое-то новое обозначение, вроде ''y''(''t; ''v<sub>0</sub>, g''), чтобы показать, что ''t'' является независимой переменной, а ''v<sub>0</sub>'' и ''g'' задаваемыми параметрами. При этом, строго говоря для Земли ''g'', гравитационная постоянная, неизменна, то есть правильнее было бы писать 'y''(''t; <sub>0</sub>''). В общем случае, у нас может иметься функция, которая будет записываться ''f''(''x''; ''p<sub>1</sub>, ..., p<sub>n</sub>'').
 
Как нам лучше интерпретировать такие математические функции в виде программных? Первое очевидное решение получать и переменные, и изменяемые параметры как аргументы обычной функции:
Строка 50:
Но, к несчастью, <tt>diff</tt> не будет работать с нашей функцией <tt>y(t, v0)</tt>. Вызов <tt>diff(y, t)</tt> приведет к ошибке в функции <tt>diff</tt>, поскольку дифференцируемая функция должна принимать лишь один агумент, а принимает два.
 
Написание альтернативной <tt>diff</tt>-функции для <tt>f</tt> с двумя аргументами это плохое решение, поскольку оно ограничивает множествовсевозможные всевозможных <tt>f</tt> до функций с одной переменной и одним аргументом. Фундаментальные принципы программирования гласят, что следует стремиться к такому решению, которое будет настолько общим и настолько широко применимым, насколько это возможно. В настоящем случае это означает, что функция <tt>diff</tt> должна быть применима к любой функции одной переменной.
 
 
===Плохое решение: Глобальные переменные===
Требования к представлению функций таким образом состоит в том, чтобы они принимали только независимую переменную, то есть, получается, выглядели так:
 
 
<source lang="python">
def y(t):
g = 9.81
return v0*t - 0.5*g*t**2</source>
 
 
Но поскольку <tt>v0</tt> не определено, то вызов функции требует того, чтобы переменная была заранее определена и тогда мы уже можем определить значение для дифференцирования.
 
 
<source lang="python">
v0 = 3
dy = diff(y, 1)</source>
 
 
''Продолжение следует''