solve 함수를 사용하여 방정식을 풀기 위한 접근 방식 선택
Symbolic Math Toolbox™는 수학 방정식이나 연립방정식을 풀기 위한 solve 함수를 제공합니다. solve 함수는 유일한 해를 반환하거나, 해를 반환하지 않거나, 미지수에 대한 조건과 파라미터화를 포함하는 무한히 많은 해를 반환할 수 있습니다. 그러나 유일한 해가 존재하는 경우에도 툴박스는 해당 해를 명확하게 기호 형식으로 표현하지 못할 수도 있습니다. 이러한 이유로 방정식을 풀기 위해 여러 접근 방식 중에서 선택할 수 있습니다.
파라미터와 해에 대한 조건을 포함한 완전한 해 집합 구하기
임의의 정밀도로 수치 해 구하기
기호 함수의 정의를 포함하는 방정식에 대한 해 구하기
다른 형태의 해 구하기
이 예제에서 이러한 접근 방식에 대해 설명합니다. 연립상미분방정식을 풀고 싶다면 dsolve를 대신 사용하십시오.
방정식을 풀기 위한 접근 방식
사용하는 경우 | 접근 방식 | 추가 정보 |
|---|---|---|
파리미터와 해에 대한 조건을 포함한 완전한 해 집합을 구하는 경우. 풀어야 할 연립방정식은 모순이 없거나(consistent) 모순이 있을(inconsistent) 수 있습니다. |
| |
|
| |
기호 함수의 정의를 포함하는 연립방정식을 푸는 경우 | 연립방정식 밖에서 기호 함수를 정의합니다. 연립방정식을 별도로 풀고 필요한 대입을 적용하여 함수의 수식을 다시 작성합니다. | |
다른 형태의 해를 구하는 경우 | 다음과 같이 이름-값 인수와 함께 • 실수 해만 반환하려면 • 파라미터와 해의 조건을 포함한 부등식을 풀려면 • 미지수에 대한 가정을 무시하려면 • 유효하다고 가정되는 수학 규칙을 적용하려면 • 차수가 5 미만인 다항식의 해석적 해를 찾으려면 • 가능한 여러 해 중 하나의 해를 반환하려면 | 예제는 다음을 참조하십시오. • 부등식 풀기 • 수학 규칙 적용 |
solve 함수는 방정식에 대한 기호 해를 찾으려고 시도합니다. ReturnConditions를 true로 지정하는 것이 가장 포괄적인 접근 방식이기는 하지만, 일반적으로 가장 느립니다. 계산 속도를 높이려면 solve를 사용하기 전에 일부 변수에 주어진 값을 대입하여 방정식의 기호 변수 수를 줄이십시오. 속도를 더욱 향상시키고자 하고 파라미터화가 없는 해에만 관심이 있다면, 낮은 정밀도 설정을 적용한 수치 솔버 vpasolve를 사용하는 것을 고려해 보십시오. Symbolic Math Toolbox 없이 다른 수치 솔버를 사용하려면 matlabFunction을 사용하여 기호 표현식을 MATLAB® 함수로 변환할 수 있습니다. 이 변환을 사용하면 결과 함수를 다른 MATLAB 제품의 솔버(예: Optimization Toolbox™의 fsolve (Optimization Toolbox))와 함께 사용할 수 있습니다.
해에 파라미터 및 조건 포함하기
연립방정식은 특정 수의 방정식과 미지수로 구성됩니다. 수학에서 이러한 연립방정식은 다음과 같이 분류될 수 있습니다.
과결정 시스템 - 미지수보다 방정식이 많음
부족 결정 시스템 - 미지수보다 방정식이 적음
정확하게 결정된 시스템 - 미지수와 방정식의 개수가 동일함
그러나 이러한 시스템에 대한 해의 존재는 주로 방정식과 미지수의 수에 의해 결정되지 않습니다. 미지수에 대한 값 세트 중 적어도 하나가 모든 방정식을 만족하는 경우 해당 시스템은 모순이 없는(consistent) 것으로 간주됩니다. 이 경우 해는 특정 값으로 구성될 수도 있고 자유 파라미터를 포함할 수도 있습니다. 이와 대조적으로, 모든 방정식을 만족시키는 미지수 값 세트가 없는 경우 시스템은 모순이 있는(inconsistent) 것으로 간주됩니다. [1]
모순 없는 연립방정식과 모순 있는 연립방정식
모순이 없는 연립방정식의 해에는 자유 파라미터가 포함될 수 있습니다. 자유 파라미터를 포함하는 해를 찾으려면 solve를 사용할 때 ReturnConditions 이름-값 인수를 true로 지정하십시오.
예를 들어, 세 개의 미지수를 갖는 두 개의 방정식으로 구성된 다음 시스템을 살펴보겠습니다. 이러한 부족 결정 시스템은 세 가지 미지수에 대한 해의 집합이 존재하기 때문에 모순이 없습니다. 해의 집합은 z = 1(첫 번째 방정식에서 두 번째 방정식을 빼면 알 수 있음)이고, x + y = 2를 만족시키는 x와 y의 모든 값입니다.
syms x y z eq1 = x + y + z == 3; eq2 = x + y + 2*z == 4; eqns = [eq1; eq2]
eqns =
solve를 사용하여 이 시스템을 풀어봅니다. 솔버는 해의 집합 중 하나의 해를 반환합니다. 여기서 솔버는 x + y = 2를 만족하는 해 z = 1, x = 2, y = 0을 선택합니다.
sols = solve(eqns,[x y z])
sols = struct with fields:
x: 2
y: 0
z: 1
자유 파라미터를 포함한 완전한 해 집합을 찾으려면 ReturnConditions를 true로 지정합니다. 여기에서 솔버는 자유 파라미터로 y = z1를 반환하며 이는 아무 복소수 값이나 취할 수 있습니다.
sols = solve(eqns,[x y z],ReturnConditions=true)
sols = struct with fields:
x: 2 - z1
y: z1
z: 1
parameters: z1
conditions: symtrue
다음과 같이 두 개의 미지수를 갖는 연립방정식이 있다고 가정해 보겠습니다. 이러한 과결정 시스템은 마지막 방정식이 다른 두 방정식과 상충(처음 두 방정식을 더하면 알 수 있음)되기 때문에 모순이 있습니다.
syms x y eq1 = x + y == 3; eq2 = x + 2*y == 7; eq3 = 2*x + 3*y == 11; eqns = [eq1; eq2; eq3]
eqns =
solve 함수는 이 시스템에 대해 빈 해를 반환합니다.
sols = solve(eqns)
sols = struct with fields:
x: [0×1 sym]
y: [0×1 sym]
ReturnConditions를 true로 지정하더라도 solve는 빈 해를 반환합니다. 이러한 결과는 시스템에 모순이 있고 해가 없다는 것을 확인시켜 줍니다.
sols = solve(eqns,[x y],ReturnConditions=true)
sols = struct with fields:
x: [0×1 sym]
y: [0×1 sym]
parameters: [1×0 sym]
conditions: [0×1 sym]
비교를 위해 세 개의 방정식 중 두 개만 풀면 해가 나오는데, 이는 두 방정식 사이에 모순이 없기 때문입니다.
sols = solve([eq1; eq3])
sols = struct with fields:
x: -2
y: 5
다른 변수 순서를 지정할 때 다른 파라미터화
연립방정식의 해에 자유 파라미터가 포함되는 경우, solve를 사용하여 풀이할 변수의 순서를 다르게 지정하면 파라미터화할 미지수가 달라집니다.
예를 들어, 세 번째 방정식이 두 번째 방정식에서 첫 번째 방정식을 뺀 결과인 연립방정식을 정의합니다.
syms x y z eq1 = z == 2*x + y; eq2 = 2*z == 3*x - y; eq3 = z == x - 2*y; eqns = [eq1; eq2; eq3];
x 및 y에 대해 방정식을 풉니다. 솔버는 다른 미지수 z로 정의된 해를 반환합니다.
sols = solve(eqns,x,y)
sols = struct with fields:
x: (3*z)/5
y: -z/5
다음으로, y 및 z에 대해 방정식을 풉니다. 솔버는 다른 미지수 x로 정의된 해를 반환합니다.
sols = solve(eqns,y,z)
sols = struct with fields:
y: -x/3
z: (5*x)/3
이제 x, y, z에 대해 방정식을 풀면 solve는 시스템을 만족하는 해 집합에서 하나의 해를 반환합니다. solve는 x = 0, y = 0, z = 0을 반환합니다.
sols = solve(eqns,x,y,z)
sols = struct with fields:
x: 0
y: 0
z: 0
시스템을 만족하는 완전한 해 집합을 찾으려면 ReturnConditions를 true로 지정합니다. 여기서는 미지수 하나를 파라미터화해야 하며, 솔버는 두 번째 입력 인수에 지정한 마지막 변수를 파라미터화하도록 선택합니다. 솔버는 미지수 z를 파라미터화며, 이 변수는 아무 복소수 값이나 가질 수 있습니다.
sols = solve(eqns,[x y z],ReturnConditions=true)
sols = struct with fields:
x: (3*z1)/5
y: -z1/5
z: z1
parameters: z1
conditions: symtrue
비교를 위해 두 번째 입력 인수에서 풀어야 할 미지수의 순서를 변경합니다. 여기서 솔버는 미지수 x를 파라미터화합니다.
sols = solve(eqns,[y z x],ReturnConditions=true)
sols = struct with fields:
y: -z1/3
z: (5*z1)/3
x: z1
parameters: z1
conditions: symtrue
중복 연립방정식
다음 회로 다이어그램을 살펴보겠습니다. 회로를 설명하는 변수를 정의합니다.
V1은 입력 전압입니다.V2은 출력 전압입니다.R1,R2, 및R3은 저항기입니다.I1과I2는 회로의 특정 경로에 흐르는 전류입니다.

키르히호프의 전압 및 전류 법칙을 적용하여 회로를 나타내는 연립방정식을 얻습니다.
syms V1 V2 I1 I2 R1 R2 R3 eqn1 = -V1 + I1*R1 + (I1-I2)*R3 == 0; eqn2 = -V1 + I1*R1 + I2*R2 == 0; eqn3 = -(I1-I2)*R3 + I2*R2 == 0; eqn4 = V2 == I2*R2; eqns = [eqn1; eqn2; eqn3; eqn4]
eqns =
이 연립방정식에는 중복되는 방정식이 하나 있습니다. 첫 번째 방정식에서 두 번째 방정식을 빼면 세 번째 방정식을 얻을 수 있습니다.
이러한 이유로 이 시스템은 단 세 개의 선형 독립 방정식만을 갖습니다. 이 시스템의 세 가지 미지수를 풀면 회로를 설명하는 다른 변수로 표현된 결과를 얻을 수 있습니다. 예를 들어, I1, I2, 및 V2에 대해 풀어 보겠습니다. 결과는 V1, R1, R2, 및 R3으로 표현됩니다.
sols = solve(eqns,I1,I2,V2)
sols = struct with fields:
I1: (V1*(R2 + R3))/(R1*R2 + R1*R3 + R2*R3)
I2: (R3*V1)/(R1*R2 + R1*R3 + R2*R3)
V2: (R2*R3*V1)/(R1*R2 + R1*R3 + R2*R3)
I1, I2, R1도 풀 수 있습니다. 결과는 V1, V2, R2, 및 R3으로 표현됩니다.
sols = solve(eqns,I1,I2,R1)
sols = struct with fields:
I1: (V2*(R2 + R3))/(R2*R3)
I2: V2/R2
R1: (R2*R3*V1 - R2*R3*V2)/(R2*V2 + R3*V2)
4개의 방정식으로 구성된 이 시스템에서 4개의 미지수를 풀 때, 그 중 하나의 방정식이 중복되고 ReturnConditions를 true로 지정하지 않은 경우, 솔버는 시스템을 만족하는 해 집합에서 하나의 해를 선택합니다. 예를 들어, I1, I2, V1, V2에 대한 풀이에서 이러한 미지수에 대한 해는 0입니다.
sols = solve(eqns,I1,I2,V1,V2)
sols = struct with fields:
I1: 0
I2: 0
V1: 0
V2: 0
비교를 위해 I1, I2, V1, R2에 대해 풀면, 솔버는 R2가 1인 해를 선택합니다.
sols = solve(eqns,I1,I2,V1,R2)
sols = struct with fields:
I1: (V2 + R3*V2)/R3
I2: V2
V1: (R1*V2 + R3*V2 + R1*R3*V2)/R3
R2: 1
시스템을 만족하는 완전한 해 집합과 해의 조건 및 자유 파라미터를 찾으려면 ReturnConditions를 true로 지정합니다. 여기서 솔버가 I1, I2, V1, V2에 대해 풀 때 변수 V2를 파라미터화하는 해 집합이 생성됩니다.
sols = solve(eqns,I1,I2,V1,V2,ReturnConditions=true)
sols = struct with fields:
I1: (z*(R2 + R3))/(R2*R3)
I2: z/R2
V1: (z*(R1*R2 + R1*R3 + R2*R3))/(R2*R3)
V2: z
parameters: z
conditions: R1 + R3 ~= 0 & R2 ~= 0 & R3 ~= 0 & R1*R2 + R1*R3 + R2*R3 ~= 0
그러나 연립방정식이 더 복잡하고 더 많은 미지수가 포함된 경우 솔버가 느릴 수 있습니다. 특히 ReturnConditions가 true로 설정된 경우 더욱 그렇습니다. 이런 경우 다른 미지수의 값을 알고 있다면 solve를 사용하기 전에 이 값을 대입하여 솔버 계산 속도를 높일 수 있습니다.
params.R1 = 10; params.R2 = 10; params.R3 = 5; eqnSubbed = vpa(subs(eqns,params)); sols = solve(eqnSubbed,I1,I2,V1,V2,ReturnConditions=true)
sols = struct with fields:
I1: 0.3*z
I2: 0.1*z
V1: 4.0*z
V2: z
parameters: z
conditions: symtrue
수치 해 구하기
solve가 양함수 해를 구할 수 없는 경우 경고를 발생시키고 빈 해를 반환할 수 있습니다. 이 문제를 해결하려면 연립방정식에 모순이 없도록 하기 위해 풀어야 할 미지수의 적절한 개수를 지정해야 합니다. vpasolve를 사용하면 특정 자릿수의 정밀도를 가진 수치 해를 구할 수도 있습니다.
solve가 양함수 해를 찾을 수 없는 경우
삼각 함수를 포함하는 연립방정식을 정의합니다.
syms x y z eqns = [x^2*z*(y-1) == 0; sin(sqrt(3)*x) == z; cos(x) == 1]
eqns =
x에 대해서만 방정식을 풉니다. 솔버는 경고를 발생시키고 빈 해를 반환합니다.
sols = solve(eqns,x)
Warning: Unable to find explicit solution. For options, see <a href="matlab:web(fullfile(docroot, 'symbolic/troubleshoot-equation-solutions-from-solve-function.html'))">help</a>.
sols = Empty sym: 0-by-1
대신, 풀어야 할 미지수로 x, y, z를 지정합니다. 여기서 solve는 두 개의 유효한 해를 반환합니다.
sols = solve(eqns,[x y z])
sols = struct with fields:
x: [2×1 sym]
y: [2×1 sym]
z: [2×1 sym]
sols.x
ans =
sols.y
ans =
sols.z
ans =
파라미터화를 포함한 완전한 해 집합을 찾으려면 ReturnConditions를 true로 지정합니다.
sols = solve(eqns,[x y z],ReturnConditions=true)
sols = struct with fields:
x: [2×1 sym]
y: [2×1 sym]
z: [2×1 sym]
parameters: [k z1]
conditions: [2×1 sym]
sols.x
ans =
sols.y
ans =
sols.z
ans =
sols.conditions
ans =
반올림 오차가 큰 문제가 아니라면 vpasolve를 사용하여 수치 해를 찾을 수도 있습니다. 기본적으로 vpasolve는 32자리의 정밀도를 사용합니다. 이 예제에서는 20자리의 정밀도를 지정합니다. 모든 변수에 대한 초기 추측값을 0으로 지정하여 x, y, z를 풉니다. 여기서 수치 해는 기호 해 중 하나와 동일하며 x = 0, y = 0, z = 0입니다.
digits(20) sols = vpasolve(eqns,[x y z],0)
sols = struct with fields:
x: 0
y: 0
z: 0
초기 추측값을 1로 지정합니다. 여기서 vpasolve는 근사해를 반환합니다. 이 해는 20자리 정밀도 내에서 연립방정식을 충족시킵니다. 이는 해를 연립방정식에 대입하여 볼 수 있습니다.
sols = vpasolve(eqns,[x y z],1)
sols = struct with fields:
x: 0.00000000000000035116234294122756747
y: 1.0
z: 0.00000000000000060823101967913224505
vpa(subs(eqns,sols))
ans =
추후 계산을 위해 digits 값을 32으로 복원합니다.
digits(32)
solve가 반환하는 조건이 연립방정식을 다시 나타내는 경우
파라미터 와 를 갖는 감마 분포의 확률 밀도 함수를 정의합니다.
syms x alpha beta positive pdf = (beta^alpha)/gamma(alpha)*x^(alpha-1)*exp(-beta*x)
pdf =
이 분포의 평균과 누적 분포 함수를 구합니다.
syms xc integratex = int(x*pdf,x,0,xc); mean = simplify(limit(integratex,xc,Inf,"left"))
mean =
cdf(xc) = int(pdf,x,0,xc)
cdf(xc) =
이 분포의 평균을 7로 지정하고 에 대한 누적 분포 함수를 0.9로 지정하는 두 개의 방정식을 정의합니다.
eq1 = mean == 7
eq1 =
eq2 = cdf(10) == 0.9
eq2 =
solve를 사용하여 및 파라미터를 풉니다. 여기서 solve는 경고를 발생시키고 파라미터화된 해를 반환합니다.
sols = solve([eq1; eq2],[alpha beta])
Warning: Solutions are parameterized by the symbols: [z, z1], z1. To include parameters and conditions in the solution, specify the 'ReturnConditions' value as 'true'.
Warning: Solutions are only valid under certain conditions. To include parameters and conditions in the solution, specify the 'ReturnConditions' value as 'true'.
sols = struct with fields:
alpha: z
beta: z1
ReturnConditions를 true로 지정하여 해의 조건과 파라미터를 포함합니다. 여기서 파라미터화된 해의 조건은 풀어야 할 방정식을 다시 나타낸 것입니다. 즉, solve는 양함수 기호 해를 찾을 수 없습니다.
sols = solve([eq1; eq2],[alpha beta],ReturnConditions=true)
sols = struct with fields:
alpha: z
beta: z1
parameters: [z z1]
conditions: 1/10 - igamma(z, 10*z1)/gamma(z) == 0 & z/z1 - 7 == 0 & 0 < z & 0 < z1
대신 vpasolve를 사용하여 두 방정식에 대한 수치 해를 구합니다. 음이 아닌 해를 찾으려면 와 모두에 대해 탐색 구간을 [0 Inf]로 설정합니다.
sols = vpasolve([eq1; eq2],[alpha beta],[0 Inf; 0 Inf])
sols = struct with fields:
alpha: 9.6391484249254912862751301540044
beta: 1.3770212035607844694678757362863
solve가 기호 해를 구하지 못하고 대신 수치 해를 반환하는 경우
solve 함수는 방정식에 대한 기호 해를 찾으려고 시도합니다. solve가 방정식을 기호적으로 풀 수 없으면 vpasolve를 사용하여 수치 해를 구합니다. vpasolve 함수는 기본적으로 처음 구한 해를 반환합니다.
방정식 를 풉니다. solve는 기호 해를 찾을 수 없기 때문에 경고를 발생시키고 수치 해를 반환합니다.
syms x
eqn = sin(x) == x^2 - 1;
sol = solve(eqn,x)Warning: Unable to solve symbolically. Returning a numeric solution using <a href="matlab:web(fullfile(docroot, 'symbolic/vpasolve.html'))">vpasolve</a>.
sol =
방정식 양변을 플로팅합니다. 플롯을 보면 방정식에 양수 해도 있습니다.
fplot([lhs(eqn) rhs(eqn)],[-2 2])

수치 솔버 vpasolve를 직접 호출하고 탐색 구간을 0~2로 지정하여 다른 해를 구합니다.
sol2 = vpasolve(eqn,x,[0 2])
sol2 =
방정식 밖에서 기호 함수 정의하기
기호 함수가 포함된 연립방정식을 풀 때 solve는 빈 해를 반환할 수 있습니다. 예를 들어, 다음 방정식은 함수 의 식과 에서의 함수 값을 정의합니다.
syms f(x) a eq1 = f(x) == 3*x + a; eq2 = f(1) == 5; eqns = [eq1; eq2]
eqns =
solve를 사용하여 의 값을 구하는 경우 solve는 빈 해를 반환합니다.
asol = solve(eqns,a)
asol = Empty sym: 0-by-1
대신, 연립방정식 외부에서 기호 함수 의 식을 정의합니다. 그런 다음 1에서 평가된 의 값을 사용하여 를 풉니다.
syms f(x) a f(x) = 3*x + a; asol = solve(f(1) == 5)
asol =
에 대한 해를 구한 다음에 원래 식에 대입할 수 있습니다.
fsol = subs(f(x),a,asol)
fsol =
참고 문헌
[1] "Consistent and Inconsistent Equations." In Wikipedia, September 3, 2024. https://en.wikipedia.org/w/index.php?title=Consistent_and_inconsistent_equations&oldid=1243721077.
[2] "Overdetermined System." In Wikipedia, July 22, 2024. https://en.wikipedia.org/w/index.php?title=Overdetermined_system&oldid=1235933306.
[3] "Underdetermined System." In Wikipedia, August 1, 2024. https://en.wikipedia.org/w/index.php?title=Underdetermined_system&oldid=1237892077.