数値積分

台形公式とシンプソンの公式による数値積分を計算します。

台形公式

曲線の下方の台形の面積を求めて合計します。

関数 f(x) は定義されているものとし,引数を範囲と分割数にします。戻り値が台形の面積の合計です。

trapez(range,divn):=(

regional(sx,ex,dx,xn,yn,sum);

sx=range_1; //定義域左端

ex=range_2; //定義域右端

dx=(ex-sx)/divn; //刻み幅

xn=apply(0..divn,sx+#*dx); // sxからexまでをn等分した分点のリスト

yn=apply(xn,f(#));

sum=0;

repeat(divn,

drawpoly([[xn_#,0],[xn_#,yn_#],[xn_(#+1),yn_(#+1)],[xn_(#+1),0]],color->[0,0.8,0],alpha->0.7);

connect([[xn_#,0],[xn_#,yn_#],[xn_(#+1),yn_(#+1)],[xn_(#+1),0]]);

sum=sum+dx*(yn_#+yn_(#+1))/2;

);

);

シンプソンの公式

曲線の下方の図形を線分ではなく放物線で近似します。

sympson(range,divn):=(

regional(sx,ex,dx,xn,yn,sum,x0,x1,x2,y0,y1,y2);

sx=range_1; //定義域左端

ex=range_2; //定義域右端

dx=(ex-sx)/divn; //区間幅

xn=apply(0..n,sx+#*dx); // sxからexまでをn等分した分点のリスト

yn=apply(xn,f(#));

p(x,x0,y0,x1,y1,x2,y2):=(x-x1)*(x-x2)*y0/((x0-x1)*(x0-x2))+(x-x0)*(x-x2)*y1/((x1-x0)*(x1-x2))+(x-x0)*(x-x1)*y2/((x2-x0)*(x2-x1)); //3点を通る放物線

sum=0;

dx=dx/2;

repeat(n,i,

x0=xn_i;

x1=(xn_i+xn_(i+1))/2;

x2=xn_(i+1);

y0=yn_i;

y1=f(x1);

y2=yn_(i+1);

draw([x0,0],[x0,y0],color->[0,0.8,0],alpha->0.7);

draw([x1,0],[x1,y1],color->[0,0.8,0],alpha->0.7);

draw([x2,0],[x2,y2],color->[0,0.8,0],alpha->0.7);

plot(p(#,x0,y0,x1,y1,x2,y2),start->x0,stop->x2,color->[0,0.7,0]);

sum=sum+dx*(y0+4*y1+y2)/3;

);

sum;

);

たとえば,次のようにして使います。

f(x):=1/(x^2+1);

n=20;

plot(f(#),color->[0,0,0]);

ret=4*trapez([0,1],n); または ret=4*sympson([0,1],n);

drawtext([5,2],"分割の数="+n,size->16);

drawtext([5,1],"近似した面積の和="+ret,size->16);

< 戻る