Это скорее вопрос численных методов, чем вопрос программирования.
В любом случае, если ваша функция имеет периодические граничные условия (кажется, что это синусоидальная волна, поэтому в этом случае у вас есть периодичность), просто создайте новый массив с 2 дополнительными элементами: новый начальный элемент массива будет вашим последнимЭлемент исходного массива и конечный элемент нового массива будут начальным элементом исходного массива.Вот способ сделать это
f_periodic = np.zeros(f.size+2)
f_periodic[1:-1], f_periodic[0], f_periodic[-1] = f, f[-1], f[0]
Теперь вы можете дифференцировать f_periodic
, для которого d[1]
и d[-2]
будут правильными производными значениями на границах (без учета d[0]
и d[-1]
).
Редактировать после новых требований OP ...
Для более общих граничных условий, скажем, конкретное значение на границах, существуют разные подходы, которым можно следовать:
- Использовать значения-призраки:
Снова расширить функцию и экстраполировать значения для новых границ.В зависимости от порядка численной дифференциации потребуется больше ячеек-призраков.Для текущей схемы будет использоваться простая линейная экстраполяция (требуется только 1 призрачное значение на каждой границе):
f_new = np.zeros(f.size+2)
f_new[1:-1] = f
f_new[-1] = f[-2] + (f[-2]-f[-3])/(x[-2]-x[-3])*(x[-1]-x[-2])
f_new[0] = f[1] + (f[1]-f[2])/(x[1]-x[2])*(x[0]-x[1])
Обратите внимание, что вам также необходимо расширить x
.Однако, поскольку у вас постоянный интервал, просто используйте h
вместо пространственных различий, например, x[-2]-x[-3]
.Теперь вы можете дифференцировать f_new
, и вы получите приближение 1-го порядка от производной на границах (поскольку вы использовали линейную экстраполяцию, чтобы найти значение-призрак).
Использование схем прямого и обратного на границах
Я не буду показывать здесь код, но в основном вам нужно различать, используя граничное значение и правое (прямое) или левое (обратное) значение длялевая и правая границы соответственно.Это приближение первого порядка.