マンガでよめる痔のこと・薬のこと

 立方根を求める関数と、積分の関数を組み合わせて、x1/3を積分する関数を作りたいのですが、積分範囲は 0から1 0から2 0から3 0から4
4から5 4から6 4から7 4から8 のものを求めたくて、あと一歩のところをどうかいていいか迷っています。
なるべくきれいな形にしたいです。範囲指定をどう表し、また、一番スマートでしょうか。どなたかご指導お願いいたします。。。
(><;)ちなみに下は途中まで出来たプログラムです!!


sub cbrt {
local($a)=@_;
local($x0,$x1);

$x0=1;
$x1=(2*$x0**3+$a)/(3*$x0**2);
while( abs($x1-$x0)> 1.e-15) {
$x0=$x1;
$x1=(2*$x0**3+$a)/(3*$x0**2);
}
return $x0;
}

sub simp { # シンプソン法による積分
local($a, $b, $n)=@_;
local($s)=0;
local($dx)=($b-$a)/$n;
local($x);

for($x=$a+$dx; $x<$b; $x += $dx ) {
$s += (2*cbrt($x-$dx/2)+cbrt($x))/3;
}
$s += cbrt($a)/6 -cbrt($b)/6;

return $s*$dx;
}
print simp(0,1,10000/2), "\n";

A 回答 (1件)

すでに十分できているように見えるのですが、


どの辺に不満な点があるのでしょうか。
例えば積分範囲0~2は
 print simp(0,2,10000/2), "\n";
で求められるようにできているようですし。


なお、タイトルにもなっている三乗根ですが
 sub cbrt {return $_[0]**(1/3);}
で求められると思います。
(反復して求めるプログラムを書くことそのものが目的だったのであれば無視してください。)
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング