辛普森一家规则 10<-6 错误

计算科学 结石 爪哇
2021-12-27 19:01:32

我正在制作一个 Java 函数来使用辛普森规则当函数等于时,我应该只添加(限制)或(限制)。我的教授说要使用为什么会这样?0π/2x/sin(x)dx00/sin(0)110101010

public static double simpsonsRuleFunction1(double valueN, double valueA, double valueB, double valueDx) {

    double e = 0.0;
    double simpsonsRule = 0.0;
    double valueHolder = 0.0;

    valueN = 2;
    valueA = 0;
    valueB = (Math.PI)/2; 

    for(int i = 1; i<=valueN+1 ; i++){
        valueDx = (valueB-valueA)/valueN;
        e = valueA + ((i-1)*valueDx);

        if (i==1) {
        // Limit as x -> 0
        simpsonsRule += Math.pow(10,-10);

        }
        else if ((i % 2 == 0) && ( i > 1) && (i < valueN+1 ))  {
        simpsonsRule += 4*(e/((Math.sin(e))));
        }
        else if ((i % 2 != 0) && ( i > 1) && (i < valueN+1 )) {
        simpsonsRule += 2*(e/((Math.sin(e))));   
        }
        else if (i == valueN+1 ) {
            simpsonsRule += (e/((Math.sin(e))));

        }

    }
    simpsonsRule = simpsonsRule *((valueDx)/3);

    System.out.println("\nsimpsonsRule" + simpsonsRule);

     while(Math.abs(valueHolder - simpsonsRule) > Math.pow(10,-6)) {
           System.out.println("\nValueHolder" + valueHolder);
           valueHolder = simpsonsRule;
           valueN +=2;
           valueDx = (valueB-valueA)/valueN;
           simpsonsRule = 0;
    for(int i = 1; i<=valueN + 1; i++){
        e = valueA + ((i-1)*valueDx);

        if (i==1) {
        // Limit as x -> 0
        simpsonsRule += Math.pow(10,-10);

        }
        else if (i % 2 == 0) {
        simpsonsRule += 4*(e/((Math.sin(e))));
        }
        else if ((i % 2 != 0) && ( i > 1) && (i < valueN + 1)) {
        simpsonsRule += 2*(e/((Math.sin(e))));   
        }
        else if (i == valueN + 1) {
            simpsonsRule += (e/((Math.sin(e))));

        }

    }
    simpsonsRule = simpsonsRule *((valueDx)/3);


    }
    return valueN;
}
1个回答

您可以通过删除if语句中的冗余检查来简化代码。您还可以拉出valueDx循环中的常量:

double e = 0.0;
double simpsonsRule = 0.0;
double valueHolder = 0.0;

valueN = 2;
valueA = 0;
valueB = (Math.PI)/2; 

valueDx = (valueB-valueA)/valueN;
simpsonsRule = 1.0 + Math.PI/2;
for(int i = 2; i<=valueN ; i++){
    e = valueA + ((i-1)*valueDx);

    if (i % 2 == 0)  {  //even
        simpsonsRule += 4*(e/((Math.sin(e))));
    }
    else { //odd
        simpsonsRule += 2*(e/((Math.sin(e))));   
    }
}

simpsonsRule = simpsonsRule *((valueDx)/3);

此外,出于某种原因,您似乎在代码中重复了两次相同的循环。我还没有运行它,所以可能仍然存在一些错误,尤其是在索引等中,但这是家庭作业,所以我不会为你做这一切 =)。您可以在Wikipedia上查看执行所需操作的 python 或 c 变体

python 实现与您的特别接近。不过,要回答您的问题,您正在评估 0 和之间。因此该行:π/2

simpsonsRule = 1.0 + (Math.PI)/2

对应于添加其中在极限 whilef(0)+f(π/2)f(x)=xsin(x)f(0)>1f(π/2)=π/2