2015-02-06 3 views
2

많은 방정식 중 Matlab에서 파생물을 가져와야합니다. 유형의 일반 파생 상품과 저를 제공 할 것입니다 일반적인 기능 :Symbolic Derivatives를 실제 기호로 변환

diff(f(x,y),x) 

또는

D([1],f(x,y)). 

내가 필요하면 사용할 수하기 위해, 실제 상징적 인 변수에 이러한 파생 상품을 변환하는 것입니다

solve 등. 지금하고있는 일은 매우 비효율적이지만, 무차별 대입 (brute force) 문자열 교체입니다. 여기에 최소한의 작업 내가 뭐하는 거지의 예입니다 : 내 실제 응용 프로그램에서

syms x y 
f(x,y) = sym('f(x,y)') 
jacobian(f) 
first_d = jacobian(f) 
strrep(char(first_d),'D([1], f)(x, y)','fx') 

, 나는 그렇게 할 수있는 똑똑한 것은 아니다 부품을 교체 루핑, 방정식이 많이 걸릴하기 위해 파생 상품을 많이 가지고있다. 누구나 좀 더 효율적인 솔루션을 발견 할 수 있습니까?

+0

몇 가지 질문이 있습니다. Matlab의 '버전'은 무엇을 사용하고 있습니까? 추상적 인 기호 함수, 즉'f (x, y)'와 같은 명시적인 정의가없는 함수의 파생물/자코비언을 사용하고 있습니까 ("일반"이 무슨 의미입니까?)? 아니면 실제로'g = x^2 + y^2 '또는'g (x, y) = x^2 + y^2;'와 같은 명시 적 함수의 파생물을 사용하고 있습니까? 어떻게 조작되는지에 관해서는 매우 다르지만, 모두 명시 적입니다). 모든 상징적 인 수학은 문자열 조작에 이릅니다. 그러나 때때로 이것을 더 빨리 수행 할 방법이 있습니다. – horchler

+0

MatLab R2014b 64bit를 사용하고 있습니다. 나는 명확한 정의가없는 함수의 파생물을 취하고 있는데, 나는이 함수를 generic이라고 부르며 지금은 더 좋은 단어가 없다. 문자열 조작에 더 빠른 방법을 제안하거나 가능한 경로에서 약간의 빛을 비춰 줄 수 있습니까? – user191919

+0

좋아요, 다음날에 이걸로 갈거야. 그 사이에이 밀접하게 관련된 질문 [http://stackoverflow.com/q/27085362/2278029]과 [this one too] (http://stackoverflow.com/q/25227675/2278029)를 확인해보십시오.). 그러나 답은 속도보다는 기본 문제를 설명하고 해결하는 데 더 중점을 둡니다. 또한 Matlab은 명시 적 정의가없는 기호 함수를 "추상"또는 "임의"함수로 참조합니다 ('help symfun' 또는'doc symfun' 참조). – horchler

답변

1

참고 : 저는 R2014b를 사용하고 있습니다. Symbolic Math 기능은 최근 버전에서 크게 변경되었으며 계속해서 변경되었습니다. 다른 버전의 사용자는 문서화되지 않은 기능에 액세스하는 데 의존하는 아래 결과를 얻기 위해 약간 다른 작업을 수행해야 할 수 있습니다. 이 때문에 성능에 대한

첫째, 단순히도 xy 상징적 변수를 정의

syms f(x,y) 

선언하기에 충분하다.

위의 내 의견에서 언급했듯이 Matlab/MuPAD의 상징적 인 수학은 모두 문자열 조작에 관한 것입니다. 이 작업을보다 직접적으로 수행하고 문제에 대한 자신의 지식을 추가하면 작업 속도가 빨라집니다. 문자열과 sym/symfun 유형 간의 불필요한 변환을 피하고자합니다.

가장 먼저 할 일은 특정 기호 수학 함수가 입력 및 출력을 처리하는 방법과 호출하는 하위 수준의 개인 함수를 조사하는 것입니다. jacobian 함수 예제의 경우 명령 창에 edit jacobian을 입력하여 편집기에서 코드를 봅니다.

res = mupadmex('symobj::jacobian',Fsym.s,v.s); 

이 낮은 수준 'symobj::jacobian' 함수를 호출하고 함수와 변수의 문자열 버전에서 통과 : 당신이 혼동 될 수 있습니다 볼 수 있지만,이 라인을 참조해야하는지 대부분. 이 직접 호출하려면 (이 또한 당신의 변수 xy 알고 가정) 할 수 있습니다

syms f(x,y) 
first_d = mupadmex('symobj::jacobian',char(f),char([x,y])) 

[ diff(f(x, y), x), diff(f(x, y), y)]를 반환합니다. 문서화되지 않은 mupadmex 함수는 문서화 된 Matlab - there are others에서 MuPAD 함수를 호출하는 직접적인 방법입니다.

위의 first_d 출력은 symfun 클래스입니다. 우리는 실제로 출력을 다시 상징적 인 함수로 변환하기를 원하지 않습니다.이를 방지하기 위해, 우리는 mupadmex에 추가 인수를 전달할 수 있습니다 지금과

syms f(x,y) 
first_d = mupadmex('symobj::jacobian',char(f),char([x,y]),0) 

문자열 matrix([[diff(f(x, y), x), diff(f(x, y), y)]])을 반환합니다. 지금 우리가 찾을 수 있습니다,이 문자열에서

3. (나는 단지. 기호 수학 도구 상자 많은 코드를 통해 탐색하는 데에서 추가 0 인수를 추가하는이 트릭을 알고) 간단한와 일부 파생 상품에 대한 다양한 패턴을 교체 변수. 일반적으로 사용하는 기능이 strrep입니다. 그것은 regexprep보다 훨씬 빠릅니다. 그러나 대체 할 패턴이 다르지만 유사한 패턴이 많은 경우이 둘 간의 성능 비교를 수행 할 수 있습니다. 그것은 아마 별도의 질문의 대상이 될 것입니다.

나는 당신의 전반적인 목표 또는 문제의 전체 범위 무엇인지 잘 모르겠지만, 여기 예를 들어, 내 마지막 코드 :

syms f(x,y) 
first_d = mupadmex('symobj::jacobian',char(f),char([x,y]),0) 
first_d = strrep(first_d(9:end-2),'diff(f(x, y), x)','fx'); 
first_d = sym(strrep(first_d,'diff(f(x, y), y)','fy')); 

이 상징적 벡터 [ fx, fy]를 반환은. symfun을 원하면 마지막 줄을 약간 수정해야합니다. 간단한 테스트에서이 기본 예제는 jacobian을 호출하고 결과를 문자열로 다시 변환하는 것보다 약 10 % 빠릅니다. 직접 대신 상징적 기능을 할당 문자열로 입력을 지정하는 경우, 결과는 원래 다음 약 30 % 더 빠르다 :

first_d = mupadmex('symobj::jacobian','f(x,y)','[x,y]',0) 
first_d = strrep(first_d(9:end-2),'diff(f(x, y), x)','fx'); 
first_d = sym(strrep(first_d,'diff(f(x, y), y)','fy')); 

this answer 같이 subs를, 사용이 편리하면서, 가장 느린 방법입니다. 문자열을 앞뒤로 변환하는 것은 많은 비용이 듭니다.