2014-10-31 2 views
1

나는 좀 더 복잡한 맥락에서 일부 방정식을 풀기 위해 노력해 왔습니다. 그러나 나는 다음의 간단한 예를 통해 나의 질문을 설명하고자한다.Matlab에서 조각 별 함수로 방정식을 푸는 방법은 무엇입니까?

은 다음 두 가지의 기능을 고려

function y=f1(x) 
    y=1-x; 
end 

function y=f2(x) 
    if x<0 
     y=0; 
    else 
     y=x; 
    end 
end 

I는 다음 식 해결하고자 : F1을 (X) = F2 (X). 내가 사용하는 코드는 다음과 같습니다

syms x; 
x=solve(f1(x)-f2(x)); 

그리고 나는 다음과 같은 오류 있어요 : 나는 x가 기호 변수이므로 나는 구분에 0x을 비교할 수 있기 때문에 오류가 알고

??? Error using ==> sym.sym>notimplemented at 2621 
Function 'lt' is not implemented for MuPAD symbolic objects. 

Error in ==> sym.sym>sym.lt at 812 
      notimplemented('lt'); 

Error in ==> f2 at 3 
if x<0 

을 기능 f2(x).

문제를 해결하고 방정식을 풀 수있는 방법이 있습니까?

+0

Matlab의 '버전'은 무엇입니까? – horchler

+0

기호 관계를 작성하기 위해 "<"를 사용하는 기능이 릴리스 R2012a에서 소개되었습니다. – Alex

+0

이 문제를 해결할 수있는 방법이 있지만 Symbolic 도구 상자의 변경 사항이 많아서 솔루션이 버전에 크게 의존 할 수 있습니다. – horchler

답변

1

먼저 기호 수학이 문제 해결에 적합한 해결책인지 확인하십시오. 많은 경우에 그렇지 않습니다. 많은 사람들 중에 fzerofsolve을보십시오. 예를 들어 수식을 원하거나 정밀도를 보장해야하는 경우에만 기호 방법이 필요합니다.

syms x; 
s1 = solve(1-x^2,x) % For x >= 0 
s2 = solve(1-x,x) % For x < 0 

그럼 당신은 수동으로 검사 할 수 있습니다 또는 수치 적으로 확인하기 위해 출력을 비교 : matlab에 같은 이전 버전에서

, 별도의 연속 함수로 구분 기능을 파괴하고 개별적으로 해결 할 수 있습니다 솔루션의 일부 또는 전부가 선택한 정권에 대한 유효한 경우 - 이런 걸 :

s = [s1(double(s1) >= 0);s2(double(s2) < 0)] 

당신은 훨씬 이전 버전에서 사용할 수있는 heaviside 기능을 활용할 수 있습니다.

syms x; 
f1 = 1-x; 
f2 = x*heaviside(x); 
s = solve(f1-f2,x) 

Heaviside function 제로에서 0.5 - 이것은 그것에게 적절한 수학적 속성을 제공합니다. 0이 아닌 값을 비교하도록이 값을 이동할 수 있습니다. 이것은 표준 기술입니다.

Matlab R2012a +에서는 일반 관계 연산자 외에 assumptions을 사용할 수 있습니다. x는 "항상"한 쪽 또는 제로의 다른 한편으로는 분명하지 않다, 귀하의 경우에는

isAlways(sym(x<0)) 

,하지만 @ AlexB의 코멘트에 추가하려면, 당신은 isAlways를 사용하기 전에 기호에 논리 비교의 출력을 변환해야합니다 다른 경우에 유용 할 수 있습니다.

Matlab의 상징적 인 수학에 깊이 관여하려면 piecewise functions using MuPAD을 만들 수 있습니다. Matlab에서 액세스 할 수 있습니다 (예 : my example here 참조).

관련 문제