質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

3917閲覧

Java 五次方程式を解くプログラミングについて係数を与えてから解を導くものを作ろうとしています。

M.M.O-05

総合スコア15

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

1グッド

0クリップ

投稿2016/06/28 13:29

編集2016/06/29 04:56

###前提・実現したいこと
初めて利用するので、わからないことも多いのですがよろしくお願いします。
学校の課題なのですが、5次方程式を解くプログラミング(Java)という課題が出されました。ax^5+bx^4+cx^3+dx^2+ex+f=0という式に対してa,b,c,d,e,fの値をキーボードで入力させたのちに、任意の値m,nを用いて二分法で解を求めたいのですが、まずサブメソッドにa,b,c,d,e,fの値を代入させてから方程式を確定させたのち、二分法の処理をメインメソッドで表したと考えているのですが、どうした工夫が必要でしょうか?下に現在までのスクリプトを載せます。

###発生している問題・エラーメッセージ

lang

1 2import java.io.BufferedReader; 3import java.io.IOException; 4import java.io.InputStreamReader; 5import java.util.StringTokenizer; 6 7 8public class Houteisiki5 { 9 //関数Func 10 static double Func(double x){ 11 double a,b,c,d,e,f; 12 a=0.0; 13 b=0.0; 14 c=0.0; 15 d=0.0; 16 e=0.0; 17 f=0.0; 18 double y=a*x*x*x*x*x+b*x*x*x*x+c*x*x*x+d*x*x+e*x+f; 19 return y; 20 } 21 public static void main(String[] args) throws IOException { 22 double a,b,c,d,e,f; 23 double m=0.0,n=0.0; 24 double o=0.0; 25 double threshold=1E-10; 26 String s; 27 a=0.0; 28 b=0.0; 29 c=0.0; 30 d=0.0; 31 e=0.0; 32 f=0.0; 33 try 34 { 35 System.out.println("ax^5+bx^4+cx^3+dx^2+ex+fの5次方程式を解きます。"); 36 System.out.println("a,b,c,d,e,fの順番に数字を入力してください。"); 37 System.out.println("a,b,c,d,e,fの入力後は任意の2つのxの値を入力してください。"); 38 InputStreamReader isr=new InputStreamReader(System.in); 39 BufferedReader br=new BufferedReader(isr); 40 s=br.readLine(); 41 StringTokenizer st=new StringTokenizer(s," "); 42 a=Double.parseDouble(st.nextToken()); 43 b=Double.parseDouble(st.nextToken()); 44 c=Double.parseDouble(st.nextToken()); 45 d=Double.parseDouble(st.nextToken()); 46 e=Double.parseDouble(st.nextToken()); 47 f=Double.parseDouble(st.nextToken()); 48 m=Double.parseDouble(st.nextToken()); 49 n=Double.parseDouble(st.nextToken()); 50 51 } 52 catch(NumberFormatException Ellor) 53 { 54 System.out.println("正しい数字を入力してください。"); 55 return; 56 } 57 System.out.println(a); 58 System.out.println(b); 59 System.out.println(c); 60 System.out.println(d); 61 System.out.println(e); 62 System.out.println(f); 63 System.out.println(m); 64 System.out.println(n); 65 System.out.println(Func(m)); 66 if(m>n){ 67 System.out.println("m<nとなるように値を選択してください。"); 68 return; 69 } 70 if(Func(m)*Func(n)>0){ 71 System.out.println("f(a)とf(b)の符号が同じです。"); 72 return; 73 } 74 if(Func(m)==0){ 75 System.out.println(m+"は解です。"); 76 return; 77 } 78 if(Func(n)==0){ 79 System.out.println(n+"は解です。"); 80 return; 81 } 82 //二分法で解を求める。 83 int i=0; 84 while(true){ 85 if(n-m<threshold){ 86 break; 87 } 88 o=(m+n)/2; 89 double fo=Func(o); 90 if(-threshold<=fo&&fo<=threshold){ 91 break; 92 } 93 94 double fm=Func(m); 95 double fn=Func(n); 96 if(fm*fn<0){ 97 n=o; 98 }else if (fm*fn<0){ 99 m=o; 100 } 101 i++; 102 103 String ti=new java.text.DecimalFormat("00").format(i); 104 String tm=new java.text.DecimalFormat("0.00000").format(m); 105 String tn=new java.text.DecimalFormat("0.00000").format(n); 106 String to=new java.text.DecimalFormat("0.00000").format(o); 107 String tf=new java.text.DecimalFormat("0.00000").format(f); 108 System.out.println(ti+" m="+tm+" n=" +"tn"+"o="+to+" f(c)="+tf); 109 } 110 String t=new java.text.DecimalFormat("0.00000").format(o); 111 System.out.println(i+"回目 解:"+t); 112 } 113 } 114

###試したこと
実行するとa,b,c,d,e,fが0.0として計算されてしまいます。
各係数を代入するクラスを作ったのですが、
以下のようにするとerrorが生じます。

lang

1public class Array1 { 2 public static double a,b,c,d,e,f{ 3 String s; 4 a=0.0; 5 b=0.0; 6 c=0.0; 7 d=0.0; 8 e=0.0; 9 f=0.0; 10 try 11 { 12 System.out.println("ax^5+bx^4+cx^3+dx^2+ex+f=0について各係数a,b,c,d,e,fの順に入力してください。"); 13 InputStreamReader isr=new InputStreamReader(System.in); 14 BufferedReader br=new BufferedReader(isr); 15 s=br.readLine(); 16 StringTokenizer st=new StringTokenizer(s," "); 17 a=Double.parseDouble(st.nextToken()); 18 b=Double.parseDouble(st.nextToken()); 19 c=Double.parseDouble(st.nextToken()); 20 d=Double.parseDouble(st.nextToken()); 21 e=Double.parseDouble(st.nextToken()); 22 f=Double.parseDouble(st.nextToken()); 23 } 24 catch(Exception error) 25 { 26 System.out.println(error);

あくまで途中です。
###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

mhashi👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

matobaa

2016/06/28 14:55 編集

お手数ですが、ソースコードはコードタグで囲んでください。読みにくくて……。編集画面の左下、i Markdown を参照してください。 → 対応いただきありがとうございます。
argius

2016/06/28 15:07

JavaEEでなく、ただのJavaですよね? 紛らわしいのでEEは取った方が良いのでは?
guest

回答2

0

ベストアンサー

多項式を表現するこんなクラスを作ってみましょう。

java

1/** 2 * xの多項式を表します 3 */ 4public class Polynomial 5{ 6 /** 7 * @param a 定数, 1次係数, 2次係数, 3次係数, ... と係数を指定します 8 */ 9 public Polynomial(double... a) 10 { 11 if (a == null) throw new NullPointerException(); 12 this.a = a; 13 } 14 15 /** 16 * xを与えたときの式の値を求めます 17 */ 18 public double evaluate(double x) 19 { 20 double result = 0; 21 double xn = 1; 22 for (int i = 0; i < a.length; ++i) 23 { 24 result += a[i] * xn; 25 xn *= x; 26 } 27 return result; 28 } 29 30 /** 31 * この多項式の次数を返します。 32 * @return 定数式の場合は0を返します。 33 */ 34 public int getDegree() 35 { 36 for (int i = a.length - 1; i > 0; --i) 37 { 38 if (a[i] != 0) return i; 39 } 40 return 0; 41 } 42 43 /** 44 * この多項式を微分した多項式(導関数)を返します 45 * @return 46 */ 47 public Polynomial getDerivative() 48 { 49 int degree = getDegree(); 50 double[] derivative = new double[degree]; 51 for (int i = 1; i <= degree; ++i) 52 { 53 derivative[i - 1] = a[i] * i; 54 } 55 return new Polynomial(derivative); 56 } 57 58 @Override 59 public String toString() 60 { 61 final StringBuilder builder = new StringBuilder(); 62 63 for (int i = a.length - 1; i >= 0; --i) 64 { 65 if (a[i] != 0) { 66 if (builder.length() > 0) builder.append(" + "); 67 if (i == 0 || a[i] != 1) builder.append(a[i]); 68 if (i > 0) 69 { 70 builder.append("x"); 71 if (i > 1) builder.append(i); 72 } 73 } 74 } 75 76 return builder.toString(); 77 } 78 79 private double[] a; 80}

後ろの方のgetDegreeとかgetDerivativeメソッドはまあ趣味なのでなくてもいいです(もっと発展的な話をするときに役に立つので作っておきました)。

こうすると、a,b,c,d,e,fが取得できた時点で Polynomial p = new Polynomial(f,e,d,c,b,a) とやると多項式オブジェクトが作れます。 それを p.evaluate(1) などとやると f(1) が求まります。

実際に System.out.println(new Polynomial(1,2,1).evaluate(3)); などとやると(これは2次式ですが)、16.0と表示されることを確認してみてください。

投稿2016/06/29 08:36

編集2016/06/29 08:44
yuba

総合スコア5568

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuba

2016/06/29 08:37

ちなみに「もっと発展的な話」とは何かを先に明かしておきますと、m,nを与えることなく方程式を解こうという試みについてです。
M.M.O-05

2016/06/30 05:57

ご回答ありがとうございます。 係数をa,b,c,d,e,fとするにはこのプログラムを どうすればよいでしょうか?
M.M.O-05

2016/06/30 06:04

すいません。 補足なんですけど 自分はまだjavaを始めたばかりで if文、while文、for文、配列ぐらいしか知らないので 申し訳ないのですが、回答されたプログラムがあまりわかりません。 よろしければ、どういう意味なのかを解説していただけると 非常にありがたいです。(>_<)
M.M.O-05

2016/07/01 07:08

今までのものと このプログラムを組み合わせたら 方程式を解くプログラムは できました。 誠にありがとうございました。
guest

0

afが0.0として計算されてしまうのは、Funcメソッドにある変数afとmainメソッドでの変数afが全くの別物だからです。mainメソッドでのafに入力から数値を入れたとしてもfuncには全く反映されません。
この場合、a~fの各係数を持ったクラスを作ってしまったほうが得策でしょう。そしてFuncにおける計算も、この計算ではちょっと不格好なので、こんな感じにしてみては?

java

1double y = ((((a * x + b) * x + c) * x + d) * x + e) * x + f;

これでも不格好なので、各係数は配列にしてしまって、forループで回して計算するのが一番スマートでしょうか?

投稿2016/06/28 15:20

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

M.M.O-05

2016/06/29 05:01

ご回答ありがとうございます。 複数クラスを用いた開発は初めてなので上手くできたかわかりませんが・・・ 作成したクラス(詳細は上に)について 各係数を代入するクラスを mainを含むクラスにつなげたいのですが、 エラーが生じるのですが、どうすればよいでしょうか またmainを含むクラスには具体的にどういう記述が必要でしょうか?
swordone

2016/06/29 15:04

変数宣言の後の{が意味不明です。 係数をフィールド変数にするところまではいいです。あとはmainからこの変数に値を代入していくだけです。
M.M.O-05

2016/06/30 05:50

係数をフィールド変数にするとこまでにとどめておくだけでよろしいですか? BufferedReaderから始まる変数を得る部分はmainにおくべきなろのでしょうか? 自分のイメージとしては係数を得るプログラムを前の別クラスで表し、mainで二分法(Ifから始まる手順)を進めようと思っているのですが、具体的にはどういう記述が必要なのでしょうか?
swordone

2016/06/30 18:14

yubaさんの回答のように、各係数を持つ整式を表すクラスとして設計したほうが良いでしょう。mainからその整式クラスのインスタンスを作成し、そのインスタンスに情報を設定していく、という構造が自然です。クラスの中で値を取得するような構造にはしないほうがいいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問