Main Content

シンボリック方程式の求解

この例では、シンボリック方程式の求解に関する基礎を説明します。

2 次方程式の求解

関数 solve を使用して、2 次方程式を解きます。

解を求める変数を指定せずに、2 次方程式を解きます。関数 solve は、解の出力先として x を選択します。

disp('Solve a quadratic equation without specifying which variable to solve for. The solve function chooses x to return a solution.')
disp('>> syms a b c x')
disp('>> eqn = a*x^2 + b*x + c == 0')
disp('>> S = solve(eqn)')
syms a b c x
eqn = a*x^2 + b*x + c == 0
S = solve(eqn)
Solve a quadratic equation without specifying which variable to solve for. The solve function chooses x to return a solution.
>> syms a b c x
>> eqn = a*x^2 + b*x + c == 0
>> S = solve(eqn)
 
eqn =
 
a*x^2 + b*x + c == 0
 
 
S =
 
-(b + (b^2 - 4*a*c)^(1/2))/(2*a)
-(b - (b^2 - 4*a*c)^(1/2))/(2*a)
 

解を求める変数 a を指定し、それについて 2 次方程式を解きます。

disp('Solve for the variable a')
disp('Sa = solve(eqn,a)')
Sa = solve(eqn,a)
Solve for the variable a
Sa = solve(eqn,a)
 
Sa =
 
-(c + b*x)/x^2
 

多変数方程式の求解と構造体への出力の代入

多変数について解くときに、出力を個別の変数ではなく 1 つの構造体配列に保存する方が便利なことがあります。関数 solve は、単一の出力引数が指定され、かつ複数の出力が存在する場合に構造体を返します。

方程式系を解いて、その解を構造体配列に返します。

disp('Solve a system of equations to return solutions in a structure array')
disp('>> eqns = [2*u + v == 0, u - v == 1];')
disp('>> S = solve(eqns,[u v])')
syms u v
eqns = [2*u + v == 0, u - v == 1];
S = solve(eqns,[u v])
Solve a system of equations to return solutions in a structure array
>> eqns = [2*u + v == 0, u - v == 1];
>> S = solve(eqns,[u v])

S = 

  struct with fields:

    u: 1/3
    v: -2/3

構造体の要素を指定して、解にアクセスします。

disp('Access the solutions within the structure')
disp('>> S.u')
S.u
disp('>> S.v')
S.v
Access the solutions within the structure
>> S.u
 
ans =
 
1/3
 
>> S.v
 
ans =
 
-2/3
 

構造体配列を使用すると、解を他の式に簡単に代入できます。関数 subs を使用して、解 S を他の式に代入します。

disp('Use the subs function to substitute the solutions into other expressions')
disp('>> e1 = subs(u^2, S)')
e1 = subs(u^2,S)
disp('>> e2 = subs(3*v + u, S)')
e2 = subs(3*v + u,S)
Use the subs function to substitute the solutions into other expressions
>> e1 = subs(u^2, S)
 
e1 =
 
1/9
 
>> e2 = subs(3*v + u, S)
 
e2 =
 
-5/3
 

関数 solve が空のオブジェクトを返した場合、解は存在しません。

disp('The solve function returns an empty object if no solutions exist')
disp('>> solve([3*u+2, 3*u+1],u)')
S = solve([3*u+2, 3*u+1],u)
The solve function returns an empty object if no solutions exist
>> solve([3*u+2, 3*u+1],u)
 
S =
 
Empty sym: 0-by-1
 

方程式の数値的な求解

関数 solve が方程式をシンボリックに解くことができない場合は、関数 vpasolve を使用して数値解を求めようとします。関数 vpasolve は、最初に求めた解を返します。

次の方程式を解いてみます。関数 solve はシンボリック解を求めることができないため、数値解を返します。

disp('The following equation returns a numeric solution because the solve function cannot find a symbolic solution')
syms x
disp('>> eqn = sin(x) == x^2 - 1;')
eqn = sin(x) == x^2 - 1;
disp('>> solve(eqn,x)')
S = solve(eqn,x)
The following equation returns a numeric solution because the solve function cannot find a symbolic solution
>> eqn = sin(x) == x^2 - 1;
>> solve(eqn,x)
Warning: Unable to solve symbolically. Returning a numeric solution using <a
href="matlab:web(fullfile(docroot, 'symbolic/vpasolve.html'))">vpasolve</a>. 
 
S =
 
-0.63673265080528201088799090383828
 

方程式の左辺と右辺をプロットします。方程式には正の解もあることがわかります。

disp('Plot the left and right sides of the equation to see that the equation also has a positive solution')
disp('>> fplot([lhs(eqn) rhs(eqn)], [-2 2])')
fplot([lhs(eqn) rhs(eqn)], [-2 2])
Plot the left and right sides of the equation to see that the equation also has a positive solution
>> fplot([lhs(eqn) rhs(eqn)], [-2 2])

数値ソルバー vpasolve を直接呼び出して区間を指定することにより、他の解を求めます。

disp('Find the other solution by calling the numeric solver vpasolve')
disp('>> V = vpasolve (eqn,x,[0,2])')
V = vpasolve(eqn,x,[0 2])
Find the other solution by calling the numeric solver vpasolve
>> V = vpasolve (eqn,x,[0,2])
 
V =
 
1.4096240040025962492355939705895