このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
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 =
シンボリック変数のassume
を設定します。 の解は 4 つ (2 つの実数と 2 つの複素数) あります。 が実数で、かつ と仮定すると、解は 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([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 =
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 =
における から までの定積分 を求めます。
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 ではシンボリック ベクトルとシンボリック行列を使用できます。シンボリック行列のeig
を計算できます。
行列の乗算 (ここで、 および ) を実行します。
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))