みなさん,こんにちは
おかしょです.
積分をする方法にはさまざまなものがあります.その方法の一つに台形則と言うものがあります.
この記事を読むと以下のようなことがわかる・できるようになります.
- 台形則とはどのような手法か
- 台形則の計算方法
- MATLABのプログラムの書き方
この記事を読む前に
この台形則と似たような手法で長方形則(オイラー法)と言うものがあります.理論的にはそちらの方が簡単なので,そちらをまだ読んでいない方は以下のリンクから読めますので,先に読んて置くことをおすすめします.
台形則とは
そもそも積分とは関数が表す面積を求めることです.台形則では積分区間を台形で区切り面積を求めることで積分を行います.
たとえば,以下のようなcos関数を積分することを考えましょう.
この関数を普通に計算で初期値を0として積分すると以下のようになります.
\begin{eqnarray}
\int \cos x\ dx &=& \sin x \tag{1}
\end{eqnarray}
台形則で積分をする場合は以下のように台形で区切り,すべての台形の面積を求めることで関数を積分したことになります.今回の場合は面積を足し合わせた結果がsin関数になれば積分できたことになります.
台形で区切るということは,元の関数を(今回の場合はcos関数)を1次関数で近似しているということになります.したがって,積分したい関数の非線形性が強い場合は近似誤差が非常に大きく表れてしまうので注意が必要です.反対に非線形性が弱い関数,特に1次関数においては誤差がなく積分することが可能となります.
台形則による積分を行うためのプログラム
台形則による積分のプログラムは非常に簡単です.式で表すと以下のように表されます.
\begin{eqnarray}
y_{k+1} &=& y_k+( f(x_{k+1})+ f(x_k)) \times dt / 2\tag{2}
\end{eqnarray}
上式において,\(y\)が積分結果,\(f(\cdot)\)は積分したい関数,\(dt\)は積分間隔を表します.
MATLABでプログラムを書く場合は以下のようになります.
time = 9.5;
dt = 0.1;
y = zeros(time/dt, 1);
t = zeros(time/dt, 1);
for i=1:time/dt-1
t(i+1) = t(i)+dt;
y(i+1) = y(i)+(cos(t(i+1))+cos(t(i)))*dt/2;
end
figure(1)
plot(t,y)
grid on
上記のプログラムを実行することで,台形則で積分した結果のsin関数が表示されるはずです.
台形則の精度を良くする方法
台形則では非線形性が強い場合,誤差が大きくなってしまうのですができるだけ誤差を小さくすることができます.
その方法とは積分間隔を小さくすることです.つまり,区切る台形の幅をできる限り小さくすることで制度を良くすることができます.先ほど示したプログラムの2行目にある\(dt\)の値を小さな値にすればするほど精度が良くなることがわかると思うのでやってみてください.
まとめ
ここでは台形則による積分の方法を解説しました.台形則と似たような手法として長方形則と言うものがあるのですが,この台形則は長方形則と同じように理解しやすいうえに,精度も比較的良いのでより実用的であると言えます.
続けて読む
台形則は長方形則よりも精度が良くなると言いましたが,もっと精度の良い積分手法があります.それはルンゲ・クッタ(Runge-Kutta)と呼ばれる手法です.この手法については以下の記事で解説しているのでそちらを参考にしてください.
「現在準備中です...」
Twitterでは記事の更新情報や活動の進捗などをつぶやいているので気が向いたらフォローしてください.
YouTubeでも制御工学や電子工作などの解説をしているので,ぜひのぞいてみてください.
それでは最後まで読んでいただきありがとうございました.
コメント