HOME»基本情報技術者試験掲示板»平成21年秋期午後問8のc,dについて
投稿する

[3269] 平成21年秋期午後問8のc,dについて

 黒犬さん(No.1) 
閲覧いただきありがとうございます。
問8のc,dですが、回答は「エ」「イ」(b[n-1]とb[k])でした。
自分は「カ」「ア」(b[n-1]×x+b[n-2],b[k-1])でしたが間違いでした。
しかし間違いの理由がわかりません。自分の回答でもbは問題なく処理されるように思います。
自分の回答だとどこがうまくいかず、正解の回答がなぜ正解なのかご教示いただければと思います。
よろしくお願いいたします。
https://www.fe-siken.com/kakomon/21_aki/pm08.html
2021.05.02 17:14
GinSanaさん(No.2) 
FE シルバーマイスター
コードにしてみました。awkですけども
#!/usr/bin/gawk -f
# 2021050201.awk
# gawk -f 2021050201.awk

BEGIN{
x = 2.5;
a3 = 1;
a2 = -3;
a1 = -1;
a0 = 3;

b2 = 3.0 * a3;
b1 = 2.0 * a2;
b0 = a1;

for(i = 1; i <= 100; i++){
temp = a3 * x;
temp = temp + a2;
temp = temp * x + a1;
f = temp * x + a0;

temp2 = b2 * x + b1;
d = temp2 * x + b0;
# OFMT="%.7f";
printf("%s%.7f%s%.7f%s%.7f\n", "x : ", x, "\tf : ", f, "\td : ", d);
x = x - f / d;
}
}
どういう動きをするか、これでどうでしょう。
変更前  d : 3, i : 1
変更後  d : 1.5, i : 1
変更前  d : -2.25, i : 1, k : 1
変更後  d : -6.625, i : 1, k : 1
変更前  d : -17.5625, i : 1, k : 0
変更後  d : -43.9062, i : 1, k : 0
x : 2.5000000 f : -2.6250000 d : -43.9062500
変更前  d : 3, i : 2
変更後  d : 1.32064, i : 2
変更前  d : -2.77736, i : 2, k : 1
変更後  d : -7.77734, i : 2, k : 1
変更前  d : -19.9784, i : 2, k : 0
変更後  d : -48.7515, i : 2, k : 0
x : 2.4402135 f : -2.7735416 d : -48.7514850
変更前  d : 3, i : 3
変更後  d : 1.14997, i : 3
変更前  d : -3.25926, i : 3, k : 1
変更後  d : -8.76787, i : 3, k : 1
変更前  d : -21.8966, i : 3, k : 0
変更後  d : -52.1868, i : 3, k : 0
x : 2.3833221 f : -2.8861909 d : -52.1867682
変更前  d : 3, i : 4
変更後  d : 0.984051, i : 4
変更前  d : -3.70911, i : 4, k : 1
変更後  d : -9.63488, i : 4, k : 1
変更前  d : -23.4302, i : 4, k : 0
変更後  d : -54.5458, i : 4, k : 0
x : 2.3280171 f : -2.9699384 d : -54.5458030
変更前  d : 3, i : 5
変更後  d : 0.820706, i : 5
変更前  d : -4.13407, i : 5, k : 1
変更後  d : -10.3991, i : 5, k : 1
変更前  d : -24.643, i : 5, k : 0
変更後  d : -56.0277, i : 5, k : 0
x : 2.2735685 f : -3.0285755 d : -56.0276514
変更前  d : 3, i : 6
変更後  d : 0.658541, i : 6
変更前  d : -4.53836, i : 6, k : 1
変更後  d : -11.073, i : 6, k : 1
変更前  d : -25.5766, i : 6, k : 0
変更後  d : -56.7675, i : 6, k : 0
x : 2.2195135 f : -3.0643774 d : -56.7675360
変更前  d : 3, i : 7
変更後  d : 0.496597, i : 7
変更前  d : -4.9246, i : 7, k : 1
変更後  d : -11.6644, i : 7, k : 1
変更前  d : -26.2596, i : 7, k : 0
変更後  d : -56.866, i : 7, k : 0
x : 2.1655324 f : -3.0787937 d : -56.8660301
変更前  d : 3, i : 8
変更後  d : 0.334174, i : 8
変更前  d : -5.29443
2021.05.02 20:06
GinSanaさん(No.3) 
FE シルバーマイスター
まちがえた、こっちがアルゴリズム2です
#!/usr/bin/gawk -f
# 2021050202.awk
# gawk -f 2021050202.awk -v n=3 -v x=2.5

BEGIN{
# 1 <= n <= 9;
n = n + 0;
if(n < 1 || n > 9){
exit 99;
}

Stores();

for(k = n; k >= 1; k--){
b[k - 1] = k * a[k];
}

for(i = 1; i <= 100; i++){
f = a[n] * x + a[n - 1];
# cはエ:b[n-1]
d = b[n - 1];
# この時点でdは?
print "変更前  d : "d", i : "i;
# これをカ(b[n-1]×x+b[n-2])に変えると?
d = b[n - 1] * x + b[n - 2];
print "変更後  d : "d", i : "i;
for(k = n - 2; k >= 0; k--){
f = f * x + a[k];
# dはイ:b[k]
d = d * x + b[k];
print "変更前  d : "d", i : "i", k : "k;
# これをア(b[k-1])に変えると?
d = d * x + b[k - 1];
print "変更後  d : "d", i : "i", k : "k;
}
printf("%s%.7f%s%.7f%s%.7f\n", "x : ", x, "\tf : ", f, "\td : ", d);
x = x - f / d;
}
delete a;
delete b;
}

function Stores(){
# めんどうくさいので、3次までにしてある
a[3] = 1;
a[2] = -3;
a[1] = -1;
a[0] = 3;
b[0] = 1 * a[1];
b[1] = 2 * a[2];
b[2] = 3 * a[3];
}



正常な場合はこうなります
小数点とかが実装により異なるのでそのあたりはあまりつっこまないでください(gawkなら53桁まではいける)
x : 2.5000000 f : -2.6250000 d : 2.7500000
x : 3.4545455 f : 4.9699474 d : 14.0743802
x : 3.1014253 f : 0.8741682 d : 9.2479648
x : 3.0068998 f : 0.0554845 d : 8.0829406
x : 3.0000354 f : 0.0002834 d : 8.0004251
x : 3.0000000 f : 0.0000000 d : 8.0000000
x : 3.0000000 f : 0.0000000 d : 8.0000000
x : 3.0000000 f : 0.0000000 d : 8.0000000
x : 3.0000000 f : 0.0000000 d : 8.0000000
x : 3.0000000 f : 0.0000000 d : 8.0000000
x : 3.0000000 f : 0.0000000 d : 8.0000000
x : 3.0000000 f : 0.0000000 d : 8.0000000
2021.05.02 20:08
GinSanaさん(No.4) 
FE シルバーマイスター
まあ、これだと説明になっていなさそうですが、簡単なのは、アルゴリズム1を一般化したのがアルゴリズム2なんだから、実値はアルゴリズム1で投入したものにして、printで出力される値になるか1回トレースしてみてください。めんどうくさいとコメントで書いたのは、9次方程式とかまでやるよりは、答えがわかっているもので配列を書きだしたかったためです。
現に計算中の配列の参照が違うので、期待される出力になっていないわけです。
2021.05.02 20:20
 黒犬さん(No.5) 
お忙しい中ご丁寧にありがとうございます。
こちら参考させていただき、正答を導けるよう理解致します。
あらためてご回答ありがとうございました。
2021.05.02 20:55
GinSanaさん(No.6) 
FE シルバーマイスター
あ、しまった。
d = d * x + b[k];
print "変更前  d : "d", i : "i", k : "k;
# これをア(b[k-1])に変えると?
d = d * x + b[k - 1];
print "変更後  d : "d", i : "i", k : "k;
と書いてましたが、dの値がすでに変わってからまた変更後を見ようとしているので、正確な変更後にはなってませんでした。
すみませんが、後で鉛筆と電卓で計算してみてください。

2021.05.02 22:21

返信投稿用フォーム

スパム防止のためにスレッド作成日から30日経過したスレッドへの書込みはできません。
© 2010-2024 基本情報技術者試験ドットコム All Rights Reserved.

Pagetop