Minha maneira preferida de aproximar uma derivada é a diferença central, é mais precisa do que a diferença direta ou a reversa, e estou com preguiça de ir em uma ordem superior. Mas a diferença central requer um ponto de dados em cada lado do ponto que você está avaliando. Normalmente, isso significa que você acaba não tendo uma derivada em nenhum dos pontos de extremidade. Para resolvê-lo, quero que você mude para a diferença para frente e para trás nas bordas:
Especificamente, quero que você use uma diferença para a frente no primeiro ponto, uma diferença para trás no último ponto e uma diferença central para todos os pontos no meio. Além disso, você pode assumir que os valores x estão espaçados igualmente e se concentrar apenas em y. Use estas fórmulas:
Boa sorte, estou ansioso para ver se alguém cria uma regra simples que reproduza todos os três derivados nos lugares certos!
ENTRADA EX:
0.034 9.62 8.885 3.477 2.38
Usarei FD, CD e BD para indicar qual algoritmo usar em qual ponto, portanto, acima de 5 pontos são usados para aproximar derivadas usando
FD CD CD CD BD
E os valores calculados seriam:
9.586 4.4255 -3.0715 -3.2525 -1.097
Você pode assumir que sempre haverá pelo menos 3 pontos de entrada e pode calcular usando precisão simples ou dupla.
E, como sempre, a resposta mais curta vence.
[a,b,c,d,e] -> [b-a,(c-a)/2,(d-b)/2,(e-c)/2,e-d]
. Pode haver menos que 3 pontos de entrada?Respostas:
Gelatina ,
1310 bytesExperimente online!
Como funciona
fonte
MATL,
2115 bytesTryItOnline
Metade o vetor de entrada e pega diferenças sucessivas para fornecer
d=[i(2)-i(1) i(3)-i(2) ... i(end)-i(end-1)]/2
e, em seguida , cria dois vetores modificados,[d(1) d]
e[d d(end)]
, e os adiciona.A versão anterior era melhor (por convolução), mas 21 bytes
fonte
(y(i)-y(i-1))+(y(i+1)-y(i))
dáy(i+1)-y(i-1)
, que é o dobro da diferença centralizada.Python com NumPy, 29 bytes
Esse é o comportamento padrão da
gradient
função NumPy . Os bytes foram contados de acordo com esse consenso .fonte
05AB1E,
20191714 bytesExplicado
Experimente online
Guardado 2 bytes graças a @Adnan
fonte
Julia, 8 bytes
Inspirado na resposta Python de @ MartinEnder . Experimente online!
fonte
Pitão, 14 bytes
Experimente online: Demonstração
Explicação:
fonte
J, 21 bytes
Semelhante à abordagem usada na solução de @ David .
Uso
Explicação
fonte
Pitão - 29 bytes
Abordagem simples estúpida.
Experimente online aqui .
fonte
JavaScript (ES6), 62 bytes
fonte
Pitão,
27242321 bytesExperimente online!
fonte