ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

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 = 

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

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

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

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

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

関数を作成して評価します。 における f の値を求めます。

syms f(x)
f(x) = x^4-2*x^3+6*x^2-2*x+10
f(x) = 

f(-5)
ans = 

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

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

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

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

assume(x,'real')
assumeAlso( x > 0)
assumptions(x)
ans = 

solve(x^4 == 1)
ans = 

assume(x,'clear')

代入と求解

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

シンボリック変数を使用して代入を行います。 に代入します。

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

複数の値を代入します。たとえば、 を代入して を評価します。

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

方程式を作成して解きます。 の零点を求めます。

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

一般的な 2 次方程式 を解き、subs を使用して、その解を について評価します。

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

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

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

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])

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

   0.9471 + 0.0000i
  -0.2861 + 0.8426i
  -0.2861 - 0.8426i

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

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

単純化と操作

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

多項式の乗算と結果の単純化を行い、 に単純化されることを示します。

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

三角恒等式を適用して単純化します (たとえば、 など)。

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

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

syms x y
factor(y^6-x^6)
ans = 

f(x) = (x^3 + 7);
expand(f(y-1))
ans = 

関数の合成 を求めます。

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

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

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

導関数 を求めます。

diff(sin(x))
ans = 

連鎖律を使用して、導関数 を求めます。

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

における不定積分 を求めます。

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

における 0 から 1 までの定積分 を求めます。

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

におけるテイラー級数展開 の点の周辺で計算し、 において であることを示します。

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

subs(T,x,0)
ans = 

次の左右の極限が等しくないことを示し、 において が不連続であることを示します。

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

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

limit(tan(x),x,pi/2)
ans = 

微分方程式

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

1 階 ODE を解きます。

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

同じ ODE を初期条件 を使用して解きます。

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

連動する 1 階 ODE 系 を解きます。

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

線形代数

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

行列の乗算 (ここで、 および ) を実行します。

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

A の行列式を求めます。

det(A)
ans = 

A の固有値を求めます。

lambda = eig(A)
lambda = 

グラフィックス

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

fplot(tan(x))

パラメトリック曲線 および をプロットします。

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

3 次元パラメトリック曲線 および [-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');

3 次元表面 をプロットします。

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

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

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