이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.
수치적으로 방정식 풀기
Symbolic Math Toolbox™는 수치 방정식 솔버 및 기호 방정식 솔버를 모두 제공합니다. 수치 솔버와 기호 솔버의 비교는 수치 솔버 또는 기호 솔버 선택하기 항목을 참조하십시오. 방정식 또는 연립방정식에는 해가 여러 개 있을 수 있습니다. 이들 해를 수치적으로 구하려면 함수 vpasolve
를 사용하십시오. 다항 방정식의 경우 vpasolve
는 모든 해를 반환합니다. 비다항 방정식의 경우 vpasolve
는 구한 해 중 첫 번째 해를 반환합니다. 다음 예제에서는 vpasolve
를 사용하여 다항 방정식과 비다항 방정식의 해를 찾고 이들 해를 임의의 정밀도까지 구하는 방법을 보여줍니다.
다항식 함수의 모든 근 구하기
vpasolve
를 사용하여 함수 의 모든 해를 구합니다.
syms f(x)
f(x) = 6*x^7-2*x^6+3*x^3-8;
sol = vpasolve(f)
sol =
이 함수는 7차 다항식이므로 vpasolve
는 예상대로 이 함수의 근 7개를 반환합니다.
탐색 범위와 시작점을 사용하여 비다항식 함수의 영점 찾기
함수 의 플롯을 보면 가 증가함에 따라 영점에서의 기울기가 증가하는 주기적인 영점들이 있습니다.
syms x h = fplot(exp(x/7)*cos(2*x),[-2 25]); grid on
vpasolve
를 사용하여 함수 f
의 영점 하나를 찾습니다. vpasolve
는 복수의 해가 존재하는 경우에도 비다항 방정식의 해 하나만 반환합니다. 반복해서 호출하더라도 vpasolve
는 동일한 결과를 반환합니다.
f = exp(x/7)*cos(2*x); for k = 1:3 vpasolve(f,x) end
ans =
ans =
ans =
복수의 해를 구하려면 옵션 'Random'
을 true
로 설정하십시오. 이렇게 하면 vpasolve
가 시작점을 임의로 선택합니다. 임의의 시작점을 선택하는 알고리즘에 대한 자세한 내용은 vpasolve
페이지의 알고리즘 항목을 참조하십시오.
for k = 1:3 vpasolve(f,x,'Random',true) end
ans =
ans =
ans =
에 가까운 영점을 찾으려면 시작점을 10
으로 설정하십시오.
vpasolve(f,x,10)
ans =
에 가까운 영점을 찾으려면 시작점을 1000
으로 설정하십시오.
vpasolve(f,x,1000)
ans =
범위 내에 있는 영점을 찾으려면 탐색 범위를 [15 25]
로 설정하십시오.
vpasolve(f,x,[15 25])
ans =
[15 25]
범위 내에 있는 복수의 영점을 찾으려는 경우, 이전에 보여진 것처럼 호출할 때마다 동일한 결과가 반환되므로 vpasolve
를 반복해서 호출할 수 없습니다. 대신, 탐색 범위를 설정하고 'Random'
을 true
로 설정하십시오.
for k = 1:3 vpasolve(f,x,[15 25],'Random',true) end
ans =
ans =
ans =
'Random'
은 시작점을 임의로 선택하므로, 연속된 호출에서 동일한 해가 구해질 수도 있습니다.
지정된 탐색 범위에서 모든 영점 찾기
지정된 허용오차 내에서 주어진 탐색 범위 내에 있는 f
의 모든 영점을 체계적으로 찾는 함수 findzeros
를 생성합니다. 이 함수는 입력값으로 주어진 탐색 범위에서부터 시작하여 vpasolve
를 호출하고 영점 하나를 찾습니다. 그런 다음 이 영점의 값을 기준으로 탐색 범위를 둘로 분할한 후 새로운 탐색 범위를 입력값으로 사용하여 자기 자신을 재귀적으로 호출함으로써 더 많은 영점을 찾습니다.
다음은 이 함수를 각 부분별로 설명한 것입니다.
입력값 3개와 출력값 1개를 갖는 함수를 선언합니다. 첫 번째 입력값은 함수이고, 두 번째 입력값은 범위이며, 선택적으로 세 번째 입력값에는 영점과 영점으로부터 생성된 상한 및 하한 사이의 오차를 지정할 수 있습니다.
function sol = findzeros(f,range,err)
선택적인 허용오차 인수를 지정하지 않으면 findzeros
는 err
을 0.001
로 설정합니다.
if nargin < 2 err = 1e-3; end
vpasolve
를 사용하여 탐색 범위 내에서 영점 하나를 찾습니다.
sol = vpasolve(f,range);
vpasolve
가 영점을 찾지 못하면 종료합니다.
if(isempty(sol)) return
vpasolve
는 영점을 찾으면 탐색 범위를 이 영점 위에 그리고 아래에 하나씩, 2개의 탐색 범위로 분할합니다.
else
lowLimit = sol-err;
highLimit = sol+err;
아래의 탐색 범위를 사용하여 findzeros
를 호출합니다. findzeros
가 영점을 반환할 경우, 값을 해 배열에 복사하고 정렬합니다.
temp = findzeros(f,[range(1) lowLimit],1); if ~isempty(temp) sol = sort([sol temp]); end
위의 탐색 범위를 사용하여 findzeros
를 호출합니다. findzeros
가 영점을 반환할 경우, 값을 해 배열에 복사하고 정렬합니다.
temp = findzeros(f,[highLimit range(2)],1); if ~isempty(temp) sol = sort([sol temp]); end return end end
전체 함수 findzeros
는 다음과 같습니다. 이 함수를 현재 폴더에 findzeros.m
으로 저장합니다.
function sol = findzeros(f,range,err) if nargin < 3 err = 1e-3; end sol = vpasolve(f,range); if(isempty(sol)) return else lowLimit = sol-err; highLimit = sol+err; temp = findzeros(f,[range(1) lowLimit],1); if ~isempty(temp) sol = sort([sol temp]); end temp = findzeros(f,[highLimit range(2)],1); if ~isempty(temp) sol = sort([sol temp]); end return end end
findzeros
를 탐색 범위 [15 25]
를 사용해 호출하여 디폴트 허용오차 내에서 이 범위 내에 있는 f(x) = exp(x/7)*cos(2*x)
의 모든 영점을 찾습니다.
syms f(x)
f(x) = exp(x/7)*cos(2*x);
sol = findzeros(f,[15 25])'
sol =
임의의 정밀도로 해 구하기
digits
를 사용하여 vpasolve
에서 반환되는 해의 정밀도를 설정합니다. 기본적으로 vpasolve
는 유효 숫자 32개 정밀도까지의 해를 반환합니다.
f = exp(x/7)*cos(2*x); vpasolve(f)
ans =
digits
를 사용하여 정밀도를 유효 숫자 64개로 늘립니다. digits
를 수정할 때는 현재 값을 복원할 수 있도록 먼저 저장해 두어야 합니다.
digitsOld = digits; digits(64) vpasolve(f)
ans =
다음으로, 해의 정밀도를 유효 숫자 16개로 변경합니다.
digits(16)
탐색 범위를 사용하여 다변량 방정식 풀기
다음과 같은 연립방정식이 있다고 가정해 보겠습니다.
및 에 대해 방정식을 플로팅하면 3개의 곡면이 2개의 점에서 교차하는 것을 볼 수 있습니다. 플롯을 더 잘 시각화하려면 view
를 사용하여 가시선을 변경하십시오.
syms x y z eqn1 = z == 10*(cos(x) + cos(y)); eqn2 = z == x+y^2-0.1*x^2*y; eqn3 = x+y-2.7 == 0; equations = [eqn1 eqn2 eqn3]; fimplicit3(equations) axis([0 2.5 0 2.5 -20 10]) title('System of Multivariate Equations') view(69,28)
vpasolve
를 사용하여 곡면이 교차하는 점을 찾습니다. 함수 vpasolve
는 구조체를 반환합니다. 해의 x
, y
, z
값에 액세스하려면 구조체의 요소를 참조하십시오.
sol = vpasolve(equations); [sol.x sol.y sol.z]
ans =
해 공간의 특정 영역을 탐색하려면 변수에 대해 탐색 범위를 지정하십시오. 범위 와 를 지정하면 vpasolve
함수는 아래 표시된 경계 내 영역을 탐색합니다.
vpasolve
를 사용하여 이 탐색 범위에 대한 해를 구합니다. 의 탐색 범위를 생략하려면 세 번째 탐색 범위를 [NaN NaN]
으로 설정하십시오.
vars = [x y z]; range = [0 1.5; 1.5 2.5; NaN NaN]; sol = vpasolve(equations,vars,range); [sol.x sol.y sol.z]
ans =
복수의 해를 구하려면 'Random'
옵션을 true
로 설정하십시오. 이렇게 하면 vpasolve
가 실행할 때마다 임의의 시작점을 사용합니다. 'Random'
옵션을 탐색 범위와 함께 사용하면 vpasolve
가 특정 탐색 범위 내에서 임의의 시작점을 사용하도록 할 수 있습니다. 'Random'
은 시작점을 임의로 선택하므로, 연속된 호출에서 동일한 해가 구해질 수도 있습니다. 두 해를 모두 찾으려면 vpasolve
를 반복적으로 호출하십시오.
clear sol range = [0 3; 0 3; NaN NaN]; for k = 1:5 temp = vpasolve(equations,vars,range,'Random',true); sol(k,1) = temp.x; sol(k,2) = temp.y; sol(k,3) = temp.z; end sol
sol =
방정식을 플로팅합니다. scatter3
을 사용하여 이 두 해를 노란색 X
마커로 표시되는 산점도 플롯으로 겹쳐 놓습니다. 플롯을 더 잘 시각화하려면 alpha
를 사용하여 두 개의 곡면을 투명하게 만들고 view
를 사용하여 가시선을 변경하십시오.
vpasolve
는 아래와 같이 방정식에 의해 형성된 곡면의 교차점에서 해를 구합니다.
clf ax = axes; h = fimplicit3(equations); h(2).FaceAlpha = 0; h(3).FaceAlpha = 0; axis([0 2.5 0 2.5 -20 10]) hold on scatter3(sol(:,1),sol(:,2),sol(:,3),600,'red','X','LineWidth',2) title('Randomly Found Solutions in Specified Search Range') cz = ax.Children; view(69,28) hold off
마지막으로, 추후 계산을 위해 digits
의 이전 값을 복원합니다.
digits(digitsOld)