このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
積分
f
がシンボリック式の場合、
int(f)
は、diff(F)
=
f
となる別のシンボリック式 F
を求めようとするものです。つまり、int(f)
は、f
の不定積分 (閉形式で存在する場合) を返します。微分と同様に、
int(f,v)
は、symvar
で決められる変数ではなく、シンボリック オブジェクト v
を、積分変数として使います。次の表に int
の使い方を示します。
数学的演算 | MATLAB® コマンド |
---|---|
| |
| |
g = cos(at + b) |
|
|
微分とは対照的に、シンボリックな積分はより複雑な作業です。多くの難問が、積分の計算において生じ得ます。
不定積分
F
が閉形式で存在しない可能性がある不定積分は馴染みのない関数を定義する可能性がある
不定積分が存在しても、ソフトウェアがそれを求められない可能性がある
大型コンピューターでは不定積分の検出が可能でも、使用しているマシンではメモリと時間の不足で求められない
それにもかかわらず、多くの場合、MATLAB はシンボリックな積分をうまく実行できます。たとえば、次のシンボリック変数を作成します。
syms a b theta x y n u z
次の表に、これらの変数を含んだ式の積分を示します。
f | int(f) |
---|---|
syms x n f = x^n; | int(f) ans = piecewise(n == -1, log(x), n ~= -1,... x^(n + 1)/(n + 1)) |
syms y f = y^(-1); | int(f) ans = log(y) |
syms x n f = n^x; | int(f) ans = n^x/log(n) |
syms a b theta f = sin(a*theta+b); | int(f) ans = -cos(b + a*theta)/a |
syms u f = 1/(1+u^2); | int(f) ans = atan(u) |
syms x f = exp(-x^2); | int(f) ans = (pi^(1/2)*erf(x))/2 |
最後の例 exp(-x^2)
は、三角関数や指数関数などの標準微積分を含む積分に公式がないときにどうなるかを示しています。この場合、MATLAB はエラー関数 erf
を使って答えを返します。
MATLAB が関数 f
の積分を求められない場合は、int(f)
を返すだけです。
定積分も行えます。
定積分 | コマンド |
---|---|
|
|
|
|
ここで、別の例をいくつか示します。
f | a, b | int(f, a, b) |
---|---|---|
syms x f = x^7; | a = 0; b = 1; | int(f, a, b) ans = 1/8 |
syms x f = 1/x; | a = 1; b = 2; | int(f, a, b) ans = log(2) |
syms x f = log(x)*sqrt(x); | a = 0; b = 1; | int(f, a, b) ans = -4/9 |
syms x f = exp(-x^2); | a = 0; b = inf; | int(f, a, b) ans = pi^(1/2)/2 |
syms z f = besselj(1,z)^2; | a = 0; b = 1; | int(f, a, b) ans = hypergeom([3/2, 3/2],... [2, 5/2, 3], -1)/12 |
ベッセル関数 (besselj
) の例に対して、関数 double
を使って、積分値の数値近似を計算することが可能です。コマンド
syms z a = int(besselj(1,z)^2,0,1)
は以下を返します。
a = hypergeom([3/2, 3/2], [2, 5/2, 3], -1)/12
コマンド
a = double(a)
は以下を返します。
a = 0.0717
実数パラメーターをもつ積分
シンボリック積分における困難の 1 つは、さまざまなパラメーターの "値" です。たとえば a が任意の正の実数の場合、式
は、x が ±∞ に向かうと 0 に収束する正の釣鐘型曲線になります。この曲線の一例は a = 1/2 で作成できます。
syms x
a = sym(1/2);
f = exp(-a*x^2);
fplot(f)
ただし、次の積分を計算しようとする場合
a に値が与えられていない場合は、MATLAB は a を複素数であると仮定します。そのため、a の偏角に依存する区分的解を返します。a が正の実数の場合のみを考える場合、assume
を使用して、a
の仮定を設定します。
syms a assume(a > 0)
次のコマンド群を使って、前述の積分を計算します。
syms x f = exp(-a*x^2); int(f, x, -inf, inf)
次の値が返されます。
ans = pi^(1/2)/a^(1/2)
複素数パラメーターの積分
以下の積分
を a
の複素数値に対して計算するには、以下のように入力します。
syms a x f = 1/(a^2 + x^2); F = int(f, x, -inf, inf)
syms
を使用して、変数のすべての仮定を消去します。シンボリック変数と仮定の詳細については、シンボリック変数の仮定の使用を参照してください。
前のコマンドは、複素数出力を行います。
F = (pi*signIm(1i/a))/a
関数 signIm
は、次のように定義されます。
a = 1 + i
のときの F
を評価するには、次のように入力します。
g = subs(F, 1 + i)
g = pi*(1/2 - 1i/2)
double(g)
ans = 1.5708 - 1.5708i
可変精度演算を使用した高精度の数値積分
高精度の数値積分が Symbolic Math Toolbox™ の関数 vpaintegral
に実装されています。vpaintegral
は、倍精度演算を使用する MATLAB 関数 integral
とは異なり、可変精度の演算を使用します。
besseli(5,25*u).*exp(-u*25)
を、integral
と vpaintegral
の両方を使用して積分します。関数 integral
は NaN
を返して警告を表示しますが、vpaintegral
は正しい結果を返します。
syms u f = besseli(5,25*x).*exp(-x*25); fun = @(u)besseli(5,25*u).*exp(-u*25); usingIntegral = integral(fun, 0, 30) usingVpaintegral = vpaintegral(f, 0, 30)
Warning: Infinite or Not-a-Number value encountered. usingIntegral = NaN usingVpaintegral = 0.688424
詳細は、vpaintegral
を参照してください。
参考
int
| diff
| vpaintegral