2012-11-28 2 views
4

나는 그런 아래와 같이 알 수없는 상수의 무리와 함께 매트릭스를 가지고 : 당신이 대각선 따라서, 대각선 값이 모두 긍정적으로 대칭을 실감 할 수 있습니다으로행렬의 모든 항목이 변수 일 때 matlab에서 행렬의 고유 값을 계산하는 방법은 무엇입니까?

a*b  -c  -d  0 
    -c  e  -a -b-d 
    -d  -a  d -e 
    0  -b-d -e  a 

. 모든 상수는 0보다 큽니다.

이 문제는 matlab의 고유 값에 대해 해결하고 싶습니다. 이 일을 어떻게 하죠? 나는 값 a, b, c, d, e를 모른다. 나는 이런 식으로하고 싶습니다 :

d = eig(@getMatrix) 

그러나 기능은 함수 핸들을 허용하지 않습니다.

+1

이 경우 상징적 인 수학 도구 상자가 필요하다고 생각합니다. 여러분이 가지고 있다면,'eig' 함수는 심볼릭 행렬을 입력으로 사용하여 잘 작동합니다. 설명서 [here] (http://www.mathworks.com.au/help/symbolic/eig.html)를 참조하십시오. –

+1

네, 이것은 상징적 인 문제이며, MATLAB은 숫자 도구입니다. 필요한 것은 컴퓨터 대수학 시스템입니다. – user57368

+1

Maxima와 같은 Computer Algebra System에서이 작업을 수행해야합니다. Matlab은 상징적 인 작업을위한 최상의 도구는 아닙니다. – carandraug

답변

3

MATLAB에는 문제가 없습니다.

>> syms a b c d e 
>> M = [a*b  -c  -d  0 
    -c  e  -a -b-d 
    -d  -a  d -e 
    0  -b-d -e  a]; 

>> eig(M) 
ans = 
a/4 + d/4 + e/4 + (a*b)/4 - ((51*a*d^3)/16 - (117*a^4*b)/16 + (27*a^3*d)/16 + (27*a*e^3)/16 + (57*b*d^3)/2 + (27*a^3*e)/16 + (27*d*e^3)/16 + (51*d^3*e)/16 + 6*((4*(2*b*d - (a*e)/4 - (a*d)/4 - (d*e)/4 - (a^2*b)/4 + (11*a^2)/8 + b^2 + c^2 + (19*d^2)/8 + (11*e^2)/8 + (3*a^2*b^2)/8 - (a*b*d)/4 - (a*b*e)/4)*((17*a*d^3)/64 - (39*a^4*b)/64 + (9*a^3*d)/64 + (9*a*e^3)/64 + (19*b*d^3)/8 + (9*a^3*e)/64 + (9*d*e^3)/64 + (17*d^3*e)/64 + (45*a^4)/256 + (285*d^4)/256 + (45*e^4)/256 - (a^2*b^2)/16 + (a^2*b^3)/8 + (3*a^2*b^4)/16 + (31*a^4*b^2)/128 + (a^4*b^3)/64 - (3*a^4*b^4)/256 + (3*a^2*c^2)/16 + (15*a^2*d^2)/128 - (9*a^2*e^2)/128 + (19*b^2*d^2)/16 - (b^2*e^2)/16 + (3*c^2*d^2)/16 + (15*c^2*e^2)/16 + 
... 

(a*b*c^2*e)/8 + (3*a*b*d*e^2)/64 + (11*a*b*d^2*e)/64 + (a*b^2*d*e)/4 - (33*a^2*b*d*e)/32 - (5*a^2*b^2*d*e)/64 + (a*b*d*e)/4 + (a*c*d*e)/2 - 2*b*c*d*e) - 256*((17*a*d^3)/64 - (39*a^4*b)/64 + (9*a^3*d)/64 + (9*a*e^3)/64 + (19*b*d^3)/8 + (9*a^3*e)/64 + (9*d*e^3)/64 + (17*d^3*e)/64 + (45*a^4)/256 + (285*d^4)/256 + (45*e^4)/256 - (a^2*b^2)/16 + (a^2*b^3)/8 + (3*a^2*b^4)/16 + (31*a^4*b^2)/128 + (a^4*b^3)/64 - (3*a^4*b^4)/256 + (3*a^2*c^2)/16 + (15*a^2*d^2)/128 - (9*a^2*e^2)/128 + (19*b^2*d^2)/16 - (b^2*e^2)/16 + (3*c^2*d^2)/16 + (15*c^2*e^2)/16 + (15*d^2*e^2)/1... 

Output truncated. Text exceeds maximum line length of 25,000 characters for Command Window display. 

내가 많이 삭제했습니다. 틀림없이 그 오히려 지저분하고 길지만, 당신은 정말로 더 잘 할 수 있냐?

편집 : 이러한 긴 확장 수식은 계산의 정확도 측면에서 위험 할 수 있습니다. 필자는 사람들이 맹목적으로 표현의 혼란을 사용하여 Fortran 또는 MATLAB에서이를 평가하는 것을 보았습니다. 그들은 그것이 또한 "상징적"이기 때문에 그것을 생각합니다. 이것은 수치 계산이 완료되었을 때의 총 오류입니다.

엄청난 양수 및 음수 항이 서로 거의 상쇄되어 부동 소수점 연산의 제한된 동적 범위로 인해 본질적으로 가치가없는 작은 결과를 남기는 경우가 많습니다. 알아라. 최소한 동일한 표현식으로 수행 된 단일 및 이중 정밀도 계산을 비교하십시오. 상당한 양만큼 차이가 나면 확장 정밀 버전을 사용해 복식에 문제가 없는지 확인하십시오. 그러한 표현을 테스트하지 않고 광범위하게 검증했다면, 그것을 신뢰하지 마십시오.

관련 문제