• 締切済み

数値積分について

私が作成した下記のJavaの数値解析の矩形法のプログラムで、区間分割数nを10から100まで10ずつ増やして計算値を求め、面積の計算誤差を(計算値-真値(0.68269))/真値(0.68269)*100 (%)として計算するプログラムがまったくわかりません。Javaで数値解析をするのは初めてなのでどこが足りないのか、どこを直したら動くのか教えてください public class Kukei { static double f(double x) { // ここに任意の被積分関数を記述 double y = Math.exp(- x * x / 2) / Math.sqrt(2.0 * Math.PI); return y; } public static void main(String[] args) { double a = - 1.0, b = 1.0; // 積分範囲 int n = 10; // 区間分割数 double suti= (n-0.68269)/(0.68269*100); for(int j=0; j<n; j++){ double h = (b - a) / (double)n; // 分割幅 double s = 0.0; n=n; for (int i=0; i < n; i++) { s += f(a + i * h); } s *= h; System.out.println("区間分割数 =" + n); System.out.println("矩形法による計算値 =" + s); System.out.println("矩形法による計算誤差 =" +suti+"\n"); } } }

  • aw345
  • お礼率2% (1/48)
  • Java
  • 回答数1
  • ありがとう数2

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

単純に「まったくわからない」と書いてますが, より具体的には「どこが (どのように) わからない」のですか? たとえば, 「矩形法が分からない」とか「矩形法はわかるけど Java が分からない」など, いろいろ考えられますよね. そして, ここに挙げられているプログラムは何を意図したものであり, その中の各変数やメソッドは何を意味しているのですか? 「どこが足りないのか、どこを直したら動くのか」と書いているということは「何か足りないものがある」「何か動作がおかしいところがある」と想定しているんですよね? そこには当然何かしら理由があるはずですよね? では, その「理由」とはなんですか?

aw345
質問者

補足

つーか回答してくる時間早いなあーーーーー!!!

関連するQ&A

  • 数値解析の矩形法について

    区間分割数nを10から100まで10ずつ増やして計算値を求め、面積の計算誤差が区間分割数によってどのように変化するかを求める矩形法プログラムを下記に作成したのですが、 計算誤差を求める式で ・計算誤差=(計算値ー真値)/真値×100 (%) (真値は0.68269) と計算するのですが、プログラムでは分母の真値×100 (%)を()を付ける場合の計算の答えと()を付けない計算の答えとが全然違います。どうしてこのようなことが起こるのですか? また、この計算誤差の求め方は()を付ける場合とつけない場合のどちらが正しいのですか? public class Kukei { static double f(double x) { // ここに任意の被積分関数を記述 double y = Math.exp(- x * x / 2) / Math.sqrt(2.0 * Math.PI); return y; } public static void main(String[] args) { double a = - 1.0, b = 1.0; // 積分範囲 int n = 10; // 区間分割数 double suti= ((n+10)-0.68269)/0.68269*100; //真値 for(int k=1; k <= 10; k++){ double h = (b - a) / (double)n; // 分割幅 double s = 0.0; n=k*10; for (int i=0; i < n; i++) { s += f(a + i * h); } s *= h; suti= (s-0.68269)/0.68269*100; System.out.println("区間分割数 =" + n); System.out.println("矩形法による計算値 =" + s); System.out.println("矩形法による計算誤差 =" +suti+"\n"); } } }

  • 矩形法プログラムの計算値と計算誤差の求め方

    下記の矩形法の計算値を求めるプログラムで、区間分割数nを10から100まで10ずつ増やして計算値を求めるプログラムを作成したいのですが、どのようにしたらいいのか分かりません。Java初心者なのでJavaプログラムが詳しい人は至急ご連絡をお願いします。 *ちなみにこの矩形法プログラムのの計算誤差も分かる人はお願いしたいのですが・・・・・・  計算誤差の求め方は    計算誤差=(計算値ー真値)/真値×100(%) (真値=0.68269とする) public class Kukei { static double f(double x) { // ここに任意の被積分関数を記述 double y = Math.exp(- x * x / 2) / Math.sqrt(2.0 * Math.PI); return y; } public static void main(String[] args) { double a = - 1.0, b = 1.0; // 積分範囲 int n = 100; // 区間分割数 double h = (b - a) / (double)n; // 分割幅 double s = 0.0; for (int i=0; i < n; i++) { s += f(a + i * h); } s *= h; System.out.println("区間分割数 =" + n); System.out.println("矩形法による計算値 =" + s); } }

    • ベストアンサー
    • Java
  • シンプソン法の出力結果について

    シンプソン法の区間分割数nを10~100まで10ずつ増やして計算値と計算誤差を求めるプログラムを書きに作成したのですが、出力結果に-7.341865999405491E-5などとあります。この「E-数字」とはJavaではどういうこと示しているのですか? また、計算誤差の求め方は下記のプログラムでいいのですか? public class Simpson { static double f(double x) { // ここに任意の被積分関数を記述 double y = Math.exp(- x * x / 2) / Math.sqrt(2.0 * Math.PI); return y; } public static void main(String[] args) { double a = - 1.0, b = 1.0; // 積分範囲 int n = 100; // 区間分割数 for(n=10; n <=100; n+=10){ double h = (b - a) / (double)n; // 分割幅 double s, s1 = 0.0, s2 = 0.0; for (int i = 1; i <= n / 2; i++) { s1 += f(a + (2 * i - 1) * h); } for (int i = 1; i <= n / 2 - 1; i++) { s2 += f(a + 2 * i * h); } s = h / 3.0 * (f(a) + 4.0 * s1 + 2.0 * s2 + f(b)); double suti = (s-0.68269)/0.68269*100;  //計算誤差=(計算値ー真値)/真                                         値×100 System.out.println("区間分割数 =" + n); System.out.println("シンプソン法による計算値 =" + s); System.out.println("シンプソン法による計算誤差 ="+suti+"\n"); } } }

  • javaのプログラムについて

    質問させていただきます // 数値積分 class Integral1 { public static void main(String[] args) { final int n = 100; // 区間数 final double a = 0; // 始点 final double b = 1; // 終点 final double h = (b-a) / n; // 区間の幅 double x, y; double S = 0; // Sを0で初期化 int i; // 区間 for(i = 1; i <= n ; i++) { // 区間1からnまで x = a + h * i; // 区分積分 y = Math.sqrt(1-x*x); // yを計算 S += y * h; } System.out.println("S = " + S + " 4S = " + 4*S); } } これは区分積分法で計算する数値積分のプログラムなのですが、 これをシンプソン法に改造したプログラムに直していただきたいのですが・・・ どなたかお願いします

  • 関数の積分を求めるプログラムで質問です。

    シンプソンの公式を用いて積分を求めるプログラムで、 「 y=1/(1+x*x) のように±∞で0に収束するような関数は以下のような無限積分を求めることができる。 ∫(-∞→∞){1/(1+x*x)}dx …(a) ただし、無限区間を分割することはできないので、コンピュータを用いた計算では ∫(-a→a){1/(1+x*x)}dx のaに大きな値を入れることで代用する。この積分を求めるプログラムをシンプソンの式を用いて作成し、以下の3ケースについて値を求めて真値と比較せよ。真値は式(a)を解析的に積分することで求めよ。 ・a=100、N=1000 ・a=100、N=500 ・a=200、N=1000 (Nは以下のプログラムと対応しているものです) 」 というもので参考としてS=∫(1→2){1/x}dxをシンプソンの公式を使い求めるものは以下のものなのですが #include <stdio.h> double f(double x) { return 1/x; } int main() { int i,N; double a,b,h,S; double x[1000],y[1000]; a=1.0; b=2.0; N=10; h=(b-a)/N; for(i=0;i<=N;i++) x[i]=a+i*h; y[0]=f(x[0]); y[N]=f(x[N]); S=h*(y[0]+y[N])/3.0; for(i=1;i<=N-1;i=i+2) { y[i]=f(x[i]); S=S+h*y[i]*4.0/3.0; } for(i=2;i<=N-2;i=i+2) { y[i]=f(x[i]); S=S+h*y[i]*2.0/3.0; } printf("N=%d,S=%15.10lf\n",N,S); } これを生かしてプリグラムをつくりたいのですが、分からなくて困っています。助けてください。

  • 対数表のプログラミング java

    どうもです。 以下のプログラミングをjavaで作成したいのですが、どうすればよいでしょうか? x = 1.00, 1.01, 1.02,・・・, 5.47, 5.48, 5.49に対して、log(10)xを示す対数表を作成しなさい 書式指定無し ちなみに自分で書いてみたらこうなりました import java.until.Scanner; class Taisuu { public static void main(String[] args) { final int N = 10; final int N = 100; System.out.println("+0.00%1d", j); System.out.println(); double base = 1; for (int i=0; i<M; ++i) { double x = base + 0.01*i; System.out.printf("%4.2f", x); for (int j=0; j<N; ++j) { double dx = 0.001*j; int log10x = (int)(1000000*Math.log10(x+dx)); System.out.printf("%06d", log10x); } System.out.println(); } } }

  • LU分解を利用した逆行列のプログラム(Java)

    LU分解を利用した逆行列のプログラムが作れません… というか、作ったのですが実行するとエラーが出てしまいます(´Д`;) どこをどう直せばいいか、もしくはこのようにプログラムした方が効率がよい などのアドバイスどなたか下さい double a[][]={{2,5,4}, {2,3,-1}, {6,9,28}}; int N=a.length; double[][] s=new double[N][N]; for(int k=0; k<a[0].length-1; k++){ for(int i=k+1; i<N; i++){ s[i][k]=a[i][k]/a[k][k]; a[i][k]=s[i][k]; for(int j=k+1; j<N; j++){ a[i][j] -= s[i][k] * a[k][j]; } } } double[][] y=new double[N][N]; double[][] X=new double[N][N]; double[][] e=new double[N][N]; for(int i=0;i<N;i++){ for(int j=0;j<N;j++){ if(i==j){ e[i][j]=1; }else{ e[i][j]=0; } } } for(int i=0;i<N;i++){ y[1][i]=e[1][i]; for(int k=2;k<=N;k++){ for(int j=1;j<=N;j++){ y[k][i]=e[k][i]-s[k][j]*y[j][i]; } } X[N][i]=y[N][i]/a[N][N]; for(int k=N-1;k>=1;k--){ for(int j=k+1;j<=N;j++){ X[k][j]=(y[k][j]-s[k][j]*X[j][i])/a[k][k]; } } } for(int i=0;i<N;i++){ for(int j=0;j<N;j++){ System.out.printf(" %6.5f ", X[i][j] ); } System.out.println(""); }

  • どこがダメなんでしょう

    入力した数字 1 2          3 4 を        -2  1        1.5 -1 と出力したいんです  public class Re1{ public static void main(String args[]){ double n1=Double.parseDouble(args[0]); double n2=Double.parseDouble(args[1]); double n3=Double.parseDouble(args[2]); double n4=Double.parseDouble(args[3]); double a=n1*n4-n2*n3; double b=1/a; double q[][]={{n4,-n2}, {-n3,n1}}; double l[][]=new double[2][2]; for(int i=0; i<l.length; i++){ for(int j=0; j<l[i].length; j++){ l[i][j]=0; l[i][j]=b*q[i][j]; } } for(int i=0; i<l.length; i++){    for(int j=0; j<l[i].length; j++){ System.out.print(l[i][j]+" "); } System.out.println(); } } } お願いします。

  • 配列のエラーに関して

    java言語を用いて,Householder変換を用いた固有値の数値計算に挑戦してみました.しかし,次のようなエラーが発生し上手くいきません.どなたかこの問題を解決するためにお力をかしていただけないでしょうか. ----------エラー内容-------------------------------------------------------------------------------- Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0 at Out.Mhouse(House.java:90) at House.main(House.java:10) ---------------------------------------------------------------------------------------------------- //Householder変換 public class House{ public static void main(String[] args){ double[][] A = new double[3][3]; int n = A.length; Out out = new Out(); for(int i = 0;i < n;i++){ for(int j = 0;j < n;j++){ if(j < n-1){ System.out.print(out.Mhouse(A)[i][j] + " "); }else if (j == n-1) System.out.println(out.Mhouse(A)[i][j]); }; }; }; }; class Out{ double[][] outpro(double[] x){ int n; n = x.length; double[][] A = new double[n][n]; for(int i = 0;i < n;i++ ){ for(int j = 0;j < n;j++){ A[i][j] = x[i] * x[j]; } } return A; }; double[][] Msca(double a,double[][] A){ int n = A.length; for(int i = 0;i < n; i++){ for(int j = 0;j < n;j++){ A[i][j] = a * A[i][j]; } } return A; }; double selfpro(double[] x){ double a = 0; int n = x.length; for(int i = 0;i < n; i++){ a = a + x[i] * x[i]; }; return a; }; double[] minus(double[] x, double[] y){ int n = x.length; double[] z = new double[n]; for(int i = 0;i < n;i++){ z[i] = x[i] - y[i]; }; return z; }; double[][] house_1(double[] x){ int n = x.length; double[][] A = new double[n][n]; for(int i=0;i < n;i++){ for(int j = 0;j < n;j++){ if(i == j){ A[i][j] = 1 - Msca(2/selfpro(x),outpro(x))[i][j]; }else{ A[i][j] = - Msca(2/selfpro(x),outpro(x))[i][j]; }; }; }; return A; }; double[][] house_2(double[] x){ double[][] z = new double[1][1]; z[1][1] = 1 - 2; return z; }; double[][] Mhouse(double[][] A){ int n = A.length; double[][] H = new double[n][n]; for(int i = 0;i < n;i++){ double[] x = new double[n-i]; double[] y = new double[n-i]; double[][][] L = new double[i][n-i][n-i]; for(int j = 0;j < n-i;j++){ x[j] = A[i][i+j]; if(j == 0){ y[j] = 1; }else{ y[j] = 0; }; x[j] = y[j] - x[j]; }; if(i < n-1){ L[i] = house_1(x); for(int k = 0;k < n-i;k++){ for(int l = 0;l < n-i;l++){ H[i+k][i+l] = L[i][k][l]; }; }; }else if(i == n-1){ L[i] = house_2(x); for(int k = 0;k < n-i;k++){ for(int l = 0;l < n-i;l++){ H[i+k][i+l] = L[i][k][l]; }; }; }; }; double[][] B = new double[n][n]; for(int i = 0;i < n;i++){ for(int j = 0;j < n;j++){ for(int k = 0;k < n;k++){ B[i][j] = H[i][k] * A[k][j]; }; }; }; return A; }; };

    • ベストアンサー
    • Java
  • java プログラム 範囲を指定した乱数

    正規乱数をボックスミューらー法で発生させて、 範囲を指定して出力したいと思ってます。 プログラムを作成してみたのですが・・・ 平均50で範囲を48から52にしたいのですが たまに範囲外というか「0.0」が出力されてしまいます。 アドバイスをください import java.util.*; public class test2{ public static void main(String args[]){ double R,S; double r[]=new double[200];  double s[]=new double[200]; double s1[]=new double[200]; Random ran=new Random();    for(int i=0;i<200;i++){     R=ran.nextDouble(); S=50+Math.sqrt(-2*Math.log(ran.nextDouble()))*Math.cos(2*Math.PI*(ran.nextDouble())); r[i]=R; s1[i]=S; if(50-2<s1[i]){ if(50+2>s1[i]){ s[i]=s1[i]; } } } for(int j=0;j<150;j++){ System.out.println(s[j]); } } } お願いします

    • ベストアンサー
    • Java

専門家に質問してみよう