Java y=2^(-0.5)x从0到1布尔值的积分的蒙特卡罗近似是';t工作不正常

Java y=2^(-0.5)x从0到1布尔值的积分的蒙特卡罗近似是';t工作不正常,java,math,boolean,do-while,montecarlo,Java,Math,Boolean,Do While,Montecarlo,在Java类中,我的任务是求解几何面积的几个蒙特卡罗近似。我的第一个实验是使用一个名为“条件”的布尔函数运行do-while循环,当(错误=2^0.5 有谁能给我一些反馈,说明我可能把事情搞砸了?我的问题在开关箱1和断路器之间 public static void main(String[] args){ double tolerance = 1E-9, referenceArea =0.0, exactArea =0.0, x =0.0, y =0.0, err

在Java类中,我的任务是求解几何面积的几个蒙特卡罗近似。我的第一个实验是使用一个名为“条件”的布尔函数运行do-while循环,当(错误<容差)满足时,这个循环就满足了-到现在为止,当我运行我的程序时,这似乎产生了一个无限循环

当我将“while”语句从布尔值改为计数器时,我可以让它正常运行,因此我知道布尔值本身存在问题

如果我被要求求解高度为2^(-0.5)的正方形的面积从0到1,而不是方程y=2^(-0.5)x,教授给我的增加HitPointsCenter变量的条件会很好,因此我即兴创作并注意到,对于线上或线下的点,必须满足x/y>=2^0.5

有谁能给我一些反馈,说明我可能把事情搞砸了?我的问题在开关箱1和断路器之间

    public static void main(String[] args){




    double tolerance = 1E-9, referenceArea =0.0, exactArea =0.0, x =0.0,     y =0.0, error = 0.0, approximateArea = 0.0;
    int  totalPointsCounter =0, hitPointsCounter =0;
    char firstCharacter ;
    String titleText, messageText;

    titleText = "The Monte Carlo Method";

    int userInput = JOptionPane.showConfirmDialog(null, "Run a Monte Carlo Experiment?", titleText, JOptionPane.YES_NO_OPTION);
    if (userInput == 1){
        JOptionPane.showMessageDialog(null, "The program terminates \nGood Bye!", titleText,  JOptionPane.WARNING_MESSAGE);
    System.exit(0);

    }


    String userExperimentInput = JOptionPane.showInputDialog(null, "Please Enter\n1 for Experiment 1\n2 for Experiment 2\n3 for Experiment 3\n4 for Experiment 4", titleText,  JOptionPane.QUESTION_MESSAGE).trim();

      if(userExperimentInput == null || userExperimentInput.equals("") ){
        JOptionPane.showMessageDialog(null, "No input received\nThe program terminates", titleText,  JOptionPane.WARNING_MESSAGE);
        System.exit(0);     
      }
char theCase = userExperimentInput.charAt(0);



switch (theCase){
    case '1': 
        exactArea = Math.pow(2, -0.5)*1/2; 
        referenceArea = 1.0;


         boolean condition = error < tolerance;

         double percentHit = (((double)hitPointsCounter/(double)totalPointsCounter));
   approximateArea =(percentHit)*(referenceArea);
error = exactArea - Math.abs(approximateArea);

int counter = 0;

do {
        x= Math.random();
        y= Math.random();
        totalPointsCounter++;

        if (y==0 && x==0){hitPointsCounter++;}
        if (y>0){
        if ((x/y)>=Math.pow(2, 0.5)){

                hitPointsCounter++;}
        }

        exactArea = Math.pow(2, -0.5)*1/2; 
        referenceArea = 1.0;




        counter++;

        }

while(condition);

  percentHit = (((double)hitPointsCounter/(double)totalPointsCounter));
   approximateArea =(percentHit)*(referenceArea);
error = exactArea - Math.abs(approximateArea);



messageText ="Experiment #1" + ": \n\nMC needed " + totalPointsCounter + " random points for tolerance " + tolerance + "\nThe approximate area is " + approximateArea;

JOptionPane.showMessageDialog(null, messageText, titleText, JOptionPane.INFORMATION_MESSAGE);

break;



    case 2: 
        exactArea = Math.PI;
        referenceArea = 4.0;







    case 3:
        exactArea = (1.0/3.0);
        referenceArea = 2.0;







    case 4:
        exactArea = 2;
        referenceArea = Math.PI;





    default: 
        System.out.println("Wrong character for case number, program terminates");
        System.exit(0);
}

}
publicstaticvoidmain(字符串[]args){
双公差=1E-9,参考面积=0.0,精确面积=0.0,x=0.0,y=0.0,误差=0.0,近似面积=0.0;
int TotalPointsCenter=0,HitPointsCenter=0;
第一字符;
字符串titleText,messageText;
titleText=“蒙特卡罗方法”;
int userInput=JOptionPane.showConfirmDialog(null,“运行蒙特卡罗实验?”,titleText,JOptionPane.YES\u NO\u选项);
if(userInput==1){
JOptionPane.showMessageDialog(null,“程序终止\n再见!”,titleText,JOptionPane.WARNING\u消息);
系统出口(0);
}
字符串userExperimentInput=JOptionPane.showInputDialog(null,“请输入\n1用于实验1\n2用于实验2\n3用于实验3\n4用于实验4”,titleText,JOptionPane.QUESTION_MESSAGE).trim();
if(userExperimentInput==null | | userExperimentInput.equals(“”){
JOptionPane.showMessageDialog(null,“未收到输入\n程序终止”,标题文本,JOptionPane.WARNING\u消息);
系统出口(0);
}
char theCase=userExperimentInput.charAt(0);
开关(机箱){
案例“1”:
精确面积=数学功率(2,-0.5)*1/2;
参考面积=1.0;
布尔条件=误差<公差;
双倍命中率=((双倍)命中点中心/(双倍)总命中点中心));
近似面积=(命中百分比)*(参考面积);
误差=exactArea-Math.abs(近似值ea);
int计数器=0;
做{
x=数学随机();
y=数学随机();
TotalPointsCenter++;
如果(y==0&&x==0){hitpointsconter++;}
如果(y>0){
如果((x/y)>=数学功率(2,0.5)){
HitPointsCenter++;}
}
精确面积=数学功率(2,-0.5)*1/2;
参考面积=1.0;
计数器++;
}
while(条件);
命中率=((双)命中率中心/(双)总命中率中心));
近似面积=(命中百分比)*(参考面积);
误差=exactArea-Math.abs(近似值ea);
messageText=“实验#1”+”:\n\nMC需要“+totalpointsconter+”公差的随机点“+tolerance+”\n近似区域为“+approxiatearea;
showMessageDialog(null,messageText,titleText,JOptionPane.INFORMATION\u MESSAGE);
打破
案例2:
exactArea=Math.PI;
参考面积=4.0;
案例3:
精确面积=(1.0/3.0);
参考面积=2.0;
案例4:
面积=2;
referenceArea=Math.PI;
违约:
System.out.println(“案例编号的字符错误,程序终止”);
系统出口(0);
}
}

所以我让代码正常工作,问题有两个方面-我的代码没有重新计算循环中的布尔“条件”,导致无限循环,我以前定义hitPointCounter的方式也不正确。谢谢你,达蒙,谢谢你的帮助。当我添加此块时:

           percentHit =   (((double)hitPointsCounter/(double)totalPointsCounter));
           approximateArea =(percentHit)*(referenceArea);
           error = Math.abs(exactArea - approximateArea);
           condition = error > tolerance;
在我的循环和改变

     if (y==0 && x==0){hitPointsCounter++;}
     if (y>0){
     if ((x/y)>=Math.pow(2, 0.5)){

            hitPointsCounter++;}
    }
致:


如果(y那么我让代码正常工作,问题是双重的-我的代码没有重新计算循环中的布尔“条件”,导致无限循环,我以前定义hitPointCounter的方式也不正确。感谢Damon的帮助。当我添加此块时:

           percentHit =   (((double)hitPointsCounter/(double)totalPointsCounter));
           approximateArea =(percentHit)*(referenceArea);
           error = Math.abs(exactArea - approximateArea);
           condition = error > tolerance;
在我的循环和改变

     if (y==0 && x==0){hitPointsCounter++;}
     if (y>0){
     if ((x/y)>=Math.pow(2, 0.5)){

            hitPointsCounter++;}
    }
致:


if(我不是Java程序员,但我敢猜测循环是无限的,因为没有任何东西在更新循环中的
条件
变量。还要记住,使用
do…while
循环意味着不管条件如何,代码块至少要执行一次-确保这是您所需要的你是对的,这是我问题的一大部分。我发现了另一个问题,即使我修复了它,我也会遇到这个问题:我将HitPointsCenter定义为(x/y)>=sqrt(2)的方法我不允许我在错误容忍度范围内。我和我的教授谈过,他只是在图片上的布尔方程中留下了一个“x”。所以我不是Java程序员,但我敢猜测循环是无限的,因为没有任何东西在更新循环中的
条件
变量。请记住t使用
do…while
循环意味着不管条件如何,代码块至少要执行一次-确保这是您想要的。您是对的,这是我问题的一大部分。我发现了另一个问题,即使我修复了它,我也会遇到这个问题:我将HitPointsCenter定义为(x/y)的方法>=sqrt(2)不允许我在我的误差容忍范围内。我和我的教授谈过,他只是在图片上的布尔方程中留下了一个“x”。所以是y