본문 바로가기

프로그램/MATLAB

【MATLAB】 벡터의 외적 문제풀이

- Chapra의 응용수치해석 연습문제 3.20번

[문제]

직교좌표 벡터는 x-, y-, z-축을 따르는 크기에 단위벡터 (i, j, k)를 곱한 것으로 생각할 수 있다. 이런 경우 두 벡터 {a} 와 {b}의 내적은 그들 벡터의 크기와 그들 벡터 사이의 각도의 cosine과의 곱에 해당한다.


외적은 또 다른 벡터 {c} = {a} X {b}를 만들며, 이 벡터는 {a}, {b}로 정의되는 면에 수직이고, 그 방향은 오른손 법칙에 의해 규정된다. 두 개의 벡터가 전달되면 θ, {c} 그리고 {c}의 크기를 반환하고, 원점은 0에 있는 세 벡터 {a}, {b}, {c}의 3차원 그래프를 그리는 M-파일 함수를 작성하라. {a}와 {b}에 대하여는 점선을, {c}에 대하여는 실선을 사용하라. 다음의 경우에 대해 이 프로그램을 검증하라.



[문제풀이]


우선 이 문제를 다 풀고보니 문제에서 함수파일을 만들라고 했네요. 저는 스크립트 파일로 만들어보고나서 발견한거라 풀이과정은 스크립트 파일로 진행하겠습니다. 양해 바랍니다.... (조금 지저분하게 풀었습니다....)

문제에서 처음에 벡터의 내적을 알려주고 있습니다. 이 개념은 각도를 구할 때 사용하게 될 것이지만 문제에서 직접 요구하는 값은 아닙니다. 그 다음으로 a와 b벡터를 주어주고 외적을 통해서 구한 벡터 c의 크기와 a,b 사이의 각도를 구하고, 최종적으로 그래프를 그려보라고 하고 있습니다. (추가로 저는 line 이라는 명령을 통해서 그래프를 그려서 실선은 사용하지 않았습니다.)

즉, 구해야하는 것은
(1) 주어진 벡터 a, b를 통해 외적한 c의 크기
(2) 그때의 a, b 사이의 각도
(3) 벡터 a, b, c의 그래프
입니다.

우선, 전체 코드입니다.


위 사진이 전체 풀이 코드입니다. 아까 말씀드렸다시피, 저는 스크립트 파일로 풀이를 진행했습니다. 그래서 4번째 줄에 나온 것처럼 벡터 a, b의 값을 입력해주었습니다. 이건 문제에서 주어진 (a)의 경우로 우선 설명부터 하겠습니다. (소문제 a~d의 결과는 가장 아래에 있습니다.)


2번째 줄에서 예의상 clear, clc를 입력합니다. 그리고 스크립트 파일이기 때문에 입력값인 a, b벡터를 입력해줍니다.


그리고 6~7번째 줄에서, 각각의 벡터의 크기를 구해줍니다. 저는 위와 같이 수학적인 방법을 이용해서 각 벡터의 크기를 구했습니다. 각요소를 제곱한 값에 제곱근을 씌워주게되면 해당 벡터의 크기(=길이 = length라고 표현함)가 됩니다. a의 크기가 곧 길이이기 때문에 a의 length인 alength 라고 변수이름을 만들었습니다.


이부분은 조금 고등수학의 기억을 떠올리셔야 합니다. 우선, 9번째 줄에서 dot(a,b)를 통해 요소곱의 합을 구해줍니다. 바로 아래↓에 help dot의 명령을 친 것을 첨부했습니다. 그렇게 변수이름을 a와 b의 dot의 결과이다라는 식으로 세 문자를 합친 abdot을 변수이름으로 사용했습니다.

그리고 11번째 줄에서 원하는 'a, b사이의 각도'를 구합니다. 이를 쎄타 (theta)로 간단하게 표현하였습니다. 위 수식은 고등수학에서 배우게 될때 살짝 응용하여 구할 수 있습니다.



> help dot 설명문


최종적으로 벡터 c의 크기를 알아내야합니다. 그래서 위와 같이 cross 명령을 통해 c벡터를 구해주고... (아래에 cross 명령 설명 참고) c의 크기인 길이를 c length라는 이름으로 구해주었습니다. 방법은 벡터 a, b의 크기를 구할 때와 동일합니다.

(참고) 벡터의 외적 cross 결과예시와 설명문



16~17에서 문제에서 원하는 값을 disp() 명령으로 출력시켜줍니다. 이렇게하면 문제에서 원하는 3가지 중, 2가지를 구하게 된 것입니다.

이때, c의 좌표를 알고 싶으면, disp('벡터 c의 좌표 : '), disp(c) 를 덧붙여주면 됩니다.


그러면 일단 16~17번의 출력 결과로 위와 같이 나옵니다. 이때, 각도는 0에서 180도 사이의 값만 나타나게 됩니다.


이제, 문제에서 또 추가적으로 원하는 그래프를 출력하는 단계입니다. 조금 지저분하게? 그래프를 그렸습니다. 다른 방법으로 미리 직선값을 주어주고 직선을 plot3로 출력하는 형태의 방법도 있지만, 저는 위와 같이 표현해보았습니다. (코딩은 자유니까요)

19번째 줄에 3D 공간을 만들어주고 각 축에 이름을 붙여주었습니다.

20~22번째 줄은 모두 a, b, c 벡터의 직선을 표현하기 위해서 작성된 코드입니다. line 명령을 통해서 선을 그었고, text 명령을 통해서 각각에 이름을 붙여주었습니다. 아래의 출력 결과를 한번 보시고 다시 보시면 잘 이해가 될 것 같습니다.


위처럼 line 함수는 line([0 x1], [0 y1], [0 z1])으로 직선을 긋는 명령입니다. 원점인 (0,0,0)에서 (x1,y1,z1)으로 직선을 긋는다는 말입니다. 좀 더 보기좋게 만들어보려고 했으나 여기까지 시도해봅니다... 양해 바랍니다....


위는 참고로 line 함수의 도움말입니다.

그리고 text 함수는 위에서 보이는 것처럼 각 직선에 이름을 붙여주기 위해서 사용되었습니다.


text 함수의 도움말은 위와 같습니다. 


문제 풀이는 위와 같이 할 수 있었습니다. 그리고 최종적으로 소문제 (a) ~ (d)에 대한 답입니다.

> 소문제


> 결과
  → 보기 편하게 grid 명령을 추가했습니다.

(a) a = [6 4 2]; b = [2 6 4]; 결과



(b) a = [3 2 -6]; b = [4 -3 1]; 결과



(c) a = [2 -2 1]; b = [4 2 -4]; 결과



(d) a = [-1 0 0]; b = [0 -1 0]; 결과



이상입니다! 감사합니다~