【先着1,000名様!】1,000円分をプレゼント!

ニュートン法の問題ですが、3の立方根をニュートン法で計算する問題で初期値がX0=1で繰り返し3回までの経過を示す問題です。
f(x+n)=fx(n+1)/fx'(n+1)
この式にf(x)=3^(1/3)
を代入すればいいのですか?
わかる方お願いします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

>f(x+n)=fx(n+1)/fx'(n+1)


この式の意味が分かりません。

f(x)=(x^3)-3 とおくと f'(x)=3x^2 となるから
ニュートン法の式は
x_n=-f(x_(n-1))/f'(x_(n-1)) +x_(n-1)
x_0=1,n=1,2,3,...
ここで、x_n の_n は n が x の下付き添え字であることを表します。

x_0=1とおいてニュートン法の式を繰り返し適用すると
x_1=1.666666667
x_2=1.471111111
x_3=1.442812098
x_4=1.442249790
のように
3^(1/3)=1.442249570…
へ近づいていきます。
    • good
    • 1
この回答へのお礼

式を入れてやってみたらできました。
ありがとうございます。

お礼日時:2007/08/02 14:09

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qセグメンテーション違反

C言語を使用しています。

構造体に値をいれようとしたら、コンパイルは出来るのですが、実行時に
「セグメンテーション違反です (core dumped)」
となってしまい、それ以上行えません。

構造体と代入したい変数との型は、合っています。

いろいろ本などで見ましたが、何が原因かわからず困っています。
教えてください。
宜しくお願いします。

Aベストアンサー

OSは何でしょうか。コンパイラは何を使用していますか?
通常、デバッグオプションをつけて実行すると、異常の発生したソースの箇所で止まりますので、それが手がかりになります。またNo1の方が言われてますように、ソースが公開できるのであれば、ソースを提示するのが良いかと思います。

QCで3乗根を求める方法

C言語で、ある値の3乗根を求める関数はないのでしょうか?
どなたかご存知の方教えてください<(_ _)>

Aベストアンサー

精度の問題はありますが……

math.h のなかの、pow() で出来ると思いますよ。

y = pow(x, 1.0 / 3.0);

Qがあるのにsqrtが・・・

最初にあるプログラムを作っていたのですが、その祭sqrtでエラーが出てしまったので、別にsqrtを使う短いプログラムを作りました。それが以下のものになります。(test3.c)

#include<stdio.h>
#include<math.h>

int main(void){
int atai;
double x=2.0;
atai=(int)sqrt(x);
printf("atai is %c",atai);
}


sqrtが動作するか確かめる為のものです。このプログラム(test3.c)で以下のエラーが出てしまいました。

/tmp/ccqEejZ1.o(.text+0x4d): In function `main':
test3.c: undefined reference to `sqrt'
collect2: ld はステータス 1 で終了しました

ちなみにLinux(Fedora core 4)を使用しています。
初心者ということもありなぜエラーが出るのか分かりません。
ちなみに<math.h>を使用しないプログラムは普通に動作します。
解決方法をご存知の方がいらっしゃいましたらご教授下さいませ。
よろしくお願いします。

最初にあるプログラムを作っていたのですが、その祭sqrtでエラーが出てしまったので、別にsqrtを使う短いプログラムを作りました。それが以下のものになります。(test3.c)

#include<stdio.h>
#include<math.h>

int main(void){
int atai;
double x=2.0;
atai=(int)sqrt(x);
printf("atai is %c",atai);
}


sqrtが動作するか確かめる為のものです。このプログラム(test3.c)で以下のエラーが出てしまいました。

/tmp/ccqEejZ1.o(.text+0x4d): In function `main':
test3.c: undefined r...続きを読む

Aベストアンサー

コンパイルのオプションつけてないとかないですよね?
たとえばTerminalとかだとコンパイル時に 『-lm』とかつけますが

Qニュートン法を使って解を求めるC言語プログラム

C言語を使って y=x^2-4x のyの解をニュートン法を使って求める
プログラムを作る課題を出されたんですが、ニュートン法が良く分かっていないので、いろいろ調べたり、人に聞いたりしたところ
#include<stdio.h>
#include<math.h>
void main()
{
int counter=0;
double an,g,f,sh=0.0001;
printf("初期値を入力して下さい==>");
scanf("%ld",&an);
do{
g=(an*an)/(2*an-4);
f=2*an-4;
counter++;
}while(fabs(f)>sh);
printf("反復回数 %d 回 y=%lf \n",counter,g);
}
でプログラムがこんな感じになったんですが、結局ニュートン法がどうなのかがわかりません。 なんか微分とかやるとか言われたんですが、工業系の学校で数学の授業が無いので微分についてがわかりません。
このプログラムは、コンパイルはできるんですが、動きません。
ニュートン法についてよくわからないのでどこが間違ってるかわかりません。 ニュートン法についてできるだけ分かりやすく解説してほしいです。

C言語を使って y=x^2-4x のyの解をニュートン法を使って求める
プログラムを作る課題を出されたんですが、ニュートン法が良く分かっていないので、いろいろ調べたり、人に聞いたりしたところ
#include<stdio.h>
#include<math.h>
void main()
{
int counter=0;
double an,g,f,sh=0.0001;
printf("初期値を入力して下さい==>");
scanf("%ld",&an);
do{
g=(an*an)/(2*an-4);
f=2*an-4;
counter++;
}while(fabs(f)>sh);
printf("反復回数 %d 回 y=%lf \n",counter,g);
}
でプログラムがこんな感...続きを読む

Aベストアンサー

ニュートン法を理解するには、せめて微分の初歩の初歩は理解して下さい。
とりあえず、必要なところだけ。

y=x^2-4x
の解をもとめるには、次のようにします。
計算途中の近似解をa(n)とすると、それを元に得られる、より精度の良い近似解a(n+1)は、
a(n+1)=(a(n)*a(n))/(2*a(n)-4)
として求められます。(ニュートン法の理論から)
これを繰り返していって、
|a(n+1)-a(n)| < 0.0001
となったときに、十分精度の良い解が得られたと判断し、計算を終了します。
(計算終了の閾値0.0001は提示されたプログラムから取りました。)

プログラムの間違いは、下記の2点。
誤:scanf("%ld",&an);
正:scanf("%lf",&an);

誤:f=2*an-4;
正:f=g-an; an=g;

上記を修正し、初期値が2より大きい場合は4.000000が、初期値が2未満のときは
0.000000が求められることを確かめて下さい。

Q3のつく数字と3の倍数のみを表示するプログラム

C言語で3のつく数字と3の倍数のみ(1~150)を表示するプログラムを作りたいのですがどうすればいいのでしょうか?

Aベストアンサー

数字で全部処理するとしたら、ある数x(1~150)について

・xが3で割り切れるかどうか?(x%3が0かどうか)
・xの下1桁目が3であるかどうか?(x%10が3かどうか)
・xの下2桁目が3であるかどうか?(x%100/10が3かどうか)

以上のことをif文等で場合分けすればいいかなと思います。
(汎用性を考えるなら、No.2さんの考え方の方が良いです)

Q平方根 ニュートン法について

こんにちは。趣味でプログラミングをしているものです。
さっそくですが、質問させていただきます。

Javaで文具店などで1000円くらいで市販されている
電卓を再現しようとしているのですが、
質問させていただきたいのは、
平方根の計算についてです。
--------------------------------------------
まずは以下のメソッドのコードを見ていただきたいのですが・・・

このメソッドを用いて3の平方根を求めてみました。

private static BigDecimal sqrt( BigDecimal value )
{
BigDecimal two = new BigDecimal( "2" );
BigDecimal x = value.divide( two );
BigDecimal last_x = BigDecimal.ZERO;
BigDecimal gap = x.subtract( last_x );

BigDecimal range = BigDecimal.ONE.movePointLeft( 11 );//(a)
//int cnt = 0;//(b)
BigDecimal t;
while( gap.compareTo(range) > 0 )//(c)
//while( cnt < 20 )//(d)
{
last_x = new BigDecimal( x.toString() );
t = value.divide( x, 64, BigDecimal.ROUND_DOWN );
x = x.add( t ).divide( two );
gap = x.subtract( last_x );//(e)
//cnt ++; //(f)
}
return x;
}

(a)(c)(e) を用いて実行すると
1.732142857142857142857・・・
と小数部分の142857 が循環する値になりました。

(a)(c)(e) をコメントアウトして
(b)(d)(f) を用いて実行すると
1.732050807568877293527446341505872366942805253
810380628055806979425806427001953125
とwikipedia の「3の平方根」の記事の値と
記述されている範囲では同じ値が得られました。
--------------------------------------------
そこで質問なのですが、
(1)
(a) (c) (e) を用いた場合には、正しい値を得られないのでしょうか?
条件に設定する値などを変えてもだめなのでしょうか?
(2)
自分が作っている電卓では12桁の表示を予定しているのですが
その場合、メソッド sqrt ないの cnt は while ループ内で
いくつまで、インクリメントすればよいのでしょうか?
(3)
インターネットで調べたこのアルゴリズムは
「ニュートン法」だそうですが、
y = x^2 - C の グラフ、接線などを書いてみて
ある程度理解できたのですが、

http://cpplover.blogspot.jp/2010/11/blog-post_20.html

上記サイトではこのアルゴリズムは
バビロニア人の方法(Babylonian method)
というものだそうですが、
バビロニア人は二次関数の微分はわかっていた、
ということでしょうか?
--------------------------------------------
ご存知のかた、教えていただけないでしょうか?
よろしくお願いします。

こんにちは。趣味でプログラミングをしているものです。
さっそくですが、質問させていただきます。

Javaで文具店などで1000円くらいで市販されている
電卓を再現しようとしているのですが、
質問させていただきたいのは、
平方根の計算についてです。
--------------------------------------------
まずは以下のメソッドのコードを見ていただきたいのですが・・・

このメソッドを用いて3の平方根を求めてみました。

private static BigDecimal sqrt( BigDecimal value )
{
BigDecimal two = new BigDeci...続きを読む

Aベストアンサー

示したtoString()による数字の表示例は、BigDecimalクラスのリファレンスより引用したものであります。
BigDecimalは、数字と小数点の有効桁数(スケール)を情報として持ちます。
#1の回答時は、一度toStringで渡しているため、スケールの情報も正しく渡るのか否か疑問がありました。クラスリファレンスの例のように帰ってしまうと2~3桁くらいで丸まってしまわないか、と。

混乱させてしまい申し訳ありません。

-----

再現して確認してみましたが、(a)(c)(e)の場合、

条件判定に使うgapの作り方
gap = x.subtract( last_x );//(e)

ループ終了判定
while( gap.compareTo(range) > 0 )//(c)

この条件がよくなさそうです。この条件によって、ループを2回しか回っていないので結果の精度が良くない。(b)(d)(f)の場合でも、ループを2回実行した場合の結果は、(a)(c)(e)と同様でした。

(1)条件判定に用いるgapの作り方
gap = x.subtract( last_x );//(e)

Xn (プログラム上変数x) と、 Xn-1 (同じくlast_x) の大小関係が保証できないので(一回目のxに依存する)、last_xとxの変化量は絶対値をとった方が良いでしょう。理由はrangeは常にプラスだからです。差分gapがマイナスの場合に不具合が出ます。これが今回、(c)においてループが2回で終わってしまった直接の原因です。

(2)ループ終了判定

(b)(d)(f)では、ループを必ず20回回るので、その分平方根の精度は良くなります。

確認方法は cnt ++; //(f) の下の行に以下のprintを追加して確認しました(toString()は省略できる)。
System.out.println(cnt + " Scale: lastx: " + last_x.scale() + "value: "+ last_x);
System.out.println(cnt + " Scale: t: " + t.scale() + "value: "+ t);
System.out.println(cnt + " Scale: x: " + x.scale() + "value: " + x);
System.out.println(cnt + " Scale: gap: " + gap.scale() + "value: " + gap);

ループ20回目のgapは、20 Scale: gap: 81 value: -2.5806427001953125E-65
すなわち小数点以下81桁まで有効で、-2.58*10^(-64)乗。rangeは10^(-11)乗なので、全然小さい。

(1)(2)より、このように変えてみました。

BigDecimal range = new BigDecimal(1.0e-64);//(a)

while (gap.abs().compareTo(range) > 0) //(c')

結果:
7Scale: lastx: 67value: 1.732050807568877293527446341505872366942805253810380628
0558069794125
7Scale: t: 64value: 1.732050807568877293527446341505872366942805253810380628
0558069794
7Scale: x: 68value: 1.732050807568877293527446341505872366942805253810380628
05580697940625
7Scale: gap: 68value: -6.25E-66

sqrt(3) = 1.73205080756887729352744634150587236694280525381038062805580697940625

ループ7回で抜けてくれました。

示したtoString()による数字の表示例は、BigDecimalクラスのリファレンスより引用したものであります。
BigDecimalは、数字と小数点の有効桁数(スケール)を情報として持ちます。
#1の回答時は、一度toStringで渡しているため、スケールの情報も正しく渡るのか否か疑問がありました。クラスリファレンスの例のように帰ってしまうと2~3桁くらいで丸まってしまわないか、と。

混乱させてしまい申し訳ありません。

-----

再現して確認してみましたが、(a)(c)(e)の場合、

条件判定に使うgapの作り方
gap = x.s...続きを読む


人気Q&Aランキング