2014-12-14 4 views
1

저는 MATLAB을 통해 해결하고자하는 3 가지 방정식의 시스템을 가지고 있습니다. 그리고 나는 그것을 수행하는 방법에 대해 약간 혼란스러워합니다.MATLAB을 사용하여 행렬 방정식 시스템을 해결 하시겠습니까?

난 세 방정식 가지고

A = R*P1 
B = R*P2 
C = R*P3 

A, B, CP1, P2, 그리고 R3x3 매트릭스 중에 P33x1 행렬이다. R은 세 가지 방정식 모두에서 동일합니다.

R을 찾고 A, B, CP's이 필요합니다.

fsolve을 사용하고 싶었지만 변수가 행렬 일 때 fsolve이 작동하지 않는 것 같습니다. 사용을 권장하는 대체 방법은 무엇입니까?

P1 = [1;1;1]; 
P2 = [2;3;4]; 
P3 = [5;4;3]; 

R = [2 4 5; 1 5 4; 1 2 3]; 

가 어떤 것을 의미 할 것입니다 :

그냥 작업을 몇 가지 숫자를 구성하는

A = [11;10;6]; 
B = [36;33;20]; 
C = [41;37;22]; 

답변

4

, 왜 당신은 단순히 사용하지 않는 fsolve 기능을 ldivide 또는 \ 연산자가 필요합니까? 이렇게하면 선형 시스템을 직접 해결할 수 있습니다. 다음과 같은 관계가 있음을 알 수 있습니다.

R*P1 = A 
R*P2 = B 
R*P3 = C 

각 행렬 수식에 3 가지 제약 조건이 있음을 알 수 있습니다. 여러분이 할 수있는 것은 모든 행렬 방정식을 함께 캡슐화하여 9 개의 제약 조건을 생성하는 하나의 시스템을 생성하는 것입니다. 따라서 행렬 R의 계수를 다른 식으로 풀 수 있도록 이것을 재구성해야합니다. 이렇게하려면 행렬 R을 9 요소 벡터가되도록 바꿔야합니다. 즉, 우리는 다음과 같이 시스템을 재구성 할 수 있습니다

[P1 0 0 0 0 0 0] [R1] [  ] 
[0 0 0 P1 0 0 0] [R2] [ A ] 
[0 0 0 0 0 0 P1] [R3] [  ] 
[P2 0 0 0 0 0 0] [R4] [  ] 
[0 0 0 P2 0 0 0] * [R5] = [ B ] 
[0 0 0 0 0 0 P2] [R6] [  ]  
[P3 0 0 0 0 0 0] [R7] [  ] 
[0 0 0 P3 0 0 0] [R8] [ C ] 
[0 0 0 0 0 0 P3] [R9] [  ] 

    P   * R = D 

당신은 우리는 우리가 해결할 수 있도록 벡터로 재편되는 P라는 9 X 9 매트릭스, 우리의 행렬 R있는 것을 볼 수 있습니다 계수 및 DA,B,C이 하나의 벡터로 함께 연결됩니다. R1 ~ R9은 왼쪽에서 오른쪽으로 그리고 위에서 아래로 읽는 행렬 R의 계수입니다.

R = P^{-1}*D 

같은, 단순히과 같이 매트릭스 P 및 벡터 D를 구성 :

따라서, 귀하의 매트릭스에 계수를 찾으려면 않는

P = [P1.' zeros(1,6); zeros(1,3) P1.' zeros(1,3); zeros(1,6) P1.'; ... 
P2.' zeros(1,6); zeros(1,3) P2.' zeros(1,3); zeros(1,6) P2.'; ... 
P3.' zeros(1,6); zeros(1,3) P3.' zeros(1,3); zeros(1,6) P3.']; 

D = [A; B; C]; 

을 이제 단순히에 대한 해결 R을 찾아 3x3 매트릭스로 다시 바꿉니다. 따라서 :

R = P \ D; 
R = reshape(R, 3, 3).'; 

reshape는 3 × 3 행렬로 우리의 벡터를 회전하지만 - 중요한 형식의 행렬을 구성한다, 그래서 당신은 당신이 reshape를 호출 한 후 결과를 전치 할 필요가있다. 당신의 본보기로, 이것은 우리가 얻는 것입니다. 수행

P1 = [1;1;1]; 
P2 = [2;3;4]; 
P3 = [5;4;3]; 

A = [11;10;6]; 
B = [36;33;20]; 
C = [41;37;22]; 

P = [P1.' zeros(1,6); zeros(1,3) P1.' zeros(1,3); zeros(1,6) P1.'; ... 
P2.' zeros(1,6); zeros(1,3) P2.' zeros(1,3); zeros(1,6) P2.'; ... 
P3.' zeros(1,6); zeros(1,3) P3.' zeros(1,3); zeros(1,6) P3.']; 

D = [A; B; C]; 

R = P \ D; 
R = reshape(R, 3, 3).'; 

R이 올바른지 확인하려면 :

A1 = R*P1; 
B1 = R*P2; 
C1 = R*P3; 

우리는 각각 얻을 :

A1 = 

    11 
    10 
    6 

B1 = 

    36 
    33 
    20 

C1 = 

    41 
    37 
    22 
그때 내가 전에에서했던 코드를 사용 P1, P2, P3, A, B, C을 구성

이것은 예제와 일치합니다. 그러나 R이 상태가 좋지 않다는 경고가 표시 될 수 있습니다. 이는 고유 한 역변환을 올바르게 찾을 수있는 제약 조건이 충분하지 않기 때문입니다. 고유 한 역변환을 얻기 위해 더 많은 제약 조건을 추가해야 할 수도 있지만 그렇지 못할 경우에는주의해서 사용해야합니다.

+1

이것은 작동합니다! 도와 줘서 고마워! 나는 선형 대수학에 너무 능숙하지 않다. 이런 모습을보고 네가 본 것을 볼 수있을 때까지 나는 기다릴 수 없다. – TheTreeMan

+0

@ TheTreeMan 내 기쁨! 선형 대수학 공식과 혼동하지 않기를 바랍니다. 그걸 얼마나 잘 알았는지 몰랐어요. 행운을 빕니다! – rayryeng

0

당신이 solve 기능의 내부의 행렬을 평평하게하려고 노력 해요? 계수를 수집하는 MATLAB에는 collect 함수가 있지만 합계가 아닌 행 행렬을 제공하는지 확인해야합니다. (아마도) (행 행렬을 요약 - 그것은 또한 용어처럼 결합하는 경우)

같은 뭔가 :

[x,y,x] = solve(sum(R*P1)==A, sum(R*P2)==B, sum(R*P3)==C, x,y,z) 

또는 A, B, C, P1, P2, P3 모든 수치 경우

관련 문제