• ベストアンサー

プログラミングについて質問です。

実は先日、授業で以下のような課題が出ました。 32*x^6-192*x^5+452*x^4-448*x^3+210*x^2-36*x+1=0 の 0≦X≦2 の中の解全てをNewton法で ・精度 ε = 10^(-6) 程度 ・Fortran等のプログラミング言語によってプログラムしそのリストを提出せよ。 一応、以下のように作ってみたんですが・・・ プログラム文(Java言語) public class Newton{ public static void main(String[]args){ double x,x_new; x=0; while(true){ x_new=x-(32*x*x*x*x*x*x+192*x*x*x*x*x+432*x*x*x*x+448*x*x*x+210*x*x+36*x+1)/(192*x*x*x*x*x+960*x*x*x*x+1728*x*x*x+1344*x*x+420*x+36); if(Math.abs(x_new-x)<Math.pow(10.0,-6)){ System.out.print("Answer x="); System.out.println(x); break; } else if(Math.abs(x_new-x)>Math.pow(10.0,5.0)){ System.out.println("No Solution"); break; } else{ x=x_new; } } } } 出力結果 x=-0.03407365205941606 という感じでやってみたんですけど、いまいち合ってるのかどうか分かりません。どなたかアドバイスください。

質問者が選んだベストアンサー

  • ベストアンサー
  • kacchann
  • ベストアンサー率58% (347/594)
回答No.1

参考程度にしてくださいませ… ------------- まずは確認…。 関数式 「32*x*x*x*x*x*x+192*x*x*x*x*x+432*x*x*x*x+448*x*x*x+210*x*x+36*x+1」 「192*x*x*x*x*x+960*x*x*x*x+1728*x*x*x+1344*x*x+420*x+36」 の係数の正負、ぜんぶ正になってるけど、まちがい? あと冒頭に提示された式 「32*x^6-192*x^5+452*x^4-448*x^3+210*x^2-36*x+1=0」 の"452"という係数、本当は432ですよね? -------------- この関数、(xy平面に)グラフを書いてみると、 0≦x≦2の範囲で、 x軸と6個の点で交わる(6個の解を持つ)ようです。 (※導関数がキレイに因数分解できるので、グラフの概要がつかめる) -------------- ってことで、 (matecalorieさんのソースコードでは ”初期値”に0を与えて計算していますが、 これでは解が1個しか求まらないので) 定義域(0≦x≦2)の区間をもっと細かく区切って いろいろな初期値を与えて計算してみては? たとえば 初期値「0.0」「0.1」「0.2」... 「1.9」「2.0」 というふうに。 --------------- 厳密な解法でなくてゴメンm(_ _)m --------------- 面白いJavaアプレット見つけました(参考URL)

参考URL:
http://gtr01.adin.hamamatsu-u.ac.jp:8080/Apl26.html
matecalorie
質問者

お礼

回答有り難うございます。 「452"という係数、本当は432ですよね」→452です。 入力ミスでした。申し訳ありません。 恥ずかしながら、本当に初心者なものでイマイチどこをどう直していいかもあんまりわからないんです。

その他の回答 (1)

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

まずx=-0.03...ですが、これがNGなのは一目瞭然です。0≦x≦2の範囲外ですから。 以下、気がついた点を述べます。 f(x)=32*x^6-192*x^5+432*x^4-448*x^3+210*x^2-36*x+1=0 としたとき(No1の方が指摘されてますように452は432と解釈します) x_new=x-f(x)/f’(x)ですが、(f’(x)はf(x)の導関数とします) 1.f(x)が誤っています。(No1の方が指摘されてますように符号が全て同じ) 2.f’(x)が誤っています。(No1の方が指摘されてますように符号が全て同じ) 上記のf(x),f’(x)をまずは正しく記述してください 3.No1の方が指摘されてますように、初期値を0から開始したケースしか行っていません。従って、以下のように改造してください。 1)初期値:x0を受け取り、解を求める関数。   戻り値は、-1の時、解なし。解ありの時、解:x 2)上記の関数をx0=0~2迄の間、0.01刻みで呼び出します。呼び出した結果、解ありのケースを取り出せば、それが求める結果です。 3)得られた結果:xが正しいかどうかは、実際にその値からf(x)を求め、それがf(x)≒0であれば、OKということになります。

matecalorie
質問者

お礼

回答頂き有り難うございます。 初歩的な入力ミスなどをいくつかしていたようです。 ただ、折角アドバイスを頂いたのですが、何分初心者の為どこをどう直せばいいのやら・・・といった感じです。

関連するQ&A