好きなおでんの具材ドラフト会議しましょう

これをもとにf(x)=loge(4x²+1)の[0,1/2]の定積分を近似するプログラミングを台形公式を使い書け
var n = WScript.StdIn.ReadLine();
n = Number(n);

var a = 0;
var b = Math.PI;
var intv = [a,b];

var approx = trapezoid_approx(Math.sin,intv,n);
var exact = -Math.cos(b) + Math.cos(a);

WScript.Echo("近似値: " + approx);
WScript.Echo("厳密値: " + exact);


function trapezoid_approx(f, intv, n){
var delta = (intv[1]-intv[0])/n;
var approx = 0;

var left = intv[0];
var right = left + delta;

for(var i=0; i < n; i++){
approx += delta*(f(left) + f(right))/2;
left += delta;
right += delta;
}

return approx;
}

A 回答 (2件)

個人的には良い問題だ、と思う。


ネタ的には高階関数、つまり関数を引数を取る関数の問題、だ。

ただ、このコード自体は一般的なJavaScriptの関数「じゃない」ブツが混じってる。
環境は分かんないんだけど、恐らくWindowsで、VBScriptとやり取りする独自拡張の何かが入ってるんだよな。
冒頭の

> var n = WScript.StdIn.ReadLine();

とか、出力の

> WScript.Echo("近似値: " + approx);
> WScript.Echo("厳密値: " + exact);

がそれら、だ。
ただ、これは責められない。
っつーのもJavaScriptには入出力がない、んで、「なんかの助けがない」と入出力ができない。
後者はフツーのJSのプログラムだとconsole.logと言うWeb APIを使ったりするケースだろう。
当然、console.logもJavaScript本体の機能じゃない。
だから、入出力が絡むとJavaScriptの一般論は話しづらくなる。

参考までに、Node.jsと言うサーバーサイドJS環境をスタンドアロン処理系として使えば与題がどう書けるか、と言うのを挙げておく。

Node.jsによる実装例:
https://www.ideone.com/cZM4wR

さて、与題のコードのtrapezoid_approxを見てみる。
trapezoid_approxは3つ引数を取り、それらはf、 intv、 nだ。
fは与える関数、intvは定積分の為の区間、nは区間分割数だ。
この3つを変えるだけで色んな区間で、望みの分割数でfとx軸が織りなす図形の面積を求める事が出来る。
よって、trapezoid_approxは高階関数で、既に汎用的な定積分の為のプログラムだ。
従ってこれを弄る必要はない。
そっちじゃなくって、「定積分をする区間」と、「どういった関数を与えるのか」を作らなアカンのだけど、高校卒業した知識があればさして難しい問題じゃない筈だ。
関数trapezoid_approxにお題に従って与える関数は「f(x)=loge(4x²+1)」と指定されてる以上、

function fn(x) {
 return Math.log(4 * x * x + 1);
}

になる。
積分区間に付いても

> [0,1/2]の定積分

って書いてるんで

var a = 0;
var b = 1/2;
var intv = [a,b];

となるだけ、だ。
従って近似値の算出は

var approx = trapezoid_approx(fn,intv,n);

とならざるを得ない(nは入力から与えられる)。

厄介なのはむしろ厳密値の計算だろう。
要するに学校で習ってる通り、f(x)=loge(4x²+1)の積分ができないとならない。手計算で。出来る?
一応不定積分の答えを書いておくと

F(x) = Const. + x*loge(4*x^2+1)+atan(2*x)-2*x

だ。
つまり、JavaScriptでこいつもプログラムしとかないとなんない。

function Fn(x) {
 return x * Math.log(4 * x * x + 1) + Math.atan(2 * x) - 2 * x;
}

これを使えば定積分の数学的解はJavaScriptでは次のように記述出来る。

var exact = Fn(b) - Fn(a);

以上。
「台形公式」の回答画像2
    • good
    • 0

なんか質問じゃなくて命令になってますが、見た感じ、


> f(x)=loge(4x²+1)
に該当するコードが不足してるようなので、そちらを記述して、trapezoid_approx()で処理してみては。
    • good
    • 0
この回答へのお礼

どう処理をすればいいでしょうか?

お礼日時:2022/12/21 19:53

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


おすすめ情報