2010-05-25 4 views
4

파생 계산기를 만드는 데 관심이 있습니다. 나는 문제를 해결하는 데 두뇌를 쌓아 왔지만, 나는 올바른 해결책을 찾지 못했습니다. 시작하는 방법을 알려주시겠습니까? 감사합니다파생 계산기

죄송합니다! 나는 분명히 상징적 인 차별화를 원한다.

의 당신이 함수 f (X)가 있다고 가정 해 봅시다 = X^3 + 2 배^2 + X

나는이 경우 F에서 파생를 표시 할 '(X) = 3 배^2 + 4 배를 + 1

아이폰 용 objective-c에서 구현하고 싶습니다.

+2

정확히 무엇을하려고합니까? 상징적 인 차별화? – SLaks

+3

금융 또는 수학? –

+0

숫자 차별화는 간단합니다. 기호가 분명히 까다 롭지 만 출력을 단순화 할 필요가 없다면 매우 쉽게 수행 할 수 있습니다. –

답변

6

함수의 정확한 파생어를 찾으려고한다고 가정합니다. (기호 차별화)

수학적 표현식을 구문 분석하고 개별 작업을 트리 구조로 함수에 저장해야합니다. 예를 들어

, x + sin²(x)는 식 xsin(x)2^ (지수) 연산에 적용하는 + 동작으로 저장 될 것이다.

그런 다음 각 노드에 차별화 규칙을 적용하여 트리를 재귀 적으로 구분할 수 있습니다. 예를 들어, + 노드는 u' + v'이되고 * 노드는 uv' + vu'이됩니다.

4

미적분을 기억해야합니다. 기본적으로 두 가지가 필요합니다. 기본 함수의 파생 테이블 및 복합 표현식을 유도하는 방법에 대한 규칙 (예 : d(f + g)/dx = df/dx + dg/dx). 그런 다음 표현 파서를 사용하고 재귀 적으로 다른 트리로 이동하십시오. (http://www.sosmath.com/tables/derivative/derivative.html)

1

파생 상품을 계산 하시겠습니까? 사인, 코사인 및 접선과 같은 삼각 함수를 허용하면 테이블에 저장하는 것이 가장 좋지만 다항식과 같은 다른 함수는 훨씬 쉽게 수행 할 수 있습니다. 함수에 여러 입력을 허용하고 있습니까? f (x)가 아닌 f (x, y)?

단일 변수의 다항식은 제 제안이며 삼각 함수, 로그 함수, 지수 함수 및 기타 고급 함수를 추가하여 파생하기 어렵습니다.

+0

하나의 변수 f (x). – burki

4

는, 렉스/Yacc에 또는 동등한 가장 쉬운 방법은, 다음 "파생"재귀 쓰기 (, 당신은 거의 모든 언어에 해당하는 일을 할 수있는이 보통 리스프 상황에서 촬영하는 경우에도)을 S-expression로 문자열을 구문 분석 기능 . OCaml의 틱 방언이 같은에서 :

let rec derive var = function 
    | Const(_) -> Const(0) 
    | Var(x) -> if x = var then Const(1) else Deriv(Var(x), Var(var)) 
    | Add(x, y) -> Add(derive var x, derive var y) 
    | Mul(a, b) -> Add(Mul(a, derive var b), Mul(derive var a, b)) 
    ... 

(당신은 OCaml의 구문을 모르는 경우 - derive가 첫 번째 매개 변수와 변수 이름이 파라미터 재귀 함수이고, 두 번째는 연속 선에 mathched되고 예를 들어,이 매개 변수가 Add(x, y) 형식의 구조 인 경우 구조체 Add은 두 개의 필드에서 파생되어 x의 값을 가지며 도출 된 y을 반환하고 다른 경우에는 derive이 매개 변수로받을 수있는 것과 유사하게 첫 번째로는 _ 패턴은 "무엇이든 일치"를 의미 함)

Afte r이 결과 표현을 정돈하기위한 정리 기능이있을 수 있습니다 (분수 감소 등).)하지만 복잡해지며 파생 자체에 필요하지 않습니다. 즉, 파생되지 않은 항목은 여전히 ​​정답입니다. 의 S-EXP 당신의 변환이 완료

+0

F #이 너무 아름다워. – erikkallen

2

SLaks 이미 상징적 인 차별화를위한 절차를 설명 재귀 함수 다시 문자열 형태로 결과의-특급을 재 변환. 몇 가지를 추가하고 싶습니다.

  • 상징적 인 수학은 대부분 구문 분석 및 트리 변형입니다. ANTLR은 둘 다위한 훌륭한 도구입니다. 이 위대한 책을 시작하는 것이 좋습니다. Language implementation patterns
  • 원하는대로 할 수있는 오픈 소스 프로그램이 있습니다 (예 : Maxima). 그러한 프로그램을 해부하는 것도 흥미로울 것입니다 (그러나 처음에 직접 작성하려고하면 어떤 일이 벌어지는 지 이해하기가 더 쉽습니다).
  • 아마 출력의 단순화도 필요합니다. 예를 들어 기본 파생 규칙을 2 * x 표현식에 적용하면 2 + 0*x이됩니다. 이것은 또한 트리 처리에 의해 수행 될 수있다 (그래서 [...]0-0 * [...][...] + 0 변환에 의해 예)
1
+, 일반 함수 (위에

상징적 분화 -, *, /,^죄, COS 등 .) 함수 나 그 미분이 정의되지 않은 영역을 무시하는 것은 쉽습니다. 반 직관적으로 어렵다는 것은 나중에 결과를 단순화하는 것입니다.

차별화를 수행하려면 작업을 트리 (또는 폴란드어 표기법)로 저장하고 각 기본 작업의 파생 테이블을 만드십시오. 그런 다음 체인 규칙과 기본 파생물을 반복하여 적용하고 상수의 파생 값을 0으로 설정합니다. 이렇게하면 구현이 빠르고 쉽습니다.