Почему Scipy.misc.derivative дает неправильный ответ Python - PullRequest
0 голосов
/ 20 ноября 2018

Я пытаюсь построить производную кусочной функции.

Я разработал математику, что производная существует, все должно быть хорошо, и я хочу посмотреть, что произойдет на"особенность", но я получаю:

особенность при 'x = 0'

, что противоречит тому, что я ожидаю:

ожидаемый "вид" результата

Мой код:

from scipy.misc import derivative as deriv
import numpy as np
import pylab as pyl


def f(x):  # Define piecewise function
    if x != 0:
        h = np.power(x, -1)
        return x**2 * np.sin(h)
    elif x == 0:
        return 0


vf = np.vectorize(f)  # Vectorize function to use "deriv"

x = np.linspace(-1, 1, num=10 ** 5)  # Make 'x' continuous parameter
x = np.sort(np.append(x, [0]))  # Make sure 'x' contains '0'


def d(x): return deriv(vf, x)  # Define derivative of 'f' respect to 'x'


print('0, ' + str(d(0)))  # Derivative at '0'

pyl.plot(x, vf(x), 'b-')  # Plot functions
pyl.plot(x, d(x), 'C4')
pyl.scatter(0, d(0), c='r0')

pyl.grid()

pyl.show()  # Display graphically

1 Ответ

0 голосов
/ 21 ноября 2018

Во-первых, ваш f иногда возвращает int, и если явный выходной dtype не указан, numpy.vectorize угадывает выходной dtype, вызывая базовую функцию первого элемента ввода .Это означает, что некоторые из f результатов в производном вычислении приводятся к целым числам, отбрасывая результаты.

Вы не можете просто вызвать numpy.vectorize для функции, которая не обрабатывает массивы иПредположим, что все получится.Вы все еще должны обращать внимание на такие вещи, как dtype и другие причуды в документах, и это никогда не будет так быстро, как функция, написанная для естественной обработки векторизованных операций.


Другая проблема заключается в том, что, как явно указано в документации ,

scipy.misc.derivative (func, x0, dx = 1.0, n = 1, args = (), order = 3)

Найдите n-ю производную функции в точке.

Для данной функции используйте формулу центральной разности с интервалом dx, чтобы вычислить n-ю производную в точке x0.

scipy.misc.derivative использует формулу центральной разности с интервалом по умолчанию, равным 1. Этот размер шага намного больше, чем размер "покачиваний" на вашем графике.Вам нужно будет указать меньший размер шага, чтобы получить полезные производные результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...