【问题标题】:Calculating simpsons Rule error < 10^-6计算辛普森一家规则错误 < 10^-6
【发布时间】:2015-11-02 17:31:43
【问题描述】:

我正在尝试计算辛普森规则以获得

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);



     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;
}

【问题讨论】:

  • 我需要 N 个间隔,其中错误为
  • N 只是正数,偶数

标签: java math calculus


【解决方案1】:

您需要明确处理e==0 的情况。

我建议拉出一个函数,这样您就不必重复逻辑:

double f(e) {
  return e==0 ? 1 : e/Math.sin(e);
}

然后在需要计算函数的地方使用它,例如

simpsonsRule += 4*(e/((Math.sin(e))));

变成

simpsonsRule += 4*f(e);

当然,您可能还需要处理+/- N pi 的案例,具体取决于您允许的输入值。

根据 pcarter 的建议进行编辑:您可能希望使用一个非零阈值,低于该阈值时使用 1 作为函数的值,以处理零附近的数值不准确,例如

return (Math.abs(e) < 1e-10) ? 1 : e/Math.sin(e);

选择阈值(在本例中为 1e-10)以提供足够准确的结果。

【讨论】:

  • 所以每当 e ==0 时,我都会将限制用作我的函数 x/sinx 的 x -> 0?
  • 没错。这就是 1 的来源。
  • 由于舍入问题,您需要仔细比较浮点值与==。最好使用Math.abs(e) &lt; 1.0e-10 代替e == 01.0e-10 在这里相当随意。)
  • 哦,好的。那么我会在我的函数中添加 1e-10 还是将其输入到 x/sinx ((1-e-10/sin(1e-10) 每当 e == 1e-10 时?
  • 我修改后的函数在这些方面是否正确?
猜你喜欢
  • 2018-05-19
  • 2014-01-06
  • 2016-01-12
  • 2012-10-19
  • 2016-05-05
  • 2018-05-20
  • 1970-01-01
  • 2017-12-04
  • 1970-01-01
相关资源
最近更新 更多