• ベストアンサー

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

実は先日、授業で以下のような課題が出ました。 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 という感じでやってみたんですけど、いまいち合ってるのかどうか分かりません。どなたかアドバイスください。

  • Java
  • 回答数2
  • ありがとう数3

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

  • ベストアンサー
  • 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

  • プログラミング(JAVA)について

    2つほど質問があります。どなたか回答していただける方がいたらお願いします。 1、以下のじゃんけんゲームのプログラムを作成したのですがfor文を用いてコードを短くするにはどうすればいいですか?      class jyanken { public static void main(String[] args) { int x = 0, y = 0; if (args[0].equals("グー")) { x = 0; } else if (args[0].equals("チョキ")) { x = 1; } else if (args[0].equals("パー")) { x = 2; } else { System.out.println("エラー"); } y = (int)(Math.random() * 10.0) % 3; if (x == 0) { if (y == 0) { System.out.println("あいこ"); } else if (y == 1) { System.out.println("勝ち"); } else if (y == 2) { System.out.println("負け"); } } else if (x == 1) { if (y == 1) { System.out.println("あいこ"); } else if (y == 2) { System.out.println("勝ち"); } else if (y == 0) { System.out.println("負け"); } } else if (x == 2) { if (y == 2) { System.out.println("あいこ"); } else if (y == 0) { System.out.println("勝ち"); } else if (y == 1) { System.out.println("負け"); } } } } 2、もう1パターンでじゃんけんプログラムを作成しようと考えているのですが。上手くできないので参考のファイルを掲示してもらえると嬉しいです。 機能としては、for文とif文を使用して。プログラムの起動と同時に、コンピュータがグー、チョキ、パーをランダムに出す(プレーヤに見せない) 次に人がグー、チョキ、パー何を出すかをキーボードで入力して最後にプログラムが出したものとコンピュータがランダムに出したものと比較し、勝負を表示する。といった感じです。

  • プログラミング(Java)について

    学校の課題で考えても、分からなかったので質問させてください。 下のプログラムを以下のように変更したいのです。 (1)正解の数から±20以下まで接近した時は「小さすぎます、でもあと少しです!!」または「大きすぎます、でもあと少しです!!」というメッセージを表示する。 (2)正解が出るまでに何回数字を入力したか数えて、正解が出た後で「正解が出るまで○○回かかりました」というメッセージを表示する。 (3)さらにその回数が5回以下だったら「すばらしい!」、その回数が10回以上だったら「間が鈍いですね」、5回と10回の間だったら「普通です」というメッセージを表示する。 import java.util.Scanner; public class kazuate{ public static void main(String args[]){ Scanner kbd = new Scanner(System.in); int x; boolean flag = true; int seikai = (int)(Math.random() * 1000); System.out.println("数当てゲームを始めます"); System.out.println("0~999の数字を入力してください"); while(flag){ x = kbd.nextInt(); if (x >= 0 && x < seikai){ System.out.println("小さすぎます、もう1回!"); }else if(x > seikai && x <= 999){ System.out.println("大きすぎます、もう1回!"); }else if(x == seikai){ System.out.println("正解です!"); flag = false; }else{ System.out.println("入力するのは0~999です。やり直してください"); } } } よろしくお願いします。

  • どこに・・・

    import java.io.*; class janken { public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.print("あなたの手を入力して下さい。(1:グー、2:チョキ、3:パー)?\n"); String str = br.readLine(); int a = Integer.parseInt(str); switch(a){ case 1: System.out.println("あなたの手はグーです。"); break; case 2: System.out.println("あなたの手はチョキです。"); break; case 3: System.out.println("あなたの手はパーです。"); break; default: System.out.println("1~3を入力してください。"); break; } { int ran = ((int)(Math.random()*3)+1); int b=ran; switch(b){ case 1: System.out.println("コンピュータの手はグーです。"); break; case 2: System.out.println("コンピュータの手はチョキです。"); break; case 3: System.out.println("コンピュータの手はパーです。"); break; } int c; c=a-b; if(c == 2){ System.out.println("勝ち"); } else if(c== -1){ System.out.println("勝ち"); } else if(c==0){ System.out.println("あいこ"); } else if(c==1){ System.out.println("負け"); } else { System.out.println("負け"); } } } } いまjavaの勉強をしており、練習をかてね上のようにじゃんけんのプログラムを書きました。今の段階で、一様動くのですが、一回ごとにじゃんけんが終了されてしまいます。そこで繰り返し文のwhile(a != x)を使って数値を入力したら終了するように考えているんですが、whileをどこに入れたらいいのかがわかりません・・・ 自分でいろんなところに入れて試して見たんですが、無限ループになったりして、終了してくれません。どこにwhileを入れたらいいのでしょうか?それてもwhileじゃないほうがいいのでしょうか?アドバイスお願いします。

    • ベストアンサー
    • Java
  • 例外処理

    import java.io.*; class janken { public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int k=0,m=0,h=0,z=0; while(true){ System.out.print("あなたの手を入力して下さい。(1:グー、2:チョキ、3:パー、0:終了)?\n"); String str = br.readLine(); int a = Integer.parseInt(str); if(a == 0){ break; } z++; switch(a){ case 1: System.out.println("あなたの手はグーです。"); break; case 2: System.out.println("あなたの手はチョキです。"); break; case 3: System.out.println("あなたの手はパーです。"); break; default: System.out.println("1~3を入力してください。"); break; } { int ran = ((int)(Math.random()*3)+1); int b=ran; switch(b){ case 1: System.out.println("コンピュータの手はグーです。"); break; case 2: System.out.println("コンピュータの手はチョキです。"); break; case 3: System.out.println("コンピュータの手はパーです。"); break; } int c; c=a-b; if(c == 2){ System.out.println("あなたの勝ちです。"); k++; } else if(c== -1){ System.out.println("あなたの勝ちです。"); k++; } else if(c==0){ System.out.println("あいこです。"); h++; } else if(c==1){ System.out.println("コンピュータの勝ちです。"); m++; } else { System.out.println("コンピュータの勝ちです。"); m++; } } } System.out.println("じゃんけん終了。"); System.out.println("あなたは"+z+"試合中、"+k+"勝"+m+"敗"+h+"分けです"); } } このようにじゃんけんのプログラムを作りました。 しかし0~3以外の数字が入力されても、じゃんけんの勝敗を勝手に判定してしまいます・・・ try文でやってみたのですがいまいちうまくいきませんでした。 0~3を入力したら入力エラーと表示して、ふたたびユーザーの手を聞くようにしたいです。 どうすればよいかアドバイスお願いします。

    • ベストアンサー
    • Java
  • javaで課題を出されています

    題名の通りなのですが、javaのプログラミングで課題を出されていて うまく書けません お題としては 1 if分と論理演算を使うこと。 2 forまたはwhileを使用すること 3 メソッドを使用すること。(main以外で) 4 配列を使用すること 以上なのですが、一応昔スロットプログラムを作っていたのでこれをベースに作ろうかなと考えています import java.io.*; public class Slot01{ public static void main(String[] args){ try{ //String line =reader.readLine(); BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); System.out.println("こんにちは!スロットゲームへようこそ!"); System.out.println("EnterKeyを押して当たりを出してくださいね!"); while(true){ //while文は処理を繰り返すためのものです。 // ▽これよりソースを打ち込んでください //try{ int x=(int)(Math.random()*9)+1; int y=(int)(Math.random()*9)+1; int z=(int)(Math.random()*9)+1; int[]kakuritu; int sum; System.out.print(x); System.out.print(y); System.out.print(z); System.out.println(""); String line =reader.readLine(); //System.out.println(""); if(x==7&&y==7&&z==7){ System.out.println("スーパー大当たり"); }else if(x==y&&y==z){ System.out.println("大当たり"); }else if(x==y||y==z||x==z){ System.out.println("小当たり"); }else{ System.out.println("外れ"); } }//while文の終わり }catch (IOException e){ System.out.println(e); }catch (NumberFormatException e){ System.out.println("正しい形式で表示してください。"); } } } このプログラムなのですが、1と2はこの中に入ってます。考えてみたのですが、このプログラムに当たり確率を表示させるプログラムなら3と4も満たせそうなのですが、いまいちソースが思いつきませんのでご教授お願いします。 文章おかしいところだらけで申し訳ありません。

    • ベストアンサー
    • Java
  • javaファイルの質問!

    public class kazuate{ public static void main(String args[]){ int computer = (int)(Math.random()*100)+1; int player = 0; int count = 0; System.out.println("数当てゲーム(範囲は0~99)"); System.out.println("何回で当てられるかな?"); while(true){ count++; System.out.print("数字を入力してください"); player = Integer.parseInt(args[0]); if(computer > player){ System.out.println("小さいです。"); }else if(computer < player){ System.out.println("大きいです。"); }else if(computer == player){ System.out.println(count +"回目で当りです。"); break; } } } } コンパインしたら break文を使っているのに繰り返しがとまらず永遠に回答が流れてしまいます。なぜでしょうか?

  • javaプログラミングについて

    ただいまjavaプログラム勉強中でhit&blowを制作しております。 public static void main(String[] args) { Scanner scan = new Scanner(System.in); Random rand = new Random(); int[] answer = new int[4]; int[] input = new int[4]; int[] Number = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, }; int x = 10; for (int i = 0; i < 4; i++) { int select = (int) (Math.random() * x); answer[i] = Number[select]; Number[select] = Number[x - 1]; x--; } int count = 1; while (true) { System.out.println("4桁の異なる数値を入力"); int str_input = scan.nextInt(); // 代入 for (int i = 0; i < 4; i++) { input[i] = str_input; } // hit int hit = 0; for (int i = 0; i < 4; i++) { if (input[i] == answer[i]) { hit++; } } // blow int blow = 0; for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++){ if (i != j && input[i] == answer[j]) { blow++; } } } if (hit == 4) { System.out.println("4hit"); System.out.println("正解まで " + count + "回"); break; } else { System.out.println("Hit:" + hit + " Blow:" + (blow - hit)); count++; } } } } 数字が4桁で作っているのですが、数字や4桁以上を入力してしまった場合の表示は後にしようとして、先にhitとblowの判定を作ろうとしているのですが、上記で実行したところhitとblowの判定がされずhit:0blow:0と表示されてしまいます。解決策を教えてください。 自分で作ってみたものの、hit blowの判定方法があっているかも自信がないです。

    • ベストアンサー
    • Java
  • 何故ループがしてくれないんですか?

    口でいうよりもソースコード載せた方が早いので載せます import java.util.Scanner; class StudentsList2 { public static void main(String[] args){ System.out.println("学生番号(23,45,78,51,9)を入力してください>"); Scanner sc=new Scanner(System.in); StList list=new StList(); list.ID=new int[]{23,45,78,51,9}; list.name=new String[]{"荒川","神田","吉田","渡辺","木村"}; int key=Integer.parseInt(sc.next()); list.getName(key); } static class StList{ public String[] name; public int[] ID; void getName(int key){ for(int A=0; A<ID.length; A++){ if(key==ID[0]){ System.out.println(name[0]);break; }else{ if(key==ID[1]){ System.out.println(name[1]);break; }else{ if(key==ID[2]){ System.out.println(name[2]);break; }else{ if(key==ID[3]){ System.out.println(name[3]);break; }else{ if(key==ID[4]){ System.out.println(name[4]);break; } } } } } } } } } 例外処理もなくエラーもかえって来ないんですが一回しか学生名が出力しないです。 何故でしょうか? nameに入っている名前を出力しないといけないですよね。 「ここがおかしいよ」とかのアドバイスをお願いします

    • ベストアンサー
    • Java
  • java プログラミングについて

    独学でjavaに挑戦中ですが、書店で購入した本のソースプログラムを少し変えたいのですが、ご教授をお願いします。数当てゲームのプログラムで、一つの設問を正解すると終了するゲームですが、複数の設問を設定したいのです、質問がうまく伝わるか不安ですがよろしくお願いします、プログラムを少しだけ書いておきます。 import java.io.*; class Mojiretuate { public static void main(String[] args) throws IOException { String str = "こんにちは";  /*質問箇所*/ String str2; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("文字列当てゲームです。"); System.out.println("答えは何かのあいさつです。"); for(;;){ System.out.println("\n入力:"); str2 = br.readLine(); System.out.println("入力文字列の長さ:" + str2.length()); if(str.equals(str2)){ System.out.println("正解です!"); break; } 

    • ベストアンサー
    • Java
  • javaじゃんけんゲーの質問

    このjavaじゃんけんゲームで 0を押すまでじゃんけんが続いて0押したら終了して、終了と表示して、じゃんけんの勝敗が表示されるように作りたいんですけどどうしたらいいですか?教えてください import java.io.*; class kadai6 { public static void main(String args[]) throws IOException { System.out.println("これは、じゃんけんゲームです。"); System.out.println("あなたの手を入力して下さい。(1:グー、2:チョキ、3:パー、0:終了)さぁどれにしますか?"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); int res =Integer.parseInt(str); switch(res){ case 1: System.out.println("あなたの手はグーです。"); break; case 2: System.out.println("あなたの手はチョキです。"); break; case 3: System.out.println("あなたの手はパーです。"); break; default: System.out.println("あなたの入力した値はエラーです。1~3の値を入力してください。"); System.exit(1); break; } int comp = (int)(Math.random()*3) + 1; switch (comp){ case 1: System.out.println("コンピュータの手はグーです。"); break; case 2: System.out.println("コンピュータの手はチョキです。"); break; case 3: System.out.println("コンピュータの手はパーです。"); break; default: System.out.println ("エラーです。"); break; } switch (res -comp) { case -2: System.out.println("コンピュータの勝ちです。"); break; case -1: System.out.println ("あなたの勝ちです。"); break; case 0: System.out.println ("あいこです。"); break; case 1: System.out.println ("コンピュータの勝ちです。"); break; case 2: System.out.println("あなたの勝ちです。"); break; default: System.out.println ("エラーです。"); break; } } }

専門家に質問してみよう