Main Content

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

積分

f がシンボリック式の場合、

int(f)

は、diff(F) = f となる別のシンボリック式 F を求めようとするものです。つまり、int(f) は、f の不定積分 (閉形式で存在する場合) を返します。微分と同様に、

int(f,v)

は、symvar で決められる変数ではなく、シンボリック オブジェクト v を、積分変数として使います。次の表に int の使い方を示します。

数学的演算

MATLAB® コマンド

xndx={log(x)if n=1xn+1n+1otherwise.

int(x^n) または int(x^n,x)

0π/2sin(2x)dx=1

int(sin(2*x), 0, pi/2) または int(sin(2*x), x, 0, pi/2)

g = cos(at + b)

g(t)dt=sin(at+b)/a

g = cos(a*t + b) int(g) または int(g, t)

J1(z)dz=J0(z)

int(besselj(1, z)) または int(besselj(1, z), z)

微分とは対照的に、シンボリックな積分はより複雑な作業です。多くの難問が、積分の計算において生じ得ます。

  • 不定積分 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) を返すだけです。

定積分も行えます。

定積分

コマンド

abf(x)dx

int(f, a, b)

abf(v)dv

int(f, v, a, b)

ここで、別の例をいくつか示します。

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 が任意の正の実数の場合、式

eax2

は、x±∞ に向かうと 0 に収束する正の釣鐘型曲線になります。この曲線の一例は a = 1/2 で作成できます。

syms x
a = sym(1/2);
f = exp(-a*x^2);
fplot(f)

ただし、次の積分を計算しようとする場合

eax2dx

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)

複素数パラメーターの積分

以下の積分

1a2+x2dx

a の複素数値に対して計算するには、以下のように入力します。

syms a x 
f = 1/(a^2 + x^2);
F = int(f, x, -inf, inf)

syms を使用して、変数のすべての仮定を消去します。シンボリック変数と仮定の詳細については、シンボリック変数の仮定の使用を参照してください。

前のコマンドは、複素数出力を行います。

F = 
(pi*signIm(1i/a))/a

関数 signIm は、次のように定義されます。

signIm(z)={1if Im(z)>0, or Im(z)=0 and Re(z)<00if  z=0-1otherwise.

Cartesian representation of a complex number z, showing regions where signIm has a value of 1, 0, and -1

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) を、integralvpaintegral の両方を使用して積分します。関数 integralNaN を返して警告を表示しますが、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を参照してください。

参考

| |

外部の Web サイト