\documentclass[12pt]{jarticle}
\usepackage[dvips]{graphicx}
%\usepackage{wrapfig}

\oddsidemargin 0mm
\evensidemargin 0mm
\textwidth 160mm
\topmargin -15mm
\textheight 240mm

\author{}
\title{数値計算法概論：No.5 数値積分(台形公式)}
\date{}

\begin{document}

\maketitle

\section{数値積分(台形公式)}

微分とは異なり、一般に積分は解析的には求まらないので、
数値計算に頼る必要がでてくる。特異点のない場合、次の(閉じた)
台形公式により、数値積分ができる。

\begin{eqnarray}
\int_{a}^{b} f(x) dx
 &=& \sum_{i=0}^{i=N-1} h(f(x_{i})+f(x_{i+1}))/2
＋O \left( \frac{(b-a)^3 f''}{N^2} \right)	\nonumber\\
 &=& h \left[
\frac{1}{2} f(a) + \sum_{i=1}^{i=N-1} f(x_i)+\frac{1}{2} f(b) \right]
＋O \left( \frac{(b-a)^3 f''}{N^2} \right),	\nonumber\\
x_{i} &=& a+ h i, \quad h \equiv \frac{(b-a)}{N}
\end{eqnarray}

%\begin{wrapfigure}{l}{7cm}
\includegraphics[height=5cm,clip]{fig5.eps}
%\end{wrapfigure}

[解説]
積分区間 $[a,b]$ を $N$ 等分し $x_0=a,x_1,x_2,\cdots,x_N=b$ とし、、
各点での関数値を $f(x_0),f(x_1),\cdots,f(x_N)$ で表す。
図のように関数 $f(x)$を折れ線で近似すると、
各台形の面積は、$h(f(x_{i})+f(x_{i+1}))/2$ で、
(積分値 $\approx$ 台形の総面積) から上の台形公式が導ける。

\bigskip

\underline{課題1}：
次の問題を数値積分して見よ。分割数$N$(刻み幅 $h$)に対する収束性を確認せ
よ。

\begin{equation}
\int_{0}^{\pi} \sin (x) dx =2	
\end{equation}

\begin{equation}
\int_0^{1} e^x dx = e-1 = 1.718281828\cdots
\end{equation}

\begin{equation}
\int_{-1}^{1} \frac{2}{1+x^2} dx = \pi = 3.141592653589793\cdots
\end{equation}

\begin{equation}
\int_{0}^{1} \exp ( - x^2) dx 
\end{equation}

\begin{equation}
4 \int_{0}^{1} \sqrt{1-x^2} dx = \pi
\end{equation}

\section{プログラム}

\subsection{関数副プログラム}

プログラムが複雑になると、プログラム全体を１つの単位としておくのが難し
くなるので、プログラムを機能ごとの単位に分割し、それ
らを組み合わせていけばよい。こうすると、プログラム作成、デバック(
エラー修正)が容易になるばかりでなく、過去のプログラムの蓄積が
利用できる。そのようなものとしてまず関数副プログラムをあげる。

\bigskip

1)関数副プログラムの定義：

$[t]$ function $f(d_1,d_2,...)$

.....

f= ...

return

end

$t:$ 型宣言子 $f:$ 関数名 $d_i:$ 仮引数

2)引用法：

$f(a_1,a_2,...)$

$f:$ 関数名 $a_i:$ 実引数
\bigskip

注意1: 仮引数の有効範囲は関数副プログラムの中だけである。したがって仮引
数と同じ名前の変数をプログラム中の他の箇所で別の意味に使用することもできる。

注意2: 実引数と仮引数の型は一致していなければならない。一方が単精度で
他方が倍精度だったりすると、全く異なる結果になる。仮引数の宣言は関数副プ
ログラムの中で行なう。

例：
\begin{verbatim}
c     Main routine
      implicit real*8 (a-h,o-z)
c
      read(*,*) a,b,n
      h=(b-a)/n
      sum=0.5*(func(a)+func(b))
      do i=1,n-1
         x=a+h*i
         sum = sum + func(x)
      end do
      write(*,*) sum*h
c
      end
c
c     Function subprogram
      real*8 function func(x)
c
      implicit real*8 (a-h,o-z)
c
      func=cos(x)
c
      return
      end
\end{verbatim}


\subsection{配列}

複数個のデータをセットとして取り扱うと見通しが良くなることがある。例
えば線形代数でのベクトルや、行列などである。コンピューター上
で同じ機能を果たすものが配列である。配列は、複数個の同じ種類のデータを
取り扱う形式である。

\bigskip

\underline{配列の宣言}

型宣言子 $a_1(l_1:u_1),a_2(l_2:u_2,l_3:u_3), \cdots$

\centerline{または}

dimension $a_1(l_1:u_1),a_2(l_2:u_2,l_3:u_3), \cdots$

ただし、$a_i:$ 配列名 $l_i:$ 添字の下限 $u_i:$ 添字の上限

\bigskip

配列は integer,real 等の型宣言子あるいは dimension 
文で宣言する。
配列の次元数は添字の上下限の組の数に等しく、$a_1(l_1:u_1)$ は１次元
配列、$a_2(l_2:u_2,l_3:u_3)$ は２次元配列である。添字の下限が１の時は、
下限を省略し $a_1(u_1),a_2(u_2,u_3)$ の様に書ける。
\begin{verbatim}
      implicit real*8 (a-h,o-z)
      dimension a(10),k(10)
c
      do i=1,5
         k(i)=2*i+1
         a(i)=1/dble(3*i-1)
      end do
c
      write(*,*) (k(i),i=1,5)
      write(*,*) (a(i),i=1,5)
c
      end
\end{verbatim}
なお、ここで dble() は整数型を実数型に変換する組み込み関数である。

\subsection{サブルーチン}

関数副プログラムは出力できる値が１つに限られていた。サブルーチン副プロ
グラムを使うと、複数の値を出力できる。また、配列の引渡しなども自由に行な
える。

\bigskip
1)サブルーチンの定義

subroutine $s(d_1,d_2,...)$

.....

return

end

$s:$ サブルーチン名 $d_i:$ 引数

\bigskip

2)引用法：

call $s(a_1,a_2,...)$

$s:$ サブルーチン名 $a_i:$ 実引数

\bigskip

引数には変数名の他、配列名も書くことができる。

\end{document}

