アルゴリズム講座―台形近似積分

「アルゴリズム講座―台形近似積分」の編集履歴(バックアップ)一覧はこちら

アルゴリズム講座―台形近似積分」(2010/09/21 (火) 16:15:37) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

コンピュータに積分をさせるとなると、(積分公式は使えないので)やはり近似的な方法を使うことになります。代表的な方法として -長方形近似法 -台形近似法 -シンプソン法 という方法が知られています。ここでは、台形近似による積分を扱います。 まず根本的に、どういう風に処理させるかを考えます。これは、非常に積分にとって原始的な方法をとることになります。すなわち、グラフを非常に小さく区切り、それぞれの区切られた区間の面積を求めていくことで実現します。以下の赤い部分ようなイメージです。 #ref(graph.png) 台形近似法では、これを台形に見立てて、その面積を足していく方針で積分を行います。 では、台形積分をする関数trap_integ(double (*func)(double a),double low,double high,double h)です。 仕様 機能:渡されたポインタの関数について、与えられた区間内で台形近似による積分を行います。 引数:double (*func)(double a)…引数にdouble型を一つ、返値がdouble型の、積分を行う関数へのポインタ   low…積分を行う区間の最低値   high…積分を行う区間の最高値   h…台形の高さをhにして計算します 返値:積分をした計算結果を返します double integ(double (*func)(double a),double low,double high,double h){ double x,result; for(x=low;x<=high;x+=h){ result+=((*func)(x+h)+(*func)(x))*h/2; } return result; } 使用例です。ここでは、f(x)=3x^2の0~2の区間について積分を行います。上の関数と一緒に書いて実行してみてください(ちなみに理論値は8、h=0.00001くらいにすると結果も8.000000になる)。 #include <stdio.h> double function(double); int main(){ printf("%lf\n",integ(function,0,2,0.001)); } double function(double x){ return 3*x*x; } 結果 8.012007
コンピュータに積分をさせるとなると、(積分公式は使えないので)やはり近似的な方法を使うことになります。代表的な方法として -長方形近似法 -台形近似法 -シンプソン法 という方法が知られています。ここでは、台形近似による積分を扱います。 まず根本的に、どういう風に処理させるかを考えます。これは、非常に積分にとって原始的な方法をとることになります。すなわち、グラフを非常に小さく区切り、それぞれの区切られた区間の面積を求めていくことで実現します。以下の赤い部分ようなイメージです。 #ref(graph.png) 台形近似法では、これを台形に見立てて、その面積を足していく方針で積分を行います。 では、台形積分をする関数trap_integ(double (*func)(double a),double low,double high,double h)です。 仕様 機能:渡されたポインタの関数について、与えられた区間内で台形近似による積分を行います。 引数:double (*func)(double a)…引数にdouble型を一つ、返値がdouble型の、積分を行う関数へのポインタ   low…積分を行う区間の最低値   high…積分を行う区間の最高値   h…台形の高さをhにして計算します 返値:積分をした計算結果を返します double integ(double (*func)(double a),double low,double high,double h){ double x,result; for(x=low;x<=high;x+=h){ result+=((*func)(x+h)+(*func)(x))*h/2; } return result; } 使用例です。ここでは、f(x)=3x^2の0~2の区間について積分を行います。上の関数と一緒に書いて実行してみてください(ちなみに理論値は8、h=0.00001くらいにすると結果も8.000000になる)。 #include <stdio.h> double function(double); int main(void){ printf("%lf\n",integ(function,0,2,0.001)); } double function(double x){ return 3*x*x; } 結果 8.012007

表示オプション

横に並べて表示:
変化行の前後のみ表示: