Numpy를 사용하여 파생물을 어떻게 계산합니까?
함수의 도함수를 계산하는 방법은 다음과 같습니다.
y = x2+1
용사를 numpy
?
예를 들어, 저는 x = 5에서 파생물의 값을 원합니다.
네 가지 옵션이 있습니다.
유한한 차이는 외부 도구가 필요하지 않지만 숫자 오류가 발생하기 쉬우며 다변량 상황에 있는 경우 시간이 걸릴 수 있습니다.
문제가 충분히 간단한 경우 기호적 구분이 이상적입니다.요즘 상징적인 방법들이 상당히 강해지고 있습니다.SymPy는 NumPy와 잘 통합되는 훌륭한 프로젝트입니다.오토랩 또는 램디파이 기능을 보거나 유사한 질문에 대한 젠슨의 블로그 게시물을 확인하십시오.
자동 파생 모델은 매우 멋지고 숫자 오류가 발생하지 않지만 몇 가지 추가 라이브러리가 필요합니다(이것을 위한 구글, 몇 가지 좋은 옵션이 있습니다).이것은 가장 강력하지만 가장 정교하고 어려운 선택입니다.당신이 당신 자신을 제한하는 것이 괜찮으시다면.numpy
그러면 테아노가 좋은 선택일 수도 있습니다.
다음은 SymPy를 사용한 예입니다.
In [1]: from sympy import *
In [2]: import numpy as np
In [3]: x = Symbol('x')
In [4]: y = x**2 + 1
In [5]: yprime = y.diff(x)
In [6]: yprime
Out[6]: 2⋅x
In [7]: f = lambdify(x, yprime, 'numpy')
In [8]: f(np.ones(5))
Out[8]: [ 2. 2. 2. 2. 2.]
제가 생각할 수 있는 가장 간단한 방법은 numpy의 그라데이션 함수를 사용하는 것입니다.
x = numpy.linspace(0,10,1000)
dx = x[1]-x[0]
y = x**2 + 1
dydx = numpy.gradient(y, dx)
이런 식으로 dydx는 중심 차분을 사용하여 계산되며 순방향 차분을 사용하고 (n-1) 크기 벡터를 반환하는 numpy.diff와 달리 y와 동일한 길이를 갖습니다.
NumPy는 파생상품을 계산하기 위한 일반적인 기능을 제공하지 않습니다.그러나 다항식의 단순한 특수한 경우를 처리할 수 있습니다.
>>> p = numpy.poly1d([1, 0, 1])
>>> print p
2
1 x + 1
>>> q = p.deriv()
>>> print q
2 x
>>> q(5)
10
미분을 수치적으로 계산하려면 대부분의 응용 프로그램에 대해 중앙 차분 계수를 사용하지 않아도 됩니다.단일 점에서의 미분에 대한 공식은 다음과 같습니다.
x = 5.0
eps = numpy.sqrt(numpy.finfo(float).eps) * (1.0 + x)
print (p(x + eps) - p(x - eps)) / (2.0 * eps * x)
이 x
배열이 "abscissae"인 ""의.y
값의 경의 다음을사함미용근분계있수다습니산할사로 미분의 할 수 .
numpy.diff(y) / numpy.diff(x)
를 하고 싶다고 합니다.numpy
엄밀한 정의를 사용하여 언제든지 함수의 도함수를 수치적으로 계산할 수 있습니다.
def d_fun(x):
h = 1e-5 #in theory h is an infinitesimal
return (fun(x+h)-fun(x))/h
대칭 도함수를 사용하여 더 나은 결과를 얻을 수도 있습니다.
def d_fun(x):
h = 1e-5
return (fun(x+h)-fun(x-h))/(2*h)
예를 들어 전체 코드는 다음과 같습니다.
def fun(x):
return x**2 + 1
def d_fun(x):
h = 1e-5
return (fun(x+h)-fun(x-h))/(2*h)
이제 다음에서 수치적으로 도함수를 찾을 수 있습니다.x=5
:
In [1]: d_fun(5)
Out[1]: 9.999999999621423
다른 방법을 써서...
scipy.interpolate
많은 보간 스플라인이 파생물을 제공할 수 있습니다그래서, 선형 스플라인을 사용하는 것은k=1
), 스플라인의 도함수(사용)derivative()
method)는 정방향 차이와 같아야 합니다.완전히 확실한 것은 아니지만, 큐빅 스플라인 도함수를 사용하는 것은 큐빅 스플라인을 구성하기 전과 후의 값을 사용하기 때문에 중심 차이 도함수와 비슷할 것이라고 생각합니다.
from scipy.interpolate import InterpolatedUnivariateSpline
# Get a function that evaluates the linear spline at any x
f = InterpolatedUnivariateSpline(x, y, k=1)
# Get a function that evaluates the derivative of the linear spline at any x
dfdx = f.derivative()
# Evaluate the derivative dydx at each x location...
dydx = dfdx(x)
사용할 수 있습니다.scipy
그것은 꽤 직접적입니다.
scipy.misc.derivative(func, x0, dx=1.0, n=1, args=(), order=3)
한 점에서 함수의 n번째 도함수를 찾습니다.
당신의 경우:
from scipy.misc import derivative
def f(x):
return x**2 + 1
derivative(f, 5, dx=1e-6)
# 10.00000000139778
기울기를 계산하기 위해 기계 학습 커뮤니티는 Autograd를 사용합니다.
설치 방법:
pip install autograd
다음은 예입니다.
import autograd.numpy as np
from autograd import grad
def fct(x):
y = x**2+1
return y
grad_fct = grad(fct)
print(grad_fct(1.0))
또한 다변량 함수와 같은 복잡한 함수의 기울기를 계산할 수 있습니다.
필요한 정밀도 수준에 따라 간단한 차별화 증명을 사용하여 직접 측정할 수 있습니다.
>>> (((5 + 0.1) ** 2 + 1) - ((5) ** 2 + 1)) / 0.1
10.09999999999998
>>> (((5 + 0.01) ** 2 + 1) - ((5) ** 2 + 1)) / 0.01
10.009999999999764
>>> (((5 + 0.0000000001) ** 2 + 1) - ((5) ** 2 + 1)) / 0.0000000001
10.00000082740371
기울기의 한계를 실제로 잡을 수는 없지만, 재미있습니다.하지만 조심해야 해 왜냐면
>>> (((5+0.0000000000000001)**2+1)-((5)**2+1))/0.0000000000000001
0.0
수치 함수의 도함수를 계산하려면 다음과 같이 2차 유한 차분 체계를 사용합니다. https://youtu.be/5QnToSn_oxk?t=1804
dx = 0.01
x = np.arange(-4, 4+dx, dx)
y = np.sin(x)
n = np.size(x)
yp = np.zeros(n)
yp[0] = (-3*y[0] + 4*y[1] - y[2]) / (2*dx)
yp[n-1] = (3 * y[n-1] - 4*y[n-2] + y[n-3]) / (2*dx)
for j in range(1,n-1):
yp[j] = (y[j+1] - y[j-1]) / (2*dx)
또는 더 높은 주문을 사용하려면 https://youtu.be/5QnToSn_oxk?t=1374 를 사용하십시오.
Nathan Kutz의 "Begining Scientific Computing" 과정 강의에서 얻을 수 있는 모든 것입니다.
언급URL : https://stackoverflow.com/questions/9876290/how-do-i-compute-derivative-using-numpy
'programing' 카테고리의 다른 글
정의되지 않은 검사 후에도 유형 스크립트 "error TS2532: 개체가 '정의되지 않음'일 수 있음" (0) | 2023.07.19 |
---|---|
유형 스크립트 어설션과 같은 유형 가드 (0) | 2023.07.19 |
파이썬에서 문자열을 타이틀 케이스로 변환하는 방법은 무엇입니까? (0) | 2023.07.19 |
예외를 발생시키는 람다 식 정의 (0) | 2023.07.19 |
Spring MockMvc 웹 응용 프로그램 컨텍스트에 모의 주입 (0) | 2023.07.19 |