Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

Symbolic Math Toolbox の計算数学

この例では、計算数学や解析数学用のツール一式を備える Symbolic Math Toolbox™ の概要を説明します。

この例には以下が含まれます。

  • 変数、式、関数および方程式

  • 代入と求解

  • 単純化と操作

  • 微積分 (微分、積分、極限、級数)

  • 微分方程式

  • 線形代数

  • グラフィックス

詳細については、Symbolic Math Toolbox 入門を参照してください。数学的処理のドキュメント化や共有の詳細については、ライブ エディターでライブ スクリプトを作成を参照してください。

変数、式、関数および方程式

MATLAB® の変数は、既定では倍精度です。Symbolic Math Toolbox はこれを拡張し、sym の使用と vpa による可変精度の使用によって、厳密なシンボリック形式で数値を表現できるようにしています。

pi/6 + pi/4
ans = 1.3090
sym(pi/6) + sym(pi/4)
ans = 

5π12

vpa(pi/6) + vpa(pi/4)
ans = 1.3089969389957471826927680763665

シンボリック変数は、三角関数、対数関数、指数関数、特殊関数などの数式、関数および方程式で使用できます。シンボリック式を作成し、その数学演算を実行できます。

syms x y 
log(x) + exp(y)
ans = ey+log(x)

区分的関数を作成することもできます。

y(x) = piecewise(x<0, -1, x>0, 1)
y(x) = 

{-1 if  x<01 if  0<x

シンボリック関数の作成を作成して評価します。x=-5 における f の値を求めます。

syms f(x)
f(x) = x^4-2*x^3+6*x^2-2*x+10
f(x) = x4-2x3+6x2-2x+10
f(-5)
ans = 1045

solve を使い、線 y1y2 の共通部分を求めます。== 演算子を使用して線を等式化します。

syms y1 y2
y1 = x+3; y2 = 3*x;
solve(y1 == y2)
ans = 

32

シンボリック変数のassumeを設定します。x4=1 の解は 4 つ (2 つの実数と 2 つの複素数) あります。x が実数で、かつ x>0 と仮定すると、解は 1 つだけ存在します。

syms x
solve(x^4 == 1)
ans = 

(-11-ii)

assume(x,'real')
assumeAlso( x > 0)
assumptions(x)
ans = (xR0<x)
solve(x^4 == 1)
ans = 1
assume(x,'clear')

代入と求解

Symbolic Math Toolbox では、subs を使用して式の一部に代入することにより、数学関数の評価をサポートします。数値、他のシンボリック変数やシンボリック式、ベクトルまたは行列のいずれかを代入できます。Symbolic Math Toolbox では、solve を使用して方程式と方程式系の求解をサポートします。多変数方程式の求解、不等式の求解および仮定を使用した求解をサポートします。可変精度の演算を使用して、シンボリックまたは数値的に解を高精度に求めることができます。

シンボリック変数を使用して代入を行います。x=xo-1x2+1 に代入します。

syms x xo
subs(x^2+1,x,xo-1)
ans = xo-12+1

複数の値を代入します。たとえば、a=π2,b=π4,c=-1 を代入して cos(a)+sin(b)-e2C を評価します。

syms a b c
subs(cos(a) + sin(b) - exp(2*c), [a b c], [pi/2 pi/4 -1])
ans = 

22-e-2

方程式を作成して解きます。9x2-1=0 の零点を求めます。

solve(9*x^2 - 1 == 0)
ans = 

(-1313)

一般的な 2 次方程式 ax2+bx+c=0 を解き、subs を使用して、その解をa=9,b=0,c=-1 について評価します。

eqn = a*x^2 + b*x + c == 0;
sol = solve(eqn) 
sol = 

(-b+b2-4ac2a-b-b2-4ac2a)

subs(sol,[a b c],[9 0 -1])
ans = 

(-1313)

厳密な結果や高い精度が必要な場合、方程式を、シンボリックに解くか、可変精度の演算を使用して解きます。f(x) = 6x72x6+3x38 のグラフはその根の周辺で非常にフラットになっています。

syms x f(x)
assume(x>0)
f(x) = 6*x^7-2*x^6+3*x^3-8;
fplot(f)
xlim([-10 10])
ylim([-1e3 1e3])

Figure contains an axes object. The axes object contains an object of type functionline.

doubleSol = roots([6 -2 0 0 3 0 0 -8]) %  double-precision
doubleSol = 7×1 complex

   1.0240 + 0.0000i
   0.7652 + 0.8319i
   0.7652 - 0.8319i
  -0.8808 + 0.5043i
  -0.8808 - 0.5043i
  -0.2297 + 0.9677i
  -0.2297 - 0.9677i

symsSol = solve(f) % exact. The roots object stores the zeros for symbolic computations
symsSol = 

root(z7-z63+z32-43,z,5)

vpaSol = vpasolve(f) % variable-precision 
vpaSol = 

(1.0240240759053702941448316563337-0.88080620051762149639205672298326+0.50434058840127584376331806592405i-0.88080620051762149639205672298326-0.50434058840127584376331806592405i-0.22974795226118163963098570610724+0.96774615576744031073999010695171i-0.22974795226118163963098570610724-0.96774615576744031073999010695171i0.7652087814927846556172932675903+0.83187331431049713218367239317121i0.7652087814927846556172932675903-0.83187331431049713218367239317121i)

単純化と操作

Symbolic Math Toolbox は、数学関数の式の操作と単純化をサポートしています。ほとんどの数式は数学的に等価な別の形式で表現でき、Symbolic Math Toolbox では、式の因数分解や展開、項の結合、式の書き換えや並べ替え、仮定に基づいた単純化など、多くの演算をサポートします。

多項式の乗算と結果の単純化を行い、(x-1)(x+1)(x2+x+1)(x2+1)(x2-x+1)(x4-x2+1)x12-1 に単純化されることを示します。

simplify((x - 1)*(x + 1)*(x^2 + x + 1)*(x^2 + 1)*(x^2 - x + 1)*(x^4 - x^2 + 1))
ans = x12-1

三角恒等式を適用して単純化します (たとえば、sin2(x)=1-cos(2x)2 など)。

combine(2*sin(x)*cos(x) + (1- cos(2*x))/2 + cos(x)^2,'sincos')
ans = sin(2x)+1

多変数多項式を因数分解または展開します。

syms x y
factor(y^6-x^6)
ans = (-1x-yx+yx2+xy+y2x2-xy+y2)
f(x) = (x^3 + 7);
expand(f(y-1))
ans = y3-3y2+3y+6

関数の合成 f(g(x)) を求めます。

f(x) = sqrt(log(x));
g(x) = sqrt(1-x);
h = compose(g,f,x)
h(x) = 1-log(x)

微積分 (微分、積分、極限、級数など)

Symbolic Math Toolbox には応用数学向けの微積分ツール一式が揃っています。多変数のシンボリック積分やシンボリック微分を実行できます。級数の生成、操作および計算を行うことができます。

導関数 ddx(sin(x)) を求めます。

diff(sin(x))
ans = cos(x)

連鎖律を使用して、導関数 ddx(x2+sin(2x4)+1) を求めます。

diff(x^2+sin(2*x^4)+1,x)
ans = 2x+8x3cos(2x4)

f(x)=e-x22 における不定積分 f(x)dx を求めます。

int(exp(-x^2/2),x)
ans = 

2πerf(2x2)2

f(x)=xlog(1+x) における 0 から 1 までの定積分 abf(x)dx を求めます。

int(x*log(1+x),0,1)
ans = 

14

f(x)=sin(x)x におけるテイラー級数展開 (x-a)nf(n)(a)n!x=0 の点の周辺で計算し、x=0 において sin(x)x=1 であることを示します。

syms x 
T = taylor(sin(x)/x)
T = 

x4120-x26+1

subs(T,x,0)
ans = 1

次の左右の極限が等しくないことを示し、x=π2 において tan(x) が不連続であることを示します。limxπ2+tan(x)limxπ2-tan(x)

limit(tan(x),x,pi/2,'left')
ans = 
limit(tan(x),x,pi/2,'right')
ans = -
limit(tan(x),x,pi/2)
ans = NaN

微分方程式

Symbolic Math Toolbox は、微分方程式系の求解系を、dsolve を使用して解析的に解くことができます。

1 階 ODE dydx=-ay を解きます。

syms a b y(x)
dsolve(diff(y) == -a*y)
ans = C1e-ax

同じ ODE を初期条件 y(0)=b を使用して解きます。

dsolve(diff(y)== -a*y,y(0)==b)
ans = be-ax

連動する 1 階 ODE 系 dxdt=ydydt=-x を解きます。

syms x(t) y(t)
z = dsolve(diff(x) == y, diff(y) == -x);
disp([z.x;z.y])

(C1cos(t)+C2sin(t)C2cos(t)-C1sin(t))

線形代数

Symbolic Math Toolbox ではシンボリック ベクトルとシンボリック行列を使用できます。シンボリック行列のeigを計算できます。

行列の乗算 Ax=b (ここで、A=[abcd] および x=[x1,x2]) を実行します。

syms a b c d
syms x1 x2
x = [x1; x2];
A = [a b ; c d];
b = A*x
b = 

(ax1+bx2cx1+dx2)

A の行列式を求めます。

det(A)
ans = ad-bc

A の固有値を求めます。

lambda = eig(A)
lambda = 

(a2+d2-a2-2ad+d2+4bc2a2+d2+a2-2ad+d2+4bc2)

グラフィックス

Symbolic Math Toolbox は 2 次元と 3 次元の解析プロットをサポートします。

fplot(tan(x))

Figure contains an axes object. The axes object contains 2 objects of type functionline.

パラメトリック曲線 x(t)=t*sin(5t) および y(t)=t*cos(5t) をプロットします。

syms t
x = t*sin(5*t); 
y = t*cos(5*t);
fplot(x, y)
grid on

Figure contains an axes object. The axes object contains an object of type parameterizedfunctionline.

3 次元パラメトリック曲線 x(t)=e|t|10sin(5|t|)y(t)=e|t|10cos(5|t|)、および z(t)=t[-10,10] の範囲を赤い破線でプロットします。

syms t
xt = exp(abs(t)/10).*sin(5*abs(t));
yt = exp(abs(t)/10).*cos(5*abs(t));
zt = t;
h = fplot3(xt,yt,zt, [-10,10],'--r');

Figure contains an axes object. The axes object contains an object of type parameterizedfunctionline.

3 次元表面 f(x,y)=sin(x)+cos(y) をプロットします。

syms x y
fsurf(sin(x) + cos(y))

Figure contains an axes object. The axes object contains an object of type functionsurface.

同じ表面の 2 次元等高線をプロットします。

fcontour(sin(x) + cos(y))

Figure contains an axes object. The axes object contains an object of type functioncontour.