2009-11-22 7 views
4

저는 파이썬으로 프로그램을 작성하고 있으며 함수의 파생어 (문자열로 표현 된 함수)를 찾아야합니다. 예를 들어파생 알고리즘을 찾는 알고리즘

  • :

2*x+3는 모든 스크립트를 사용할 수 있는가, 또는 도움이 뭔가 당신이 말해 줄 수있다 : x^2+3*x

  • 그 유도체는 무엇입니까?

  • +0

    "파생"이란 뜻입니까? – gn22

    +0

    @Gurdas Nijor : 미분은 미분 함수에서 주어진 점의 접선을 결정하기 위해 종종 사용되는 방정식입니다. http://en.wikipedia.org/wiki/Derivative – Spoike

    +0

    같은 얘기. 주어진 값 x에 대한 funtion의 미분은 탄젠트 기울기를 산출합니다. 이를 접선 함수로 변환하는 것은 간단합니다. –

    답변

    8

    sympy 잘합니다.

    +0

    링크가 끊어 졌습니까? 또는 404-ed) – user5954246

    +0

    링크가 끊어졌습니다. 아마도 [이 링크] (https://github.com/sympy/sympy/wiki/Quick-examples#calculate-a- derivivative) 또는 [이보다 자세한 내용] (http://docs.sympy.org/ 최신/튜토리얼/calculus.html # 파생 상품). –

    0

    파생 된 라이브러리가 아니라면 함수와 표현식을 구문 분석하고 처리해야하기 때문에 매우 복잡합니다.

    기계적이며 알고리즘 적으로 수행 할 수 있지만 기능을 저장하는 기본 구조가 필요하기 때문에 자체 작업을 쉽게 수행 할 수 있습니다.

    5

    당신은 (경우로 표시되는) 다항식으로 제한하는 경우, 기본적으로 세 단계가 될 것이다 :

    1. 은 X^n을
    2. 가 있음을 취할 계수의 목록에 입력 문자열을 구문 분석 계수의리스트를 생성하고 다항식을 도출하기위한 규칙에 따라 계수의 새로운리스트로 변환한다.
    3. 파생물의 계수 목록을 가져 와서 파생 다항식 함수를 설명하는 멋진 문자열을 만듭니다.

    당신이 이해 할 수 계수의 목록의 dict를 사용하여, a*x^15125 + x^2 + c 같은 다항식을 처리하지만,이 목록을 통해 반복을 할 때 좀 더주의를 요해야하는 경우.

    3

    Symbolic Differentiation은 주제와 관련하여 인상적인 소개입니다. 적어도 나와 같은 전문가는 아닙니다. 코드는 C++ btw로 작성되었습니다.

    4

    이미 제공되는 답변에서 찾고있는 것을 찾을 수 있습니다. 그러나 상징적 인 파생물을 계산하는 방법에 대한 간단한 설명을하고자합니다.

    비즈니스는 연산자 오버로딩과 파생 상품 체인 규칙을 기반으로합니다. 예를 들어 v^n의 파생어는 n*v^(n-1)dv/dx입니다. 맞습니까? 따라서 v=3*xn=3 인 경우 파생 상품은 무엇입니까? 대답은 : f(x)=(3*x)^3 경우, 그 유도체이다 : 각각의 유도체는 간단합니다, 당신은 그냥 "체인"복잡성 :

    f'(x)=3*(3*x)^2*(d/dx(3*x))=3*(3*x)^2*(3)=3^4*x^2 
    

    체인 규칙을 "체인"작업을 수행 할 수 있습니다. 또 다른 예로, u*v의 파생어는 v*du/dx+u*dv/dx입니다. 맞습니까? 복잡한 기능을 사용하는 경우 다음과 같이 연결하면됩니다.

    d/dx(x^3*sin(x)) 
    u=x^3; v=sin(x) 
    du/dx=3*x^2; dv/dx=cos(x) 
    d/dx=v*du+u*dv 
    

    자세히 알 수 있듯이 차별화는 단순한 작업 체인 일뿐입니다.

    이제 연산자 오버로딩.

    파서를 작성할 수 있다면 (파싱을 시도하십시오) 함수와 파생 상품을 평가하도록 요청할 수 있습니다! 필자는 재미있게하기 위해 (Flex/Bison을 사용하여)이 작업을 수행했으며 매우 강력합니다. 당신이 아이디어를 얻으려면 해당 연산자를 오버로드하고 체인 규칙을 재귀 적으로 적용하여 미분을 재귀 적으로 계산합니다. 따라서 "*"의 평가는 함수 값의 경우 u * v이고 미분 값의 경우 u*der(v)+v*der(u)에 해당합니다 (C++, 그것은 또한 재미 있습니다).

    여러분이 직접 파서를 작성하려고하지는 않습니다. 기존 코드를 사용하십시오 (Fortran과 C/C++ 코드의 자동 차별화를 위해 www.autodiff.org를 방문하십시오). 그러나이 물건이 어떻게 작동 하는지를 아는 것은 항상 흥미 롭습니다.

    건배,

    후안

    0
    당신은 엄격하게 제한을 표현하고 (F (X) -f (A))/(XA)와 같은 X의 접근 방식에 적합한 지 평가하는 클래스를 만드는 시도 할 수 있습니다

    에이. 그것은 한계의 꽤 정확한 값을 제공해야합니다.

    2

    더 나은 것보다 늦습니까?

    나는 구문 분석 트리를 사용하여 어떤 언어로든 항상 상징적 인 차별화를 수행했습니다. 하지만 최근에 complex numbers을 사용하는 다른 방법에 대해서도 알게되었습니다.

    구문 분석 트리 접근 방식은 당신이 좋아하는 어떤 언어로 다음과 같은 작은 리스프 코드를 변환으로 구성

    (defun diff (s x)(cond 
        ((eq s x) 1) 
        ((atom s) 0) 
        ((or (eq (car s) '+)(eq (car s) '-))(list (car s) 
        (diff (cadr s) x) 
        (diff (caddr s) x) 
        )) 
        ; ... and so on for multiplication, division, and basic functions 
    )) 
    

    하고 0의 추가 제거하므로 1 곱하여, 적절한 simplifier와 함께 다음,

    그러나 복잡한 방법은 완전히 숫자이지만 특정 마법의 품질을 갖습니다. 계산 F를 배정도로 프로그래밍하는 대신 배정 밀도로 계산하십시오. 그런 다음 변수 X에 대한 계산의 파생물이 필요하면 X의 허수 부 분을 1e-100과 같이 매우 작은 수 h로 설정하십시오. 그런 다음 계산을하고 결과를 얻으십시오 R. 이제 real (R)이 정상적으로 얻은 결과이고 imag (R)/h = dF/dX 은 매우 정확합니다!

    어떻게 작동합니까? 복소수를 곱의 경우를 보자 우리가 a에 대한 미분을 원하는 제외

    (a+bi)(c+di) = ac + i(ad+bc) - bd 
    

    지금, 상상의 부분이 모두 0입니다 가정합니다. b을 매우 작은 숫자 h으로 설정합니다. 이제 우리는 무엇을 얻습니까? 사용자가 예상하는대로

    (a+hi)(c) = ac + hci 
    

    그래서이의 실제 부분은, ac이며, h로 나눈 허수 부분은 a에 대한 ac의 유도체이다 c이다.

    동일한 종류의 추론이 모든 차별화 규칙에 적용되는 것으로 보입니다.

    0

    다른 라이브러리를 도움없이 처음부터 차별화 프로그램을 작성하려는 경우 my blog에 설명 된 대수 방정식의 미분을 계산하는 알고리즘/접근법이 유용 할 것입니다.

    관련 문제