人に聞けない痔の悩み、これでスッキリ >>

ニュートン法、2分法について質問があります。
この二つの長所と短所はなんですか?

ニュートン法はf'が0のとき解に収束しないのがわかりましたがほかにもありますか

こういう場合はこっちのほうがすぐれているなどがありましたらお願いします。

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

A 回答 (2件)

ニュートン法の欠点を付け加えておきます。



ニュートン法の方が大抵収束が速いのですが、例外があるのが欠点です。

重根の収束は遅くなります。
しかも、解の精度は悪いです。
求めたい範囲から、次の近似値が飛び出して行ってしまうこともあります。
振動を繰り返しながら解に近づくこともあれば、そのまま発散することもあります。
つまり、普段は優等生ですが、見張りが必要なんです。
    • good
    • 1

 詳しくは自分で体験してみることが良いと思いますが、大雑把には次のことが言えると思います。



1) ニュートン法の方が収束が早い。
2) 二分法は連続関数ならば必ず収束する。
3) 二分法ならば解の精度は予測できる。
4) 二分法は関数の微係数を必要としない。
5) 同じ演算回数ならば、二分法の方が計算負荷が軽い。(微係数の計算が不要なので)
    • good
    • 1

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

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

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

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

Q2分法で方程式の複数の解を自動的に求めるには?

2分法を授業で習い、アルゴリズムは理解できました。
そして、2分法で方程式の解を求めるプログラムも完成したのですが、

3次方程式などの全ての解を2分法で求める場合、本来ならば、
グラフなどを描き、適切な初期値を自分で変更していく必要があると思います。

しかし、方程式の複数の解を自動的に求めたいのです。


もし、2分法で方程式の複数の解を自動的に求めるアルゴリズムがあれば教えていただけないでしょうか。

よろしくお願いします。


※ 私が作成したプログラム(C言語)も載せておきます。

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

double f(double x)
{
return ((x-1.0)*(x-2.0)*(x-3.0));
}

int main ()
{
int i;
double a,b,x;
double gosa = 1.0e-14;

printf("aの値を入力してください。\n");
scanf("%lf",&a);
printf("bの値を入力してください。\n");
scanf("%lf",&b);

if(f(a)*f(b) >0) printf("aとbの範囲の中に適切な解が存在しません。\n");

while(1){

x = (a+b)/2.0;
printf("%.14f\n",x);

if(fabs(b-a)<gosa) break;

if(f(a)*f(x)<=0){
b = x;
}
else{
a = x;
}

}
return(0);
}

2分法を授業で習い、アルゴリズムは理解できました。
そして、2分法で方程式の解を求めるプログラムも完成したのですが、

3次方程式などの全ての解を2分法で求める場合、本来ならば、
グラフなどを描き、適切な初期値を自分で変更していく必要があると思います。

しかし、方程式の複数の解を自動的に求めたいのです。


もし、2分法で方程式の複数の解を自動的に求めるアルゴリズムがあれば教えていただけないでしょうか。

よろしくお願いします。


※ 私が作成したプログラム(C言語)も載せておきます。...続きを読む

Aベストアンサー

#1 では「一般論的には不可能」と書きましたが, 解くべき方程式が「重解を持たない」実係数代数方程式 (つまり「実係数多項式 = 0」の形) で, かつ「係数を与えている」場合にはすべての実解を見つけることが可能です.

これは二分法では「それぞれの解に対し, その解を (そしてその解だけを) 含む区間を決定する」ことができればよいわけですが, そのためには「与えられた区間にどれだけの解を持つか」がわかれば十分です. もちろんこれ自体が一般には無理ですが, 上の条件を満たせば「Strum列」というものを考えることで可能となります.

詳細は参照URL を見てほしいわけですが, ここで「数式として微分する」という操作が必要なので「係数を与える」ことが条件に入ってきます.

参考URL:http://www.math.meiji.ac.jp/~mk/labo/text/eigen-values/node53.html

Qニュートン法で解が収束しない

こんにちは。
差分式で表した非線形方程式をニュートン法で解いています。が収束しな解あります。ニュートン法は初期値に依存しているため、初期値を可変的にしてみましたがダメでした。何かいい方法はないでしょうか?
参考になるか分かりませんが、使っているプログラムのニュートン法の計算の一部は以下のようです。
call g(x,f,df)
h=f/df
x=x-h
if(dabs(h/x)<1.d-14) then
 return
endif

Aベストアンサー

z の値がないのですが、x → y, y → z と考えてよろしいですよね。

ニュートン法で計算してみると確かに収束しないですね。

与えられたパラメータを入れてグラフを書いてみると解はx = B の近傍にありました。これは図を描かなくても f の両辺を C で割ると分かります。

f/C=A/C*x - y*((cos(x)-cos(B))/(x-B))/C-z*((sin(x)-sin(B))/(x-B))/C + 1

右辺の第二項と第三項はいずれも x = B の近くでゼロに近い値となりますし、A/C * B はほとんど -1です。

で、この関数を見てみると x = B を境にして心電図の波形のように一旦跳ね上がってから潜り込み再び跳ね上がるような形をしています。ちょうど解が存在する辺りに変極点を複数持っています。この場合残念ながらニュートン法ではうまく収束しません。

また、(cos(x)-cos(B))/(x-B) や (sin(x)-sin(B))/(x-B) は式の上ではx → B の極限で -sin(B) と cos(B) に収束するのですが、数値計算上はゼロで割ることになるので値が不定となります。

解の近くに変極点が複数あること、解の近くで関数の計算自体が困難であることから、この関数に対してニュートン法は適していないと思います。

これだけではあまり前向きのアドバイスにならないので、一言付け加えるとすると、もし解が x = B の近くにあることが前もって分かっているならば、x=Bの近傍で展開した式

f = A*x + y * sin(B) - z * cos(B) + C

を使うという手があります。この場合は手計算で解けちゃいますね。

z の値がないのですが、x → y, y → z と考えてよろしいですよね。

ニュートン法で計算してみると確かに収束しないですね。

与えられたパラメータを入れてグラフを書いてみると解はx = B の近傍にありました。これは図を描かなくても f の両辺を C で割ると分かります。

f/C=A/C*x - y*((cos(x)-cos(B))/(x-B))/C-z*((sin(x)-sin(B))/(x-B))/C + 1

右辺の第二項と第三項はいずれも x = B の近くでゼロに近い値となりますし、A/C * B はほとんど -1です。

で、この関数を見てみると x = B を境にして...続きを読む

Q方程式を2分法を用いて解くプログラム

学校で出されたCプログラムの課題で、1問だけどうしても出来ない問題があるんです。
「方程式 f(x) = x2 - 2 = 0 を 2 分法を用いて解くプログラムを作成せよ。ここで、方程式 f(x) = x2 - 2 は関数として定義せよ。上位の方から 4 桁目まで正しい値が出たらループを止めるようにする。」
というものなのですが、この「2分法」というやり方もよく分かりません。
プログラムの作成方法と併せて教えて頂けると幸いです。

Aベストアンサー

こんな感じでしょうか?

#include <stdio.h>

/* 関数 f(x) */
double f(double x) {
 return x*x-2.0;
}

/* 二分法 初期値 x1<x2 と 誤差限界 eps を入力 */
double bisec(double x1, double x2, double eps) {
 double x;
 while (x2 - x1 >= eps) {
  x = (x1+x2)/2.0; /* 中点計算 */
  if (f(x1)*f(x) > 0.0) { /* 同符号か判定 */
   x1 = x;
  } else {
   x2 = x;
  }
 }
 return (x1+x2)/2.0;
}

int main(void) {
 double eps=0.00001;
 printf("%lf %lf\n",bisec(-2,0,eps), bisec(0,2,eps));

 return 0;
}

Qはさみうち法とニュートン法について

はさみうち法とニュートン法のプログラムのついてのことなんですが、ひとつずつ解を求めるプログラムは作れました。例えば三次方程式だったら三つの解をすべて求めるプログラムをつくるにはどうすればいいんでしょうか?

Aベストアンサー

元の式f(x)が多項式なら、#2のプロセス中のf(x)/(x-x1)の処理でf(x)の次数を下げることができます。
(f(x)/(x-x1)も多項式になるので、この式の係数を多項式の組み立て除法使って計算できる)
こうすると、3次式の1実根が求まれば、3次式→二次式に落とすことができるので、あとは二次方程式の解の式を使ったり、再度数値解方で根を求めたりできます。

(元の式が3次以上の実係数多項式の場合には、二次式(x^2+qx+p)の積(+一つの一次式)に分解(pとqを数値解方で決定する)して、二次式の解の公式使って各解を決定する、というアルゴリズムも結構使われるようです。(複素解も全て求めることができます))

Qニュートン法の収束性について

http://maya.phys.kyushu-u.ac.jp/~knomura/education/numerical-physics/text1/node5.html
ニュートン法は2次収束すると習ったのですが
これはどんな関数でも2次収束すると言って
良いのでしょうか?

実際にプログラムを組んでみて
y=X^4+7X^3-27X^2+29X-10
の収束性について調べてみました。
この関数は1で重解をもつので初期点を3にして
試してみた所1次収束性は確認できたのですが
2次収束性は確認できませんでした。

これはプログラム上のミスでしょうか?
それともニュートン法の2次収束性は全ての関数には
いえないものなのでしょうか?

Aベストアンサー

>これはプログラム上のミスでしょうか?
>それともニュートン法の2次収束性は全ての関数
>にはいえないものなのでしょうか?

ミスではなくこれがまさにニュートン法の特徴です。ニュートン法は関数の性質が事前によく分かっている場合やよい初期値を与えた場合には収束が速くて便利ですが、関数が単調でなくて変曲点を持つような場合には収束しないこともあります。

Qニュートン法について 初期値

ニュートン法の初期値の設定がいまいち分かりません。
たとえば
e^-x+(x/5)=1
は初期値5に決定することができるみたいなのですが
その理由を教えてください。

Aベストアンサー

y=f(x)=e^(-x)+(x/5)-1
y'=f'(x)=(1/5)-e^(-x)
f'(x)=0のとき x=log_e 5=xa≒1.6
f'(x)<0(x<xa),f'(xa)=0,0<f'(x)(x>x1)
x<xaの時
f(x)単調減少、f(0)=0 ⇒ f(x)<0 (0<x<xa)
x=xaで最小(極小)値min= f(xa)<0
x>xaで
f(x)単調増加, f(xa)<0<f(5)=1/e^5>0 ⇒ xa<x<5の間でf(x)=0

y=f(x)はx=0とxa<x<5の間でx軸と交点を持ちます。
x<x1で単調減少、x1<xで単調増加ですから
ニュートン法でxa≒1.6<x<5の与えられた方程式の解を求めるには
初期値xoをxa<xを満たし、できるだけx=5に近い初期値に選べば収束が早いという事です。
普通、初期値は半端でない区切りのよい値を選びますので、整数値なら
xo=5がベストです。xo=4,6,3,7の順に少しずつ収束回数が増加しますが、殆ど繰り返し回数の差は数回以内でしょう。ですから初期値xoは3以上であれば収束回数には殆ど差がないですから、必ずしもxo=5でなくても良いかと思います。
ただ,f(5)=(1/e^5)>0と値が確定的に決定できるという点でxo=5は分かりやすい数なのです。

これに反し、f(4)=(1/e^4)-(1/5)は直感的に正負が分かりにくいということです。きちんと計算すれば挟み撃ち法で
(1/3^4)-(1/5)=(1/81)-(1/5)<f(4)<(1/2^4)-(1/5)=(1/16)-(1/5)<0
⇒ f(4)<0
という事は分かりますが,f(5)のようなすっきりした値にはなりません。

y=f(x)=e^(-x)+(x/5)-1
y'=f'(x)=(1/5)-e^(-x)
f'(x)=0のとき x=log_e 5=xa≒1.6
f'(x)<0(x<xa),f'(xa)=0,0<f'(x)(x>x1)
x<xaの時
f(x)単調減少、f(0)=0 ⇒ f(x)<0 (0<x<xa)
x=xaで最小(極小)値min= f(xa)<0
x>xaで
f(x)単調増加, f(xa)<0<f(5)=1/e^5>0 ⇒ xa<x<5の間でf(x)=0

y=f(x)はx=0とxa<x<5の間でx軸と交点を持ちます。
x<x1で単調減少、x1<xで単調増加ですから
ニュートン法でxa≒1.6<x<5の与えられた方程式の解を求めるには
初期値xoをxa<xを満たし、できるだけx=5に近い初期値に選べば収...続きを読む

QNをkgに換算するには?

ある試験片に40kgの重りをつけた時の荷重は何Nをかけてあげると、重り40kgをつけたときの荷重と同等になるのでしょうか?一応断面積は40mm^2です。
1N=9.8kgfなので、「40kg=N×0.98」でいいのでしょうか?
ただ、式の意味がイマイチ理解できないので解説付きでご回答頂けると幸いです。
どなたか、わかる方よろしくお願いします。

Aベストアンサー

こんにちは。

kgfはSI単位ではないですが、質量の数値をそのまま重さとして考えることができるのがメリットですね。


>>>
ある試験片に40kgの重りをつけた時の荷重は何Nをかけてあげると、重り40kgをつけたときの荷重と同等になるのでしょうか?

なんか、日本語が変ですね。
「ある試験片に40kgの重りをつけた時の引っ張りの力は何Nの力で引っ張るのと同じですか?」
ということですか?

・・・であるとして、回答します。

40kgのおもりなので、「おもりにかかる重力」は40kgfです。

重力は万有引力の一種ですから、おもりにも試験片にも、地球からの重力はかかります。
しかし、試験片の片方が固定されているため、見かけ、無重力で、試験片だけに40kgfの力だけがかかっているのと同じ状況になります。

試験片にかかる引っ張り力は、

40kgf = 40kg×重力加速度
 = 40kg×9.8m/s^2
 = だいたい400N

あるいは、
102グラム(0.102kg)の物体にかかる重力が1Nなので、
40kg ÷ 0.102kg/N = だいたい400N


>>>1N=9.8kgfなので、「40kg=N×0.98」でいいのでしょうか?

いえ。
1kgf = 9.8N
ですね。


>>>一応断面積は40mm^2です。

力だけでなく、引っ張り応力を求めたいのでしょうか。
そうであれば、400Nを断面積で割るだけです。
400N/40mm^2 = 10N/mm^2 = 10^7 N/m^2
1N/m^2 の応力、圧力を1Pa(パスカル)と言いますから、
10^7 Pa (1千万パスカル) ですね。

こんにちは。

kgfはSI単位ではないですが、質量の数値をそのまま重さとして考えることができるのがメリットですね。


>>>
ある試験片に40kgの重りをつけた時の荷重は何Nをかけてあげると、重り40kgをつけたときの荷重と同等になるのでしょうか?

なんか、日本語が変ですね。
「ある試験片に40kgの重りをつけた時の引っ張りの力は何Nの力で引っ張るのと同じですか?」
ということですか?

・・・であるとして、回答します。

40kgのおもりなので、「おもりにかかる重力」は40kg...続きを読む


人気Q&Aランキング