static double f(double x)
     {
          Random K = new Random();
  double d;
  d=K.nextDouble();
  d=d+1;
  return  Math.pow(x,d);
   
     }
     一部分主程序
{
     int n=1;  //初值
     double a=-87,b=87;
     double  h,Tn,T2n,In,I2n;
     double T;
     n=1;
     a=0;
     b=87;
     h=b-a;
     T2n=I2n=h*(f(a)+f(b))/2;}
不知道为什么,程序一直在运行,得不出结果,如果我把d用一个数字代替,程序运行的很快,主程序是是算积分的,没问题的

解决方案 »

  1.   

    Random K = new Random();
      double d;
      d=K.nextDouble();
      d=d+1;
      System.out.println(""+d+"   "+Math.pow(12.8, d));没有问题呀
      

  2.   

    int n=1;  //初值
         double a1=-87,b1=87;
         double  h,Tn,T2n,In,I2n;
         double T;
         n=1;
         a1=0;
         b=87;
         h=b1-a1;
         T2n=I2n=h*(f(a1)+f(b1))/2;
         System.out.println("T2n:"+T2n+"I2n: "+I2n+"h: "+h); }
    static double f(double x)
        {
             Random K = new Random();
     double d;
     d=K.nextDouble();
     d=d+1;
     return  Math.pow(x,d);
      
        }
    ====
    也没有问题
    output:
    T2n:4200.573506786256I2n: 4200.573506786256h: 87.0
      

  3.   

    整个代码是这样阿,大家帮我看看,谢谢
    import java.io.*;
    import java.util.Random;
    import java.lang.Math;
       public class Markov10
    {  
    public static void main(String[] args) throws IOException
     { 
     
         int n=1;  //初值
         double a,bh,Tn,T2n,In,I2n,T,eps=10e-8;
     FileWriter file2 = new FileWriter("ov.txt");
     PrintWriter outputFile1 = new PrintWriter(file2);
     {
         a=1;b=87;
         h=b-a;
         T2n=I2n=h*(f(a)+f(b))/2;
         In=0;
         while(Math.abs(I2n-In)>=eps)  //求积分
         {
             Tn=T2n;
             In=I2n;
             
             double sigma=0.0;
             for(int k=0;k<n; k++)  //求变步长梯形的和部分
             {
                double x=a+(k+0.5)*h;
                sigma+=f(x);
             }   
             T2n=(Tn+h*sigma)/2.0; //变步长梯形
             I2n=(4*T2n-Tn)/3.0;   //辛普生公式
             n*=2;                //划分
             h/=2;
         } 
      outputFile1.print(I2n+" ");
     }
    outputFile1.println();
    outputFile1.close();
    System.out.println("\nThe end.");
     }
       static double f(double x)
         {
              Random K = new Random();
      double d,r;
      d=K.nextDouble();
      return Math.pow(x,d);  
         }
    }
    里面的d如果随便换成一个数字1或1.23424,马上出结果
      

  4.   

    我觉得是这里的问题:
    while(Math.abs(I2n-In)>=eps)  //求积分这个要在I2n对1-1.9999999999的数都是收敛的前提下才可行吧
    这个我倒不敢怀疑我不太了解这个逐步求精公式
    LZ 再对对步骤?再就是你把1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9都试下,如果这里边都有问题,那就是步骤的问题了
      

  5.   

    跟踪发现,是在这里出现了问题:
    for(int k=0;k<n; k++)  //求变步长梯形的和部分
    {
         double x=a+(k+0.5)*h;
         sigma+=f(x); //******这又调用函数f,就是说每一次都累加一个不同的数
    }   出现了死循环!
    还有就是K.nextDouble()产生0~1的数:你的1.0,1.234??不合条件呀再次建议检查步骤
      

  6.   

    我的1.0,1.234是K.nextDouble()+1的,随便写的,都能通过
    for(int k=0;k<n; k++)  //求变步长梯形的和部分
    {
         double x=a+(k+0.5)*h;
         sigma+=f(x); //******这又调用函数f,就是说每一次都累加一个不同的数
    }  
    我也觉得是这里有问题,这话删了,就马上出结果